泰凌微TLSR825X开发八 OTA升级

前言

泰凌微的SDK中已经实现了OTA功能,具体的处理已经被封装到库中,开发可以在不修改代码的情况下通过官方的APP来完成升级功能
如有异议,欢迎留言指正

MCU地址划分
  • 从0~0x7FFFFF的8M空间为程序空间,最大容量可以扩展到8M
  • 0x800000~0x80FFFF为寄存器空间
  • 0x840000~0x84FFFF为Sram空间,最大容量为64K
    在这里插入图片描述
固件地址划分
  • 固件小于124K时,将把地址划为0x00000~0x1FFFF与0x20000~0x3FFFF进行交替升级
  • 固件大于124K小于252K时,将地址划为0x00000~3FFFF与0x40000~7FFFF进行交替升级
    未使用到的地址均可被用作用户自定义信息存储

在这里插入图片描述

OTA升级机制
地址标识

0x20000地址划分

  • MCU上电后会默认从0地址启动,首先去读0x08地址的数据信息,值为0x4B时会从0地址开始搬移代码到RAM,指令取指也从0地址开始
  • 如果值不为0x4B,MCU会去读取0x20008地址的值,如果读取到的值为0x4B,则代码搬移和指令取指会从0x20000地址
    0x40000地址划分
  • 同上,标识地址为0x00008与0x40008,必须通过接口配置bls_ota_set_fwSize_and_fwBootAddr
//设置最大的firmware size 为 252K
bls_ota_set_fwSize_and_fwBootAddr(200, 0x40000);//200k, 4byte对齐

在这里插入图片描述

流程
  • app连接上设备获取到指定的服务后,会下发OTA_start命令通知设备加入OTA升级模式

  • app将固件信息持续不断下发给设备

  • 固件传输完成后,app会继续发送一个OTA_end命令

  • 设备收到OTA_end命令后,进行固件更新与指定标识的擦写,并重启系统跳转到新固件运行

过程中如果出现接收超时、丢包、错包,设备slave会主动断开连接并重启
在这里插入图片描述

OTA数据
BLE属性定义

在app_att.c中定义了ota的服务与读写属性,这里是泰凌微私有的,不用修改

static const attribute_t my_Attributes[] = {
	// OTA /
	// 002e - 0031
	{4,ATT_PERMISSIONS_READ, 2,16,(u8*)(&my_primaryServiceUUID), 	(u8*)(&my_OtaServiceUUID), 0},
	{0,ATT_PERMISSIONS_READ, 2, sizeof(my_OtaCharVal),(u8*)(&my_characterUUID), (u8*)(my_OtaCharVal), 0},               //prop
	{0,ATT_PERMISSIONS_RDWR,16,sizeof(my_OtaData),(u8*)(&my_OtaUUID),	(&my_OtaData), &otaWrite, &otaRead},            //value
	{0,ATT_PERMISSIONS_READ, 2,sizeof (my_OtaName),(u8*)(&userdesc_UUID), (u8*)(my_OtaName), 0},
 }

泰凌微SDK中OTA的UUID固定

{0x12,0x2B,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00}
数据协议

Att_value中数据定义为通信命令和固件数据的格式,20字节的数据划分为如下
在这里插入图片描述

  • 当前两位数据为0xFF00~0xFF10时,表示OTA的命令
    • 0xFF00:获取设备slave的版本号命令
    • 0xFF01:启动升级命令
    • 0xFF02:升级结束命令,app(master)发送完固件数据后下发
  • 固件发送过程中,仅16个byte为实际有效数据,设备(slave)检测到包数据中索引(index)不连续或CRC错误就会主动退出升级并重启
代码实例
  • 参考app.c中的代码,在user_init_normal中进行空间清除与ota事件回调注册
// OTA init
bls_ota_clearNewFwDataArea(); //must
bls_ota_registerStartCmdCb(entry_ota_mode);//注册ota_start回调
bls_ota_registerResultIndicateCb(show_ota_result);//注册ota结果回调
  • 回调中增加参数配置与交互提示
void entry_ota_mode(void)//启动ota回调
{
    bls_ota_setTimeout(15 * 1000 * 1000); //设置升级超时15秒  set OTA timeout  15 seconds
    #if(BLT_APP_LED_ENABLE)
        gpio_set_output_en(GPIO_LED, 1);  //output enable
        gpio_write(GPIO_LED, 1);  //打开LED显示 LED on for indicate OTA mode
    #endif
}

void show_ota_result(int result)
{
    #if(1 && BLT_APP_LED_ENABLE)
        gpio_set_output_en(GPIO_LED, 1);
        if(result == OTA_SUCCESS){  //OTA 升级成功
            gpio_write(GPIO_LED, 1);
            sleep_us(500000);
            gpio_write(GPIO_LED, 0);
            sleep_us(500000);
            gpio_write(GPIO_LED, 1);
            sleep_us(500000);
            gpio_write(GPIO_LED, 0);
            sleep_us(500000);
        }
        else{  //OTA 升级失败,result为失败状态
            #if 0 //this is only for debug,  can not use this in application code
                irq_disable();
                WATCHDOG_DISABLE;
                while(1){
                    gpio_write(GPIO_LED, 1);
                    sleep_us(200000);
                    gpio_write(GPIO_LED, 0);
                    sleep_us(200000);
                }
            #endif
        }
        gpio_set_output_en(GPIO_LED, 0);
    #endif
}
  • OTA升级结果状态码
enum{
	OTA_SUCCESS = 0,     //success
	OTA_PACKET_LOSS,     //lost one or more OTA PDU
	OTA_DATA_CRC_ERR,     //data CRC err
	OTA_WRITE_FLASH_ERR,  //write OTA data to flash ERR
 	OTA_DATA_UNCOMPLETE,  //lost last one or more OTA PDU
 	OTA_TIMEOUT, 		  //
 	OTA_FW_CHECK_ERR,
};
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值