说明和代码设置
本文有两篇文章参考,其中博主"甜甜的大香瓜"的文章是原始文章,详细介绍了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_B
HalUARTWrite (SBP_UART_PORT, "\x6F\x62\x64\x62\x76\x30\x2E\x30\x2E\x30", 10);
#else
HalUARTWrite (SBP_UART_PORT, "\x6F\x62\x64\x61\x76\x30\x2E\x30\x2E\x30", 10);
#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_LOG
dbg_printf("ResetOad\r\n");
#endif
EngerStar_CreateCmdReply("\x14\x01\x00\x00");
}
else
EngerStar_CreateCmdReply("\x14\x00\x00\x00");
主循环中调用复位函数:
if(CTRL.Bits.SystemReset)
{
CTRL.Bits.SystemReset = FALSE;
if(random)
eep.Serial_number += random;
else
eep.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_LOG
dbg_printf("ResetOad_snv_write\r\n");
#endif
}
else
{
#ifdef ENABLE_WD
WD_INIT_1000MS();
#endif
}
使用如下命令复位不开看门狗:
ff550a30393936353937b1dc1400
ff550714aa0000cbe17100
经过这样修改后代码可以正常升级了,升级成B再次升级成A打印如下::
本章节所涉及的资料:https://download.csdn.net/download/chengdong1314/87425903
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)