本文主要是介绍【沁恒蓝牙mesh】OTA功能详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本文基于沁恒CH58X 单片机的OTA功能
一键三连,收藏+点赞+评论 私信可获取原文
📋 个人简介
- 💖 作者简介:大家好,我是喜欢记录零碎知识点的小菜鸟。😎
- 📝 个人主页:欢迎访问我的 Ethernet_Comm 博客主页🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:沁恒蓝牙mesh二次开发 🍁
- 💬格言:写文档啊不是写文章,重要的还是直白!🔥
OTA 下位机流程
下位机,收到指令:
【擦除】
收到数据帧: 0x81 len xx xx xx xx // 1字节 cmd + 1 字节长度 + 2字节 起始地址 + 2 字节 block 数量
执行动作: 上位机发一帧数据,下位机回应一帧ACK,直到上位机发送完,开始启动擦除
【编程】
收到 数据帧: 0x80 len xx xx xx …… // 1字节 cmd + 1 字节长度 + 2字节 地址 + 243 字节数据
执行动作: 将接收到的数据,一帧一帧的写到 APP2 的 flash 区域,每写完一帧都和上位机回复ACK
【校验】
收到 数据帧: 0x82 len xx xx xx …… // 1字节 cmd + 1 字节长度 + 2字节 地址 + 243 字节数据
执行动作: 依次读取 APP2 的 flash,并校验,直到结束,期间每写完一帧都和上位机回复ACK
【发送信息】
收到数据帧: 0x84 len xx xx xx …… // 1字节 cmd + 1 字节长度 + 245 字节数据
执行动作: 向上位机发送一些列信息
【编程结束】
收到数据帧: 0x83 len xx xx xx xx // 1字节 cmd + 1 字节长度 + 2 字节数据
执行动作: 关中断、修改 flash 标志位,软复位
下位机报文:
【编程】
// 接收到一帧数据 + 写入 flash + 向上位机发送 ack
// 0x80, 0xf0, 0x00, 0x01
// cmd + 数据长度 240 + 起始地址 0x1000 + 236 字节的 flash 数据
IAP_PROM: 00027000 len:240
0x80, 0xf0, 0x00, 0x01, 0x6f, 0x00, 0xc0, 0x74, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x20, 0x76, 0x22, 0x00, 0x20, 0xa9, 0xbd, 0xf9, 0xf5, 0x94, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x20, 0x00, 0x20, 0x98, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x20, 0x00, 0x20, 0xa0, 0x20, 0x00, 0x20, 0xa2, 0x20, 0x00, 0x20, 0xa4, 0x20, 0x00, 0x20, 0xa6, 0x20, 0x00, 0x20, 0xa8, 0x20, 0x00, 0x20, 0xaa, 0x20, 0x00, 0x20, 0xac, 0x20, 0x00, 0x20, 0xae, 0x20, 0x00, 0x20, 0xb0, 0x20, 0x00, 0x20, 0xb2, 0x20, 0x00, 0x20, 0xb4, 0x20, 0x00, 0x20, 0xf2, 0x22, 0x00, 0x20, 0xb8, 0x20, 0x00, 0x20, 0xba, 0x20, 0x00, 0x20, 0xbc, 0x20, 0x00, 0x20, 0xbe, 0x20, 0x00, 0x20, 0xc0, 0x20, 0x00, 0x20, 0xc2, 0x20, 0x00, 0x20, 0xc4, 0x20, 0x00, 0x20, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0xb7, 0x17, 0x00, 0x40, 0x93, 0x06, 0x70, 0x05, 0x23, 0x80, 0xd7, 0x04, 0x13, 0x07, 0x80, 0xfa, 0x23, 0x80, 0xe7, 0x04, 0x01, 0x00, 0x01, 0x00, 0x03, 0xc6, 0xb7, 0x04, 0x13, 0x76,
PROM:send ack to phone // 地址:0x10f0
IAP_PROM: 000270f0 len:240
0x80, 0xf0, 0x0f, 0x01, ……………………………………………………
PROM:send ack to phone
【校验】
IAP_VERIFY: 00027000 len:240
0x82, 0xf0, 0x00, 0x01, 0x6f, 0x00, 0xc0, 0x74, 0x90, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x20, 0x00, 0x20, 0x76, 0x22, 0x00, 0x20, 0xa9, 0xbd, 0xf9, 0xf5, 0x94, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x20, 0x00, 0x20, 0x98, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9c, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x9e, 0x20, 0x00, 0x20, 0xa0, 0x20, 0x00, 0x20, 0xa2, 0x20, 0x00, 0x20, 0xa4, 0x20, 0x00, 0x20, 0xa6, 0x20, 0x00, 0x20, 0xa8, 0x20, 0x00, 0x20, 0xaa, 0x20, 0x00, 0x20, 0xac, 0x20, 0x00, 0x20, 0xae, 0x20, 0x00, 0x20, 0xb0, 0x20, 0x00, 0x20, 0xb2, 0x20, 0x00, 0x20, 0xb4, 0x20, 0x00, 0x20, 0xf2, 0x22, 0x00, 0x20, 0xb8, 0x20, 0x00, 0x20, 0xba, 0x20, 0x00, 0x20, 0xbc, 0x20, 0x00, 0x20, 0xbe, 0x20, 0x00, 0x20, 0xc0, 0x20, 0x00, 0x20, 0xc2, 0x20, 0x00, 0x20, 0xc4, 0x20, 0x00, 0x20, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0x01, 0xa0, 0xb7, 0x17, 0x00, 0x40, 0x93, 0x06, 0x70, 0x05, 0x23, 0x80, 0xd7, 0x04, 0x13, 0x07, 0x80, 0xfa, 0x23, 0x80, 0xe7, 0x04, 0x01, 0x00, 0x01, 0x00, 0x03, 0xc6, 0xb7, 0x04, 0x13, 0x76,
VERIFY:send ack to phone
【结束】
IAP_END
Image Flag 03
下位机地址计算
比如说编程时,上位机传输的地址为:第一帧:0x1000 第二帧:0x10f0
实际编程时,第一帧地址:0x00027000 ,第二帧地址: 0x000270f0
计算:
- 0x00 0x01 两个u8 转u16 ,小端格式存储 变为 0x1000 ,这是 Jump_IAP 的结束地址
- 左移4位,变为u32 , 0x0000_1000
- 偏移 IMAGEA 地址, 0x0000_1000 + 152K = 0x00027000
这篇关于【沁恒蓝牙mesh】OTA功能详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!