最近在NXP官网上看到了,使用JN51X内部flash存储两个app,然后选择一个合适的app运行,突发奇想,应该可以实现在线升级的功能,再进一步优化,直接实现OTA功能。
官网的例程链接
https://www.nxp.com/cn/products/wireless/proprietary-ieee-802.15.4-based/support-resources-for-jn516x-mcus:SUPPORT-RESOURCES-JN516X-MCUS
JN=AN-1218里面的Doc有一个比较详细的操作文档,大概的意思就是,把JN-AN-1228Updated LD filesJN5169Build里面的一个叫AppBuildStart.ld的文件替换正在使用的SDK包的文件,目前以我使用的是JN-SW-4163为例bstudio_nxpsdkJN-SW-4163ChipJN5169Build 里面AppBuildStart.ld。
现在把工程加载到BeyondStdio开发环境里面,注意要把makefile文件修改一下,官网下载的直接是N-SW-4168,我们需要改成JN-SW-4163,然后选择JN5169编译下,如图:
如果编译不成功,说是有一个什么stack_size的没有定义,那就比较悲剧了,应该是开发环境没有配置好。好像先可以使用zigbee3.0的greenpower的例程编译后,就可以了,具体我也不太记得了。这里有一个可以编译通过的环境链接:
链接:https://pan.baidu.com/s/11EgsJUv43ZS8RIe1CHGYuQ
提取码:gzwm
-----------------------------------------------------------------------分割符号----------------------------------------------------------------------------------
说明环境配置是没有问题的了。
浏览程序之后你就会发现一个传说中的魔法字。
uint8 au8MagicBytes[16] = {
0x12, 0x34, 0x56, 0x78,
0x11, 0x22, 0x33, 0x44,
0x55, 0x66, 0x77, 0x88,
0x08, 0x01,
0x00, 0x00}; //这个是appID 就是根据这个调转的
这就是重中之重,在官方固化在JN5169的代码里面就是依靠这些来区别(在每一sector的开头12字节符合的话则说明这是一个app),flash是否存在一个可执行的app。上一个图
遗憾的是,官方并不把一些资料开源。但幸运的时我们可以载这例程序找到2个重要的函数
u32REG_SysRead(REG_SYS_FLASH_REMAP); //获取flash映射表
vLoadBootImage(uint32 u32AppId)//选择想要执行的app程序
JN5169里面一个有16个Sector,一个32k,一共刚好512k。这里请忽视该例程使用的指针直接获取flash里面的值。我们使用JN-UG-3087-JN516x Integrated Peripherals API 文档里面的。有关于flash的API。
这里比较有意思的是,官方的bool代码在调用vLoadBootImage()函数执行别的app时,它会把那个app映射到对应的Sector里面。这样映射的块可以通过 u32REG_SysRead 来知道正常的情况是这样的0x76543210。如果现在运行了在sector10的60k的代码就变成了0x765432ba;(就是把在运行的app的sector放到最前面去)。
了解这些之后,我们要实现在线升级就变得有理有据了。
目前我的做法是把flash 分部分0---4,5----9 ,10---14 ,15。0---4烧录一个自己写的bool,这个bool里面主要实现串口和无线的初始化,以及在运行之前检查flash内存在几个app,然后选择一个最高的appID执行。15的sector目前使用来充当日志表。
-----------------------------------------------------------------------分割符号----------------------------------------------------------------------------------
现在还差一个问题,要把什么样的东西能烤到块里面并且能正常运行呢?
其实只要把我们的开发环境里面生成的.bin文件,用二进制打开,然后把前面2字节删除,就会发现后面就是 0x12, 0x34, 0x56, 0x78, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,0x88 0x08, 0x01,
0x00, 0x00.......,没错我们只需要直接把它烧录到flash里面就是一个有效的能运行的app。注意appID不能一样。
具体怎么才能把这个.bin文件拷贝到flash里面呢?这里可以提供两种方法:使用Uart或者RF,只要定义好通信的方式,例如发一帧,应答一帧,再发一帧即可。(可能需要一个上位机软件咯)这里推荐使用QT写一个简单的专门给JN5169升级的的串口工具
可以在我的空间搜索到哦
本人写好之后,在线升级一遍又一遍完全没有问题,ota也完全没有问题。