关闭

CC2640之OAD扩充ImageB大小到44KB

标签: CC2640CC26xxOADImageB扩展
2170人阅读 评论(0) 收藏 举报
分类:

OAD配置对内置Flash的划分


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



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



注意:整过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工程,打开之后显示如下:



点击下方的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文件。




测试出现的问题


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


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



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

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





0
0
查看评论

吐槽TI的失败设计—cc2640的oad

说到ble芯片,初学者最希望从ti学起,因为ti的资料最多最开放,尤其是cc2541,,算是一款很成功的ble芯片,至于说到第二代的cc2640,出来也已经有一年半了,我是从量产之前就拿到样片了,所以算是接触的比较早的,当然由于资料匮乏,也没有前车之鉴,所以遇到了很多困难,但是经过努力研究,公司产品...
  • gyb510
  • gyb510
  • 2016-04-19 23:28
  • 3314

CC2640之OAD固件升级(内置Flash)

本文介绍了OAD的内容,以及ImageA和ImageB等的配置、编译和升级过程。
  • zzfenglin
  • zzfenglin
  • 2016-08-27 19:35
  • 5115

CC2640 之外部flash OAD

见到很多在做CC2640 OAD遇到问题,我也是碰到各种问题,最后成功解决了,把经验分享出来,希望对大家有所帮忙。今天主要介绍:利用PC上的软件BLE device monitor加上CC2540 USB Dongle配合来对CC2640进行OAD升级 0x01:准备     ...
  • u011863230
  • u011863230
  • 2016-12-23 09:06
  • 791

CC2640之OAD扩充ImageB大小到40KB

已经配置OAD升级功能的CC2640工程扩充ImageB大小到40KB的方法
  • zzfenglin
  • zzfenglin
  • 2016-11-23 16:55
  • 1124

CC2640R2F BLE5.0 使用CCS开发蓝牙应用

用CCS开发 安装Code Composer Studio(CCS) CCS工具链包含的许多功能超出了本文档范围。更多信息和文档可以在CCS Webpage上找到 。 检查BLE5-Stack 1.00.00发行说明,查看需要的CCS版本和任何要求的工作环境。与IAR生成的目标代码相比,CCS生...
  • leconiot
  • leconiot
  • 2017-08-03 10:52
  • 871

OAD基础知识详解(For CC2640)

一、 概念1. 缩写 BIM Boot Image Manager , the software bootloader CRC cyclic redundancy check Client Characteristic Configuration Descriptor SNV Simpl...
  • weixin_40108380
  • weixin_40108380
  • 2017-11-03 17:06
  • 169

【CC2640R2】CC2640R2F OAD 用户指导

一、OAD空中升级: 该部分是TI OAD升级系统的服务指南,内容主要包括:用户规范规格说明、应用程序架 构、驱动程序以及中间件。OAD是一种设备固件升级的方式,允许通过BLE低功耗蓝牙连接的时候更新运行在一个设备上的固件镜像,同时支持掉电保护功能。 该指南介绍了OAD过程的升级原理,Simpl...
  • u014647208
  • u014647208
  • 2017-05-24 10:44
  • 1430

CC2640R2F BLE5.0 蓝牙协议栈OAD功能问题集锦

OAD附录 本章是前面介绍OAD中的查漏补缺。 生成片外OAD链接器命令文件 本节介绍如何将标准的SDK连接器命令文件转化成符合OAD的连接器命令文件,下面以cc26xx_app_and_stack.icf为例。 分配元数据向量和应用程序起点内存。 我们期望flash范围是应用程序和协议栈代码...
  • leconiot
  • leconiot
  • 2017-08-03 09:59
  • 687

CC2640R2F BLE5.0 蓝牙协议栈Off-Chip OAD功能

Off-Chip OAD 本节描述了分离镜像的片外OAD(Split Image Off-Chip OAD)和片外OAD库(Library off-chip OAD)之间的差异。片外OAD利用一个外部的flash储存新的镜像在下载和镜像选择/更新期间。 以下处理过程是片外OAD独有的: 片外O...
  • leconiot
  • leconiot
  • 2017-08-03 10:02
  • 1078

cc2640到cc2640R2F

前言在蓝牙5协议发布之后,nordic率先推出了支持ble5.0协议的芯片nrf52840,配置之强大对于用了多年ti蓝牙芯片的我来说简直令人发指,256kram和1M flash的搭配完虐cc2640的20k+128k的组合,目前项目使用cc2640开发,由于外设很多,遭遇了flash空间不够的尴...
  • gyb510
  • gyb510
  • 2017-01-09 11:43
  • 5070
    个人资料
    • 访问:332520次
    • 积分:3135
    • 等级:
    • 排名:第13094名
    • 原创:64篇
    • 转载:0篇
    • 译文:0篇
    • 评论:83条
    文章分类
    最新评论