CC2640之OAD扩充ImageB大小到44KB

OAD配置对内置Flash的划分


CC2640内置Flash的OAD配置中,对128KB Flash的划分情况如下图:

CC2640之OAD扩充ImageB大小到44KB_第1张图片


根据上图,我做了一个表格,表格截图如下:

CC2640之OAD扩充ImageB大小到44KB_第2张图片


注意:整过CC254x系列芯片的都知道,在CC254x系列芯片上1个page占2KB大小;而CC26xx系列的芯片上并不是这样,而是1个page占4KB大小,这点大家注意一下。




重新分配地址


如果你的工程默认是没有配置ImageB编译的,那么请先按照如下链接的博文中的方法进行配置,链接如下:

CC2640之OAD固件升级(内置Flash)手动配置ImageB的方法


为了扩展ImageB的空间,我们需要压缩减少其他部分的空间,参照上表,BIMOAD Target App的空间是不能动的,所以剩下的我们可以缩减的就是NV Storage AreaBLE Stack的空间了,这两部分的设置都是在编译协议栈时定义的。为了达到最大缩减,我们将BLE Stack的绑定相关功能去掉,然后去掉了NV Storage Area(协议栈默认该区域主要存放绑定信息)的空间,这样一共缩减了8KB的空间给ImageBImageB的空间就由原来的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工程,打开之后显示如下:

CC2640之OAD扩充ImageB大小到44KB_第3张图片


点击下方的CC2640Stack,选择CC2640Stack工程配置。


(2)左侧工作区选择TOOLS文件夹,找到buildConfig.opt文件,双击打开,然后在右侧出现的文件内容区域搜索–DGAP_BOND_MGR,找到之后屏蔽所在的行,取消GAP Bond的定义,操作显示如下:

CC2640之OAD扩充ImageB大小到44KB_第4张图片


(3)在左侧工作区的工程名CC2640Stack - FlashROM上点击鼠标右键,下拉菜单中选择Options...,弹出如下对话框:

CC2640之OAD扩充ImageB大小到44KB_第5张图片


首先,选择C/C++ Compliler---->Preprocessor,在下面的Defined symbols:中将SNV定义的宏

OSAL_SNV=1

修改为:

xOSAL_SNV=1
NO_OSAL_SNV

操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第6张图片

其次,选择Linker---->Config,在Configuration file symbol definitions:中,将ICALL_STACK0_ADDR的值由0xF000改为0x11000,操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第7张图片


上述配置完成之后点击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工程配置,操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第8张图片


在左侧工作区工程名CC2640App-FlashROM上点击鼠标右键,然后在下拉菜单中选择Options...,弹出工程配置对话框。

(1)选择C/C++ Compiler---->Preprocessor,在下面的Defined symbols:修改如下值:

ICALL_STACK0_ADDR=0x11000
OAD_IMG_B_AREA=11

操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第9张图片

2选择Build Actions,修改Post-build command line:下方命令中最后的地址:

:F000:1EFFF

改为:

:11000:1EFFF 


操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第10张图片


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

操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第11张图片

(2)选择Linker---->Checksum,修改End address 由原来的0xEFFF改为0x10FFF,操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第12张图片


(3)选择Build Actions,修改Post-build command line:下方命令中的

"6000:EFFF"

改为

"6000:10FFF"


操作截图如下:

CC2640之OAD扩充ImageB大小到44KB_第13张图片


(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,这个时候会提示如下截图的错误:

CC2640之OAD扩充ImageB大小到44KB_第14张图片


错误提示的意思是我们申请了44KB的Flash空间,但是实际可用的是36KB,奇怪了,我们前面配置了半天就是为了扩展ImageB的大小到44KB,而且第一种情况下可以编译出44KB的文件。出现这种问题的解释是:第一种情况虽然编译成功并生成了44KB的文件,但是实际只使用了36KB的Flash,而第二种情况就将问题暴露出来了。

 

该问题的解决办法是修改编译链接的配置文件cc26xx_ble_app_oad.icf,修改下面截图中相应地方:

CC2640之OAD扩充ImageB大小到44KB_第15张图片


将上述截图中的0x8FFF修改为0xAFFF,修改之后的截图如下:

CC2640之OAD扩充ImageB大小到44KB_第16张图片


这样,重新编译生成的bin文件才是真正扩展之后的ImageB的bin文件。




测试出现的问题


配置完成并且编译成功之后,我们按照另一篇博文的描述过程进行升级测试,博文链接如下:


http://blog.csdn.net/zzfenglin/article/details/52336612


测试通过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的配置,发现了一个地方,截图如下:

CC2640之OAD扩充ImageB大小到44KB_第17张图片


从上图中,我们看到执行了如下命令:

-f $PROJ_DIR$\..\..\Config\IAR-Boundary.bdef


IAR-Boundary.bdef文件的内容截图如下:

CC2640之OAD扩充ImageB大小到44KB_第18张图片

问题就出在这,按照官方文档,我们在3.Application(Image B) project配置的时候是在如下截图中的地方进行配置的:

CC2640之OAD扩充ImageB大小到44KB_第19张图片


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区域保留,然后参照上面地址的修改进行相应的修改即可,相信大家可以自行配置出来,此处不再啰嗦了。





你可能感兴趣的:(CC26xx-OAD)