说明和代码设置

本文有两篇文章参考,其中博主"甜甜的大香瓜"的文章是原始文章,详细介绍了ImageA的hexh和B的bin以及A的bin是怎么生成的和具体的操作方法:https://blog.csdn.net/feilusia/article/details/50289371,然后博主"龙井茶110"在"甜甜的大香瓜"的基础上做了一些具体操作上的补充https://blog.csdn.net/longjingcha110/article/details/88892773
这里在他们的基础上再做一些细节的补充,他们说具体步骤这里就不说了.经过配置后工程分成4个组:

CC2541:原本工程的分组,没有OAD能力也不用烧录BIM,擦除芯片(或者新的芯片)直接在IAR中下载即可
OAD_ImageA:生成image.hex的分组,适配https://blog.csdn.net/feilusia/article/details/50289371文章说的hex
OAD_ImageB:生成imageb.bin,用于软件升级
OAD_ImageA_Bin:这个分组和OAD_ImageA相比差异在于生成了bin固件,用于升级,和OAD_ImageB相比只是分区不同
如果要下载支持OTA工程的设备,下载步骤分为3步(要按个按照下面三幅图的选项来勾选):
擦除芯片:

下载BIM:

下载ImageA.hex:


这时候编译ImageA的时候会报如下错误,无需理会点击确认即可(因为ImageA只是生成hex不生成bin所以会报这个错误):

烧录步骤简介简化

经过测试只要按照如下步骤,只进行两次烧录也是可以的
擦除和烧录bim:

烧录ImageA:

BLE Device Monitor环境搭建

下载完成后就可以用工具"BLE Device Monitor"来升级代码了,这个工具也不是特别的好用,我折腾了好久才能够识别到设备,目前"BLE Device Monitor"工具支持TI的dongle和开发板的方式进行连接,下载的代码为"HostTestReleaseCC2540"工程生成的hex,虽然我没有找到这个工程,但是却在资料夹中找到了相关的hex:

其中带Usb字样的hex是运行在dongle板子上的程序(用USB连接),没有USB字样的是运行在开发板用串口连接,我这里恰好有开发板,所以下载不带USB的(亲自验证过是可以用CC2540来测试的),因为我的程序是适配开发板的,所以可以再开发板的屏幕上看到打印信息:

我这里波特率为115200没有检验位:

如果设备正常打开"BLE Device Monitor"后可以看到如下界面:

测试

连接上设备后进入OAD界面可以看到现在设备的版本信息如下:

为了辨别当前的程序是A还是B,而且也是为了验证是否升级成功,这里在开机启动的时候做了区分打印:

  #ifdef DEBUG_UART_LOG#if defined HAL_IMAGE_BHalUARTWrite (SBP_UART_PORT, "\x6F\x62\x64\x62\x76\x30\x2E\x30\x2E\x30", 10);//obdbv0.0.0#elseHalUARTWrite (SBP_UART_PORT, "\x6F\x62\x64\x61\x76\x30\x2E\x30\x2E\x30", 10);//obdav0.0.0#endif#endif

升级成功后串口和工具的log如下(说明确实升级成功了):


成功升级了ImageB后连接进入OAD界面可以看到如下代码信息:

这时候可以升级OAD_ImageA_Bin分组的bin,升级成功后log显示如下:

按照上面的方法可以随意升级A,B两部分!所以比较好的方法是每次发布程序的时候都生成A,B的bin,升级的时候根据当前设备的类型来选择bin!

本文资料可以到如下网址下载:https://download.csdn.net/download/chengdong1314/87423333

带看门狗OAD

继续开发项目发现当代码中打开了看门狗后OAD就失败了,然后就想着OAD之前先关闭看门狗,但是可悲的发现CC2540打开了看门狗后就不能够关闭了,奇葩的设计:


这就没有办法了,只能够通过蓝牙发个命令过来设置一个掉电不丢失的标志位然后重新复位后不再打开看门狗:

