# OAD附录 # 本章是前面介绍OAD中的查漏补缺。 ## 生成片外OAD链接器命令文件 ## 本节介绍如何将标准的SDK连接器命令文件转化成符合OAD的连接器命令文件,下面以cc26xx_app_and_stack.icf为例。 1. 分配元数据向量和应用程序起点内存。 我们期望flash范围是应用程序和协议栈代码和数据。 替换: ````C // Code and RO Data place in FLASH_ALL { readonly }; ```` 为: ````C // Code and RO Data place in FLASH { readonly }; ```` 然后重定义flash从OAD_FLASH_START到FLASH_END。这将会占用30页。OAD_FLASH_START代表应用程序/协议栈开始的代码。 define region FLASH = mem:[from OAD_FLASH_START to FLASH_END]; 然后定义OAD元数据宏 ````C // OAD specific define symbol OAD_HDR_SIZE = 16; // Size of metadata vector define symbol OAD_HDR_START = FLASH_START; define symbol OAD_HDR_END = OAD_HDR_START + OAD_HDR_SIZE - 1; ```` 最后定义OAD_FLASH_START,元数据向量和中断表计算。 2. 校准中断向量表 中断向量表是应用程序正确启动的关键,所以中断向量表映带在flash开始位置,但是由于元数据表,中断向量表需要移动。 首先定义如下宏: ````C define symbol INT_VEC_SIZE = 64; define symbol INT_VEC_START = OAD_HDR_START + OAD_HDR_SIZE; define symbol INT_VEC_END = INT_VEC_START + INT_VEC_SIZE - 1; ```` 然后根据定义的符号来定义范围: ````C define region INT_VEC = mem:[from INT_VEC_START to INT_VEC_END]; ```` 最后,对于内存放置,需要添加以下内容,以便中断向量表部分正确地放置: ````C // Interrupt Vector Table place at start of INT_VEC { readonly section .intvec }; keep { readonly section .intvec }; ```` 3. 保留第31页(BIM+CCFGs) 因为工程不应该编译ccfg_app_ble.c文件,因此这里不应该进行链接,移除下面这两行命令: ````C // CCFG place at end of FLASH_LAST_PAGE { readonly section .ccfg }; keep { section .ccfg }; ```` CCFGs应该由BIM编译链接。该步骤确保第31页不被用户使用。 4. OAD镜像进行页校准。 Library OAD镜像文件编译之后总是占31页,所以可以不进行校准。OAD镜像生成工具也能够填补0XFF在边界处。 ## 协议栈大小改变 ## 通常,不应该改变协议栈大小,但是如果需要可以根据OAD配置类型,在项目中对协议栈大小进行更改。 只有APP+Stack可以更改,Library OAD是不可更改协议栈配置。使得入口点总是与页面开头处的相同地址。强制链接器进行页面对齐,只需PAGE_ALIGN=1在堆栈项目中添加链接器定义。 在只进行协议栈OAD的配置情况下,协议栈OAD可以进行页面对齐,只要入口点相同,应用程序即可正常运行。 ## 生成OAD镜像元数据向量 ## OAD_Image_Tool可以生成元数据向量并将其插入到给定的镜像中,以产生OAD就绪镜像文件,OAD就绪镜像文件可以是hex文件或者一个包含target中断的元数据的bin文件。 OAD_Image_Tool是一个使用Python编写的工具,在Tools文件夹里面可以找到。 可以在IAR中的Post_build中使用,例如添加./oad_image_tool.exe -t offchip -o out.hex -m 0x0000 -i app in.hex。 该out.hex文件将是具有元数据的OAD就绪镜像,以告知OAD Target它是片外OAD的应用程序镜像。 ## 如何生成OAD镜像文件 ## 下图显示了如何编辑OAD镜像工具的IAR后期制作步骤。可以通过右键单击项目->选项来访问此菜单。 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/OADimage.png) $TOOLS_BLE_DIR$\oad\oad_image_tool.exe $PROJ_DIR$\FlashROM_OAD_Offchip\Exe\$TARGET_BNAME$.hex -t offchip -i app --imgVer 0 -ob $PROJ_DIR$\FlashROM_OAD_Offchip\Exe\$TARGET_BNAME$.bin -m 0x0000 --r 0x0000 这句命令编译后运行oad_image_tool.exe生成对应的bin和hex文件。 ## 在应用程序中使用自定义复位向量地址 ## IAR可以设置预编译命令行,如图所示,你可能需要改变OAD_IMG_E=1为OAD_IMG_A=或OAD_IMG_B=1,根据你的使用情况。 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/Resetvetor.png) ## 验证OAD是否成功升级 ## 当OAD升级完成之后,我们需要检查是否成功进行了OAD升级,一个最简单的方法就是在生成升级镜像文件的时候将设备名称修改了。这样,当OAD升级成功之后,扫描设备可以比较设备名称判断是否成功进行了OAD升级。 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/OADverify.png) 注意:如果你改变了设备名,并且设备名长度发生了变化,对应第4行应该修改。 ## 使用BTool和CC2640R2 LaunchPad作为 Downloader ## >tip: >BTool是一个功能非常丰富的应用程序。本指南仅用于记录BTool的OAD功能。 ### BTool设置 ### BTool需要CC2640R2开发板运行host_test应用程序,下面列出CC2640R2 launchPad使用BTool步骤: 1. 在SimpleLink CC2640R2 SDK中打开 \examples\rtos\CC2640R2_LAUNCHXL\ble5stack\hexfiles文件夹。 2. 打开flash_programmer 2软件。 3. 下载cc2640r2lp_host_test.hex到开发板。 ### BTool过程 ### 1. 打开BTool,并连接你的设备,如图。 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/BToolconnect.png) 2. 选择到BTool中的OAD选项卡,并启动OAD过程。请参阅下面的图片。 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/BToolOAD.png) 3. OAD状态将显示如下 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/OADtrasfor.png) 4. BTool 报告成功 ![](http://www.leconiot.com/md_res/cc2640r2f/oad/appendix/image/BToolsecess.png) ## 加入我们 ## 文章所有代码、工具、文档开源。加入我们[**QQ群 591679055**](http://shang.qq.com/wpa/qunwpa?idkey=d94f12d37c3b37892af4b757c6dc34bea140f3f3128a8d68e556a3d728148e85)获取更多支持,共同研究CC2640R2F&BLE5.0。

CC2640R2F&BLE5.0-乐控畅联 © Copyright 2017, 成都乐控畅联科技有限公司.