作者: TI 技术应用工程师Holly Gu, Robin Yu
CC2640 R2是德州仪器推出的面向 Bluetooth Smart 应用的低功耗无线 MCU。该芯片运行TI的BLE协议栈,具有功耗低,外设种类丰富,射频性能好等特点。利用它可以实现许多有趣的应用,收到了用户的广泛欢迎。
可是很多用户在量产的时候却犯难了,用XDS110 + Flash Programmer 2,效率很低,还要在GUI上各种配置,产线工人操作起来十分困难而且容易失误。买一拖多的编程器配上位机,又舍不得口袋里的银子,而且不是TI官方出品,稳定性和可靠性难以得到保证。本文给大家介绍一种利用芯片内部Bootloader烧写程序的方法,进入Boot模式,用普通的串行接口就可以进行固件的引导,FLASH的擦写,Program,不花费额外成本。 而且这个bootloader是放在ROM里的,不会被误擦除, Boot的时候UART/SPI不断就没事,实在不行load一半断了也无伤大雅,再boot一次就好了,即快捷又安全。
我们来看一下CC2640R2的Bootloader是怎么Run的。CC13x0, CC26x0 SimpleLink Wireless MCU Technical Reference Manual(SWCU117H)第8章节Bootloader中详细介绍了Bootloader的原理,功能,接口定义,包的组成,校验等等,内容很多,容易犯困,现在来画一下重点。
- 第一个常见的问题是什么情况下会进Bootloader,进Bootloader会不会影响应用程序的执行?如果使能了Bootloader,有两种情况下会进,第一种情况是一个FLASH里没有任何镜像的新芯片在上电后;第二种情况是开启了Bootloader backdoor,并且预先定义的backdoor PIN脚被设置到正确的逻辑电平。上述条件不满足,在上电后,芯片优先执行应用程序。所以Bootloader和应用程序执行的条件不同,所以并不会相互影响。
- 第二个常见的问题是什么是Bootloader backdoor?实际上就是为芯片进入Bootloader留的一个后门。用户可以通过BL_CONFIG寄存器的BL_ENABLE位使能这个backdoor,并预设某个GPIO在某个电平的时候启用这个Backdoor,在Reset的时候,芯片内部会自动检测预设条件是否满足,来决定是否进入Bootloader模式。如图1所示,BL_CONFIG是实现Bootloader最重要的寄存器,我们后面在讲代码时会参照这个寄存器,其说明在SWCU117H也可以找到。
图 1. BL_CONFIG寄存器说明
- 第三个常见的问题也是容易犯的错误是是不是CC2640R2的所有接口和PIN脚都支持Bootloader? 答案是否定的。CC2640R2的Bootloader只支持两种接口,UART和SSI,而且仅有UART0 和 SSI0 支持,不同封装的芯片对应的引脚也有差别,如图2所示,使用时要特别注意。
图 2. CC2640R2 Bootloader接口定义
对于UART0来说,我们芯片理论上可以达到3Mbaud(48M/16)的最大波特率,但是片内ROM中的Bootloader固件只支持1.6Mbaud。SSI0是Motorolar格式的,SPH=1,SPO=1,SSI0时钟最快频率是4Mbaud(48M/12)。不过一味追求接口的速率也没有必要,毕竟下载程序的速率瓶颈在FLASH的读写速度。
其实要点就这么多,很简单吧。很多用户会有疑问是不是要把TI规定的协议搞得很透才能实现Bootloader?当然不是,TI工程师的使命就是把复杂的问题变得简单,只要把配置搞对,配上正确的上位机,一秒上手不是难事。下面就以UART为例详细跟大伙说说Bootloader在CC2640R2上是怎么实现的。
工欲善其事,必先利其器,请准备好下面的IDE环境,蓝牙协议栈和硬件平台。插播一条广告,LAUNCHXL-CC2640R2的demo板可以在TI的estore上购买。https://store.ti.com/LAUNCHXL-CC2640R2-CC2640R2-LaunchPad-P51441.aspx
IDE环境 |
IAR 8.11.2 |
蓝牙协议栈版本 |
1_50_00_58 |
硬件平台 |
LAUNCHXL-CC2640R2 |
工程文件 |
simplelink_cc2640r2_sdk_1_50_00_58\examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral |
上位机软件 |
sblAppEx.exe |
仿真器 |
LAUNCHPAD板载XDS110 |
值得一提的是,sblAppEx.exe 是TI专门为CC2640R2实现Bootloader开发的工具,并向客户开放源码,可以基于此二次开发,下载地址:http://www.ti.com/lit/zip/swra466。
首先,我们需要修改一下Bootloader的设置,在source\ti\devices\cc26x0r2\startup_files里,打开ccfg.c,对几个宏定义做出配置,如下图3所示,依据则是图1的BL_CONFIG。
图 3. 修改ccfg.c中的宏定义以匹配Bootloader的要求
在这里我们用DIO15高电平作为Bootloader backdoor的敲门砖,当然也可以根据用户实际需要选择相应的DIO。配置好后,点击IAR的编译下载按钮,就可以在simple_peripheral\tirtos\iar\app\FlashROM_StackLibrary\Exe里看到刚刚编译好的带Bootloader功能的镜像文件,我们需要的是.bin结尾的,如图4所示。
图 4. 编译生成的不同格式的镜像文件
将生成的.bin文件复制到sblAppEx.exe所在根目录下,即sblAppEx_1_02_00_00\bin。由于sblAppEx.exe自动识别的是blinky_backdoor_select_btn2650.bin,所以需要把刚生成的ble_simple_peripheral_cc2640r2lp_app_FlashROM_StackLibrary.bin改个名字。当然了,也可以通过修改sblAppEx.exe的源码识别用户所需的.bin,此处不再赘述。然后,按如下步骤操作:
1) DIO15接成高电平。
2) RESET。重新上电或者按LAUNCHPAD的RESET按钮均可。
3) 在DOS界面选择0,即XDS110 Class Application/User UART <COM56>,回车。不同电脑可能会识别不同的串口号,这个无关紧要。
如果设置都正确的话Bootloader开始工作,经过Erasing flash,Writing flash,Calculating CRC on device,Comparing CRC这一系列过程后,Bootloader更新程序就完成了,最后系统会Reset device,整个流程如图5所示。
图 5. 执行正确的Bootloader的流程
一路OK后,此时的LAUNCHPAD里就是新的固件所示现的功能啦!如果配置不对的话,这个App是会闪退的,无法完成Bootloader的功能。如果不想用板载的XDS110,用自己的USB转串口工具也是可以的,只不过不会跳出那么多跟XDS110有关的COM ports了,取而代之的是USB Serial Ports,串口号不用太纠结。
图 6. USB转串口工具的COM ports
当然啦,有可能你双击sblAppEx.exe来执行,但执行完一系列操作后会自动退出,看不到任何Log,解决的方法是不要双击进入程序,在windows的run里用cmd命令,如图7所示,切到sblAppEx.exe所在文件夹就可以啦。如果某个环节遇到任何问题,Bootloader就会中断,DOS界面会提示ERROR,具体可以对照sblAppEx.exe的源码进行检查,此处不再赘述。需要注意的是,如果不用Bootloader模式,Bootloader backdoor的引脚一定要接固定电平,此处DIO15一定要接低电平,不能悬空。
图 7. 从Windows的cmd进入程序可防止自动退出
重要的事再说一遍,sblAppEx.exe是开源的,用户可以根据需要修改源码实现定制化的功能,比如UART波特率和上文提到的镜像名称等等。
是不是产线上用起来既简单又方便呢,基本是一键式下载,既高效又防止误操作。当然啦,还可以适当修改一下下载工具和上位机软件,就可以实现多个器件的下载。打开你的环境,拿起你的开发板,来试一下吧!