CC2640内置Flash的OAD配置中,对128KB Flash的划分情况如下图:
根据上图,我做了一个表格,表格截图如下:
注意:整过CC254x系列芯片的都知道,在CC254x系列芯片上1个page占2KB大小;而CC26xx系列的芯片上并不是这样,而是1个page占4KB大小,这点大家注意一下。
如果你的工程默认是没有配置ImageB编译的,那么请先按照如下链接的博文中的方法进行配置,链接如下:
CC2640之OAD固件升级(内置Flash)手动配置ImageB的方法
为了扩展ImageB的空间,我们需要压缩减少其他部分的空间,参照上表,BIM和“OAD Target App”的空间是不能动的,所以剩下的我们可以缩减的就是“NV Storage Area”和“BLE Stack”的空间了,这两部分的设置都是在编译协议栈时定义的。为了达到最大缩减,我们将BLE Stack的绑定相关功能去掉,然后去掉了“NV Storage Area”(协议栈默认该区域主要存放绑定信息)的空间,这样一共缩减了8KB的空间给ImageB,ImageB的空间就由原来的36KB变成最后的44KB了。
下面,我们来看一下具体的操作步骤:
1.BLE Stack的配置
(1)先打开IAR开发工具,然后将
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR”
目录下的“OADTarget.eww”拖到IAR的左侧工作区,打开“OADTarget”工程,打开之后显示如下:
点击下方的“CC2640Stack”,选择“CC2640Stack”工程配置。
(2)左侧工作区选择“TOOLS”文件夹,找到“buildConfig.opt”文件,双击打开,然后在右侧出现的文件内容区域搜索“–DGAP_BOND_MGR”,找到之后屏蔽所在的行,取消“GAP Bond”的定义,操作显示如下:
(3)在左侧工作区的工程名“CC2640Stack - FlashROM”上点击鼠标右键,下拉菜单中选择“Options...”,弹出如下对话框:
首先,选择“C/C++ Compliler”---->“Preprocessor”,在下面的“Defined symbols:”中将SNV定义的宏
OSAL_SNV=1
修改为:
xOSAL_SNV=1
NO_OSAL_SNV
操作截图如下:
其次,选择“Linker”---->“Config”,在“Configuration file symbol definitions:”中,将“ICALL_STACK0_ADDR”的值由“0xF000”改为“0x11000”,操作截图如下:
上述配置完成之后点击“OK”,然后重新编译“BLE Stack”。
2.OAD Target App(Image A) project的配置
先打开IAR开发工具,然后将
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\OADTarget\CC26xx\IAR”
目录下的“OADTarget.eww”拖到IAR的左侧工作区,打开“OADTarget”工程,切换到“CC2640App”工程配置,操作截图如下:
在左侧工作区工程名“CC2640App-FlashROM”上点击鼠标右键,然后在下拉菜单中选择“Options...”,弹出工程配置对话框。
(1)选择“C/C++ Compiler”---->“Preprocessor”,在下面的“Defined symbols:”修改如下值:
ICALL_STACK0_ADDR=0x11000
OAD_IMG_B_AREA=11
操作截图如下:
(2)选择“Build Actions”,修改“Post-build command line:”下方命令中最后的地址:
:F000:1EFFF
改为:
:11000:1EFFF
操作截图如下:
3.Application(Image B) project
承接之前的博文,我们依然用“Heart Rate”工程为例,用IAR打开该工程。在左侧工作区工程名“CC2640App-FlashOnly_OAD_ImgB”上点击鼠标右键,在下拉菜单中选择“Options...”,然后进行如下配置:
(1)选择“C/C++ Compiler”---->“Preprocessor”,在下面的“Defined symbols:”修改如下值:
ICALL_STACK0_ADDR=0x11000
OAD_IMG_B_AREA=11
操作截图如下:
(2)选择“Linker”---->“Checksum”,修改End address 由原来的“0xEFFF”改为“0x10FFF”,操作截图如下:
(3)选择“Build Actions”,修改“Post-build command line:”下方命令中的
"6000:EFFF"
改为
"6000:10FFF"
操作截图如下:
(4)配置之后,点击“OK”,然后重新编译,会出现以下两种情况:
第一种情况:如果实际占用的Flash的大小没有超过36KB,就会在
“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\HeartRate\CC26xx\IAR\
Application\CC2640\FlashOnly_OAD_ImgB\Exe”目录下生成44KB大小的“OADbin.bin”文件,这个文件可以成功升级并正常工作。
第二种情况:如果实际占用的Flash的大小超过了36KB,这个时候会提示如下截图的错误:
错误提示的意思是我们申请了44KB的Flash空间,但是实际可用的是36KB,奇怪了,我们前面配置了半天就是为了扩展ImageB的大小到44KB,而且第一种情况下可以编译出44KB的文件。出现这种问题的解释是:第一种情况虽然编译成功并生成了44KB的文件,但是实际只使用了36KB的Flash,而第二种情况就将问题暴露出来了。
该问题的解决办法是修改编译链接的配置文件“cc26xx_ble_app_oad.icf”,修改下面截图中相应地方:
将上述截图中的“0x8FFF”修改为“0xAFFF”,修改之后的截图如下:
这样,重新编译生成的bin文件才是真正扩展之后的ImageB的bin文件。
配置完成并且编译成功之后,我们按照另一篇博文的描述过程进行升级测试,博文链接如下:
测试通过PC端的BLE Device Monitor工具进行升级,升级完成之后,重启设备,发现搜索不到升级之后的设备。
碰到该问题之后,首先将升级之后的设备的Flash中ImageB所占地址的数据读出来存到一个文件中,然后与编译的ImageB的bin文件进行比较,发现除了开头的校验位不一致外(编译的文件开头是“42 7B FF FF”,而从Flash中读出来的是“42 7B 42 7B”,这个是正常的,后面两个字节是升级之后写入的,所以编译出来的文件是“FF FF”),其他数据完全一致,这就说明升级过程的数据传递是没有问题,那问题肯定是在编译ImageB的时候配置文件有不对的地方。
对照官方提供的OAD文档,反复确认需要配置的地方之后,发现并没有遗漏,见鬼了,问题出在哪呢?反复思考,然后通过仿真发现ImageB执行到了,也就是最终的应用层APP是执行了,但是没有广播,怀疑协议栈没有链接对,重新查看“HeartRate”工程“CC2640App”的配置,发现了一个地方,截图如下:
从上图中,我们看到执行了如下命令:
-f $PROJ_DIR$\..\..\Config\IAR-Boundary.bdef
“IAR-Boundary.bdef”文件的内容截图如下:
问题就出在这,按照官方文档,我们在“3.Application(Image B) project”配置的时候是在如下截图中的地方进行配置的:
而“IAR-Boundary.bdef”文件中配置的“ICALL_STACK0_ADDR”是修改前默认的,所以我们在上图中的修改没有起作用,这也就导致了我们前面遇到的问题。这个问题在TI协议栈的有些Demo工程中不一定会碰到,因为有些Demo工程并没有使用“IAR-Boundary.bdef”文件中的配置来定义协议栈的地址,搞不懂TI为什么在不同的工程中要进行这种不同的配置,而我很幸运的选择了一个会暴漏此问题的工程,真是幸运啊,希望大家不要再踩这个坑了。
既然问题原因找到了,那下面我们来看一下解决方法,有两种:
1.修改“IAR-Boundary.bdef”文件,将其中的地址改为
-D ICALL_STACK0_ADDR=0x00011000
2.不修改“IAR-Boundary.bdef”文件,直接删掉工程配置中的
“-f $PROJ_DIR$\..\..\Config\IAR-Boundary.bdef”
命令,让我们在“Preprocessor”中的配置生效。
两种解决方法的区别:前者修改的是工程加载的文件,所以修改该文件,“HeartRate”的其他配置的工程只要加载该文件的,都会受影响。后者是针对ImageB配置的工程进行修改的,不会影响“HeartRate”其他配置的工程。至于选哪种,根据自己的情况来定即可。
题外话
对于实际项目来说,我个人觉得绑定功能很多时候还是需要的,而且“NV Storage Area”有时候也需要用来存放别的数据,所以除非你的ImageB确实需要44KB的空间,否则,个人建议还是保留“NV Storage Area”区域的空间,然后扩展ImageB到40KB,一般情况下,这个大小足够用了。至于扩展ImageB到40KB的方法,我们只需要将绑定部分和“NV Storage Area”区域保留,然后参照上面地址的修改进行相应的修改即可,相信大家可以自行配置出来,此处不再啰嗦了。