1.软件:
协议栈版本:BLE-STACK SDK V2.2
Python版本:Python 2.7.x (v2.7.10 or higher)
烧录软件版本:Flash Programmer 2 v1.7.4
PC端升级工具版本:BLE Device Monitor 2.5.0
IAR开发环境版本:IAR for Arm 7.80.4
示例测试Demo工程:simple_peripheral 工程
2.硬件:
CC2640开发板
对于CC2640的OAD升级有两种方式:片内和片外。二者的区别在于通过OAD下载的镜像存放的位置不同。片内OAD升级,下载的镜像被写到了芯片内部flash中存储,运行的时候也是从内部flash加载程序运行;片外OAD升级,下载的镜像被写到外部Flash中存储,一般情况下通过SPI或者I2C进行数据通信,运行的时候从外部Flash中加载程序运行。
可以通过下图,来大致了解下二者的区别:
OAD升级过程会出现一些状态反馈,较长出现的状态列表及描述如下图:
注:元数据被定义为:描述数据的数据,对数据及信息资源的描述性信息。在这个地方用来描述镜像的有关内容。
对于外部Flash OAD升级的地址划分情况如下图所示:
接下来,我们具体来看一下编译和升级步骤:
这部分属于BootLoader,引导程序的运行。对于该部分,有个宏定义需要介绍一下,就是“NO_COPY”,如果定义了该宏,那升级的板子运行的时候将忽略镜像检查,直接跳转到片内Flash的镜像中运行,这种情况大多在外部Flash存储的镜像出现问题时修复设备时使用,可以让设备直接跳转到片内Flash的镜像运行,然后重新升级外部Flash中的镜像,进而解决问题;如果没有定义该宏,设备启动的时候将会按照下面截图中的流程图来运行:
1.用IAR工具打开外部Flash的BIM工程,我的协议栈是安装在E盘,所以IAR工程文件位于“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\util\bim_extflash\cc2640\iar”目录下,将“bim_extflash.eww”工程文件拉到打开的IAR开发工具的左侧工作区即可打开工程。
2.切换工程配置,选择“FlashOnly_LP”,选择之后的截图显示如下:
3.在工程名上点击鼠标右键,下拉菜单中选择“Options...”,打开工程配置界面,选择“C/C++ Compiler”--->“Preprocessor”,确定“Defined symbols:”中的“NO_COPY”未定义,也就是前面加个“x”,关于此处修改的原因在前面已经说明过了。
4.配置SPI引脚,默认simple_peripheral工程是通过SPI与外部Flash通信的,相应的SPI通信接口都已经添加配置好了(当然也可以配置其他通信方式,比如I2C,如果选择这种通信方式,需要自行研究下配置)。根据自己手头开发板或者产品板的原理图,配置SPI通信的四个引脚,代码工程中修改的文件为
“E:\ti\simplelink\ble_sdk_2_02_01_18\src\examples\util\bim_extflash\cc2640\board\cc2650lp\bsp.h”,修改的地方截图显示如下:
注意:如果修改的引脚在上面有重复的,比如你的板子上“BSP_IOID_FLASH_CS”接的是“IOID_6”,而这个时候原本定义为这个引脚的“BSP_IOID_LED_1”硬件上没有使用,那这个时候需要将“BSP_IOID_LED_1”定义为“PIN_UNASSIGNED”。一定要避免引脚重复定义。
5.配置外部Flash的型号,SDK中的示例工程中默认是配置了4种Flash型号,截图显示如下:
默认支持这4种型号的Flash,如果你的Flash型号不在这四种内,那需要将你的Flash的型号等信息填写到这个数组中,那我们如何知道自己所用Flash的信息呢?有下面两种方法可供选择:
第一种:查询所用Flash的datasheet文档。
打开所用Flash的datasheet,搜索“Device ID”,我们可以找到如下截图的信息:
上面截图是我所用Flash的信息,不同型号版本的都不一样,以自己所用Flash的datasheet为准。
第二种:将软件烧录进去通过仿真调试,来看我们读到的外部Flash的信息。
“ext_flash.c”文件中有一个读取外部Flash信息的方法“extFlashReadInfo”,我们只需要在这个方法执行完成的地方加个断点即可,将BIM通过IAR直接烧录到开发板中并仿真,操作截图显示如下:
这样,我们就读取到了外部Flash的信息并存储在infoBuf数组中,看下下面的代码:
/**
* Verify the flash part.
* @return True when successful.
*/
static bool extFlashVerifyPart(void)
{
if (!extFlashReadInfo())
{
return false;
}
pFlashInfo = flashInfo;
while (pFlashInfo->deviceSize > 0)
{
if (infoBuf[0] == pFlashInfo->manfId && infoBuf[1] == pFlashInfo->devId)
{
break;
}
pFlashInfo++;
}
return pFlashInfo->deviceSize > 0;
}
上面的代码是将读取的Flash信息与本身支持的Flash比对,从比对的顺序我们可以知道,前面我们读到的infoBuf数组的第一个元素就是Flash的manfId,而第二个元素就是devId,所以将我们自己查到的Flash信息添加到“flashInfo”数组中即可,参照已有的进行添加就行,然后重新编译BIM即可。
将“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar”
目录下的“simple_peripheral.eww”工程配置文件拉到打开的IAR工作区的左侧,打开工程,选择“cc2650lp_stack”,然后直接编译工程即可,协议栈部分不需要修改。
1.将“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar”
目录下的“simple_peripheral.eww”工程配置文件拉到打开的IAR工作区的左侧,打开工程,选择“cc2650lp_app”。
2.点击IAR左侧工作区上面的工程配置显示的地方,会出现下拉菜单,操作过程截图显示如下:
在下拉菜单中选择“FlashOnly_OAD_ExtFlash”,操作之后显示截图如下:
3.修改应用部分的SPI引脚配置,根据你的开发板或者产品板的原理图,修改软件工程中SPI引脚的配置,修改的地方位于
“E:\ti\simplelink\ble_sdk_2_02_01_18\src\boards\CC2650_LAUNCHXL”
目录下的“CC2650_LAUNCHXL.h”文件,操作过程截图显示如下:
这个地方注意一点:不要将“Board_SPI0_CSN”定义成“Board_SPI_FLASH_CS”所对应的引脚,如上图中定义成“PIN_UNASSIGNED”即可。
4.因为默认支持的外部Flash只有4种,所以如果你所使用的Falsh不在默认支持的范围内,就需要自己在工程中添加,对于你所使用的Flash的信息在配置BIM的时候已经获取了,我们直接在App的工程中添加相应信息即可,添加的位置在
“C:\ti\tirtos_cc13xx_cc26xx_2_20_01_08\products\tidrivers_cc13xx_cc26xx_2_20_01_10\packages\ti\mw\extflash”目录下的“ExtFlash.c”文件中,将前面获取的Flash的信息添加到该文件的“flashInfo”数组中,格式参照已有的即可。
注意:App中flashInfo数组的数据定义跟BIM中flashInfo数组是不一样的,虽然不影响使用,但是为了便于阅读,最好跟既有的定义保持一致。
5.配置完成之后,编译即可。
打开“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar\app”目录,会看到“merge.bat”脚本,双击该脚本,运行结果显示如下:
(注意:如果你的电脑上没有安装Python,请见Python安装步骤)
就会在当前目录的“FlashOnly_OAD_ExtFlash\Exe”目录下生成三合一的hex文件“simple_peripheral_cc2650lp_all”,截图显示如下:
打开 Flash Programmer 2 工具,选择我们前面编译生成的“simple_peripheral_cc2650lp_all”文件,操作过程截图显示如下:
1.打开电脑上的BLE Device Monitor工具,如果你没有安装,或者版本过低,可以到TI官网或者从下面链接中下载安装程序:
http://download.csdn.net/detail/zzfenglin/9856357打开之后点击“Scan”,会看到我们刚烧录“simple_peripheral_cc2650lp_all”文件的设备信息,截图显示如下:
2.点击“Connect”连接设备,然后点击左上角的“File”,下拉菜单中选择“Program(OAD)”,操作过程截图显示如下:
点击之后,会弹出升级模式选择提示框,截图显示如下:
3.点击“Off-chip OAD”,进入片外OAD升级界面,截图显示如下:
4.点击“Add Flash Image(s)”下方输入框旁边的“Browse...”,选择要升级的App或者App+Stack的hex文件,Image Type类型根据需要选择,因为升级文件我选择的App的hex,所以Image Type我选择的是“1:Application”,选完之后,“New Flash Image”下面会显示所选镜像的信息,点击“Program”下方的“Start”开始升级,配置及升级过程显示截图如下:
5.升级成功之后,需要复位下设备或者断电重启,就可以运行我们刚升级的固件了。
下面罗列一下升级过程中出现的一些问题以及说明:
1.连接设备选择要升级的固件之后,没有“Start”按钮,现象截图如下:
没有升级开始的按钮,这个问题出现在win7的笔记本上,而台式机上不会出现此问题,目前笔记本上的这个问题暂时没有找到解决办法,如果哪位网友知道的话,欢迎留言告诉我,多谢!
感谢网友的分享,目前笔记本上的这个问题可以通过快捷键旋转笔记本屏幕的显示来暂时解决。相信后期的Ble Device Monitor工具会解决此bug。
2.连接成功点“Start”开始升级的时候,提示“OAD flash error...”,现象截图如下:
原因分析:从上面截图的现象,以及前面讲过的OAD升级状态码,我们可以知道这个错误提示的原因是Flash打开失败,需要排查一下SPI引脚配置或者所用Flash型号是否在软件工程中配置添加过。