设置标志位:
if(Start_Buf[4]== 0xaa){eep.Flag = RESET_OAD;CTRL.Bits.SystemReset = TRUE;#ifdef DEBUG_UART_LOGdbg_printf("ResetOad\r\n");#endifEngerStar_CreateCmdReply("\x14\x01\x00\x00");}elseEngerStar_CreateCmdReply("\x14\x00\x00\x00");
主循环中调用复位函数:
if(CTRL.Bits.SystemReset){CTRL.Bits.SystemReset = FALSE;if(random)eep.Serial_number += random;elseeep.Serial_number++;if(eep.Serial_number == 0)eep.Serial_number = 0x1021;osal_snv_write(BLE_NVID_USER_CFG_START,sizeof(_EEP), (void *)(&eep));HAL_SYSTEM_RESET();}
复位后不打开看门狗:
if(eep.Flag == RESET_OAD){eep.Serial_number++;eep.Flag = PRO_HEAD;osal_snv_write(BLE_NVID_USER_CFG_START,sizeof(_EEP), (void *)(&eep));#ifdef DEBUG_UART_LOGdbg_printf("ResetOad_snv_write\r\n");#endif}else{#ifdef ENABLE_WDWD_INIT_1000MS();#endif}

使用如下命令复位不开看门狗:
ff550a30393936353937b1dc1400
ff550714aa0000cbe17100
经过这样修改后代码可以正常升级了,升级成B再次升级成A打印如下::

本章节所涉及的资料:https://download.csdn.net/download/chengdong1314/87425903

蓝牙BLE之CC2541 OAD升级[带看门狗OAD]相关推荐

  1. 物联网-移远M26模块OpenCPU开发第3讲(看门狗)

    之前在物联网-移远M26模块OpenCPU开发第1讲中提到过需要给外部看门狗芯片喂狗才能正常工作,阅读过的读者应该知道,我是通过周期性的控制M26的一个GPIO引脚电平变化来实现喂狗的.关于其硬件参考 ...

  2. 嵌入式系统中看门狗概述。。。

    一直以来对于嵌入式中的watch dog(看门狗)都比较陌生,一直都不知道它到底是做什么的,单从名字上看也不知其所以然,然后就在网上找到了一篇blog,就是再说看门狗的作用和概述,原文如下: 1.概述 ...

  3. 电子器件系列七:看门狗

    看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始倒计数.如果程序运行正常,过一段时间CPU应发出指令让 ...

  4. linux看门狗kill程序,看门狗在嵌入式 Linux 中的应用

    By Toradex胡珊逢 1).简介 在嵌入式领域中 Watchdog 看门狗通常被作为用于应对系统或者应用意外崩溃的有效手段.其可以在程序执行出错并无法恢复的情况下,自动重启应用甚至复位整个系统, ...

  5. Linux看门狗驱动程序设计(三) 测试验证

    测试驱动之前需要执行make menuconfig,去掉内核自带看门狗驱动(位于Device Drivers -> Character devices -> Watchdog Timer ...

  6. 【BLE】CC2541之OAD

    本篇博文最后修改时间:2017年01月06日,11:06. 一.简介 本文以SimpleBLEPeripheral工程为例,介绍如何进行OAD升级. 二.实验平台 协议栈版本:BLE-CC254x-1 ...

  7. 【BLE】CC2541之Large OAD

    本篇博文最后修改时间:2017年05月19日,03:33. 一.简介 本篇以SimpleBLEPeripheral工程为例,介绍如何进行Large OAD升级. 二.实验平台 协议栈版本:BLE-CC ...

  8. 蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

    本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的 ...

  9. CC2541 OAD升级实现

    BLE_OAD升级 1.软件版本:IAR  for  8051  10.10.1 2.协议栈:BLE 1.4.0 一.获得BIM. 3.\BLE-CC254x-1.4.0\Projects\ble\u ...

最新文章

  1. 字节旗下火山引擎违规分发SkyWalking,更改所有包名、删除Apache基金会Header...
  2. 使用委派调用对象的方法
  3. c:if判断参数是否为空
  4. 强化学习笔记1:强化学习概述
  5. FORTRAN学习记录(持续更新)
  6. linux7.0怎么设置中文,CentOS 7 yum安装zabbix 设置中文界面
  7. No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK?
  8. 9月26日发布?一加7T系列被“扒光”:硬核到没朋友
  9. [Tool] SourceTree初始化GitFlow遇到错误(git command not found)的解决方案
  10. 人工智能学习该读哪些书籍?
  11. 析构函数 deinit
  12. CentOS7使用MySQL5.7.16安装
  13. Python笔记1——Python概述
  14. Windows如何查看.db数据库文件
  15. oracle优化distinct,oracle中使用group by优化distinct
  16. C语言小游戏-俄罗斯方块
  17. 预告 | 互联网人吐槽大会系列漫画 要来啦~
  18. 鸿蒙之下分城如果建设,率土之滨:分城数量不再限制,戍城、金虎台、拜将台让战斗更激烈...
  19. c# 远程网络唤醒电脑(电脑远程开机+内网MAC和IP扫描)(附带源码+主板和Windows开启详细说明+外网远程唤醒方案)
  20. nmp i报错git --no-replace-objects ls-remote

热门文章

  1. GitLab 及 Git 命令使用记录
  2. JS 正则表达式 邮箱校验
  3. 蓝桥 阮小二买彩票(Java)
  4. 谈谈演讲 - 演讲内容的准备
  5. 在Google Code上发布了项目VBox-OSE
  6. DDOS攻击解决方法
  7. TSP问题(34个省会城市):遗传算法
  8. c语言递推递归题目,C语言-递推递归.ppt
  9. Blink 自定义函数(UDX)
  10. 使用docker构建jenkins镜像并运行容器