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

转至zzfenglin的博客。

实验环境

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开发板

OAD升级方式

对于CC2640的OAD升级有两种方式:片内和片外。二者的区别在于通过OAD下载的镜像存放的位置不同。片内OAD升级,下载的镜像被写到了芯片内部flash中存储,运行的时候也是从内部flash加载程序运行;片外OAD升级,下载的镜像被写到外部Flash中存储,一般情况下通过SPI或者I2C进行数据通信,运行的时候从外部Flash中加载程序运行。

可以通过下图,来大致了解下二者的区别:

OAD状态码

OAD升级过程会出现一些状态反馈,较长出现的状态列表及描述如下图:

注:元数据被定义为:描述数据的数据,对数据及信息资源的描述性信息。在这个地方用来描述镜像的有关内容。

OAD升级步骤

对于外部Flash OAD升级的地址划分情况如下图所示:

接下来,我们具体来看一下编译和升级步骤:

BIM

BIM介绍

这部分属于BootLoader,引导程序的运行。对于该部分,有个宏定义需要介绍一下,就是“NO_COPY”,如果定义了该宏,那升级的板子运行的时候将忽略镜像检查,直接跳转到片内Flash的镜像中运行,这种情况大多在外部Flash存储的镜像出现问题时修复设备时使用,可以让设备直接跳转到片内Flash的镜像运行,然后重新升级外部Flash中的镜像,进而解决问题;如果没有定义该宏,设备启动的时候将会按照下面截图中的流程图来运行:

编译BIM

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数组中,看下下面的代码:

  1. /**
  2. * Verify the flash part.
  3. * @return True when successful.
  4. */
  5. static bool extFlashVerifyPart(void)
  6. {
  7. if (!extFlashReadInfo())
  8. {
  9. return false;
  10. }
  11. pFlashInfo = flashInfo;
  12. while (pFlashInfo->deviceSize > 0)
  13. {
  14. if (infoBuf[0] == pFlashInfo->manfId && infoBuf[1] == pFlashInfo->devId)
  15. {
  16. break;
  17. }
  18. pFlashInfo++;
  19. }
  20. return pFlashInfo->deviceSize > 0;
  21. }

上面的代码是将读取的Flash信息与本身支持的Flash比对,从比对的顺序我们可以知道,前面我们读到的infoBuf数组的第一个元素就是Flash的manfId,而第二个元素就是devId,所以将我们自己查到的Flash信息添加到“flashInfo”数组中即可,参照已有的进行添加就行,然后重新编译BIM即可。

BLE STACK

将“E:\ti\simplelink\ble_sdk_2_02_01_18\examples\cc2650lp\simple_peripheral\iar”

目录下的“simple_peripheral.eww”工程配置文件拉到打开的IAR工作区的左侧,打开工程,选择“cc2650lp_stack”,然后直接编译工程即可,协议栈部分不需要修改。

Application

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.配置完成之后,编译即可。

生成BIM+Stack+App的hex文件

打开“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”,截图显示如下:

烧录三合一Hex文件

打开 Flash Programmer 2 工具,选择我们前面编译生成的“simple_peripheral_cc2650lp_all”文件,操作过程截图显示如下:

OAD off-chip升级

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型号是否在软件工程中配置添加过。

CC2640之OAD固件升级实操(使用外部Flash)相关推荐

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

    转自:http://blog.csdn.net/zzfenglin/article/details/52336612 什么是OAD OAD是TI在BLE协议栈基础上扩展的一种无线更新技术.OAD使用客 ...

  2. CC2640之OAD固件升级及合并方法

    文章转自https://blog.csdn.net/zzfenglin/article/details/52336612#comments 经过原文作者同意后转载 什么是OAD OAD是TI在BLE协 ...

  3. CC2640之OAD固件升级(外置Flash)

    实验环境 1.软件: 协议栈版本:BLE-STACK SDK V2.2 Python版本:Python 2.7.x (v2.7.10 or higher) 烧录软件版本:Flash Programme ...

  4. 【Social listening实操】作为一个合格的“增长黑客”,你还得重视外部数据的分析!

    本文转自知乎 作者:苏格兰折耳喵 ----------------------------------------------------- 在本文中,作者引出了"外部数据"这一概 ...

  5. CC2640 之外部flash OAD

    见到很多在做CC2640 OAD遇到问题,我也是碰到各种问题,最后成功解决了,把经验分享出来,希望对大家有所帮忙.今天主要介绍:利用PC上的软件BLE device monitor加上CC2540 U ...

  6. 作为产品经理,你需要了解的基本算法知识和实操

    https://blog.csdn.net/Amydom/article/details/78404659 今日头条的走红带动了"个性化推荐"的概念,自此之后,内容型的产品,个性化 ...

  7. 可编程CDN – EdgeScript应用场景、语言速览和实操演示

    5月8日下午15:00,CDN云课堂的第二期,阿里云CDN团队技术专家拓山为大家带来了<可编程CDN – EdgeScript实践>主题技术分享.本次分享通过对阿里云CDN成长到当前体量的 ...

  8. 一篇文章带你快速入门JavaScript(实操代码)

    目录 一.前提简介 1.1什么是JavaScript 1.2JavaScript和Java语言的区别 1.3Html.Css和Javascript 1.4Javascript作用 二.实操代码 2.1 ...

  9. istio多集群链路追踪,附实操视频

    理论篇 什么是可观测性 这里的可观察性主要指服务网格的可观察性,也就是需要观测服务网格中运行的微服务.为什么可观察性很重要,因为随着微服务架构的流行,一个系统可能运行成百上千微服务,如果系统出现故障, ...

最新文章

  1. 跨平台PHP调试器设计及使用方法——界面设计和实现
  2. VMware ESXi 6.7安装配置
  3. java recv failed,jmeter压测报错Unrecognized Windows Sockets error: 0: recv failed
  4. Delphi 按Esc快捷键退出程序的简单方法
  5. Spring Boot基础学习笔记24:RabbitMQ安装以及整合环境搭建
  6. 建自己的小屋真辛苦啊?!·##¥
  7. In addition, Clem also revealed that they have
  8. [20180626]函数与标量子查询14.txt
  9. 检测到在集成的托管管道模式下不适用的ASP.NET设置的解决方法
  10. echarts拖拽echarts实现多条可拖动节点的折线图
  11. 用C语言学习高中数学:补集
  12. 淘宝闲鱼京东等电商api的简单调用
  13. Vision.CascadeObjectDetector-VJ算法学习
  14. 大学计算机基础知识判断题,大学计算机基础知识考试试题及答案
  15. acer计算机的无线功能键,Acer笔记本Fn组合键功能说明
  16. Java之环境变量配置
  17. import 出现 Illegal instruction错误
  18. 特斯拉数字车钥匙卡评价
  19. 江苏省邮电规划设计院有限责任公司(10.30)
  20. 1N4148、1N5819、1N4007的区别

热门文章

  1. 008:vue+openlayers加载6种形式google地图(代码示例)
  2. 聚合物锂电池使用注意事项
  3. Python爬取京东评论(汇编)
  4. TFTP协议报文过防火墙不通
  5. FPGA高速数据采集设计JESD204B接口
  6. 别再问我MySQL为啥没走索引?就这几种原因,全都告诉你
  7. 惠普服务器bios里如何修改ip,服务器bios设置ip
  8. C#在生成文件路径时去除特殊字符
  9. java 百鸡_Java实现百钱买百鸡
  10. matlab 创建简单的深度学习网络用于分类