糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 蓝牙BLE之CC2541 OAD升级[带看门狗OAD]

蓝牙BLE之CC2541 OAD升级[带看门狗OAD]

时间:2021-10-01 21:43:05

相关推荐

蓝牙BLE之CC2541 OAD升级[带看门狗OAD]

说明和代码设置

本文有两篇文章参考,其中博主"甜甜的大香瓜"的文章是原始文章,详细介绍了ImageA的hexh和B的bin以及A的bin是怎么生成的和具体的操作方法:/feilusia/article/details/50289371,然后博主"龙井茶110"在"甜甜的大香瓜"的基础上做了一些具体操作上的补充/longjingcha110/article/details/88892773

这里在他们的基础上再做一些细节的补充,他们说具体步骤这里就不说了.经过配置后工程分成4个组:

CC2541:原本工程的分组,没有OAD能力也不用烧录BIM,擦除芯片(或者新的芯片)直接在IAR中下载即可

OAD_ImageA:生成image.hex的分组,适配/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!

本文资料可以到如下网址下载:/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打印如下::

本章节所涉及的资料:/download/chengdong1314/87425903

如果觉得《蓝牙BLE之CC2541 OAD升级[带看门狗OAD]》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。