ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

1.2 OTA STM32F103C8T6-BootLoader实现

1.2 OTA STM32F103C8T6-BootLoader实现 1.OTA方案参考OTA方案这是最后一篇了五精华无悬念STM32的IAP方案 https://bbs.eeworld.com.cn/thread-294115-1-1.html1.1STM32常规的运行流程上电/复位MCU 从 Flash 起始地址0x0800 0000处读取中断向量表。栈指针初始化获取起始地址存放的第一个值赋给MSP(主栈指针)。程序计数器跳转获取起始地址偏移0x04处的值复位向量赋给PC(程序计数器)。执行CPU 开始执行Reset_Handler进入main函数。1.2若在STM32中加入了IAP程序STM32的运行流程上电/复位MCU 依然首先从0x0800 0000启动运行Bootloader 程序。检查状态Bootloader 运行通过特定的触发条件如接收到串口升级指令、读取 Flash 标志位判断是否需要进入 OTA 模式。跳转逻辑不需要升级Bootloader 执行跳转逻辑将控制权交给 APP 区起始地址如0x0800 5000。需要升级Bootloader 通过通信接口如串口、CAN 等接收新的 APP 二进制数据将其写入指定 Flash 分区写入完成后执行跳转。APP 运行CPU 开始在 APP 区运行此时中断向量表需要重新映射。1.3 OTA分区Flash 分区A 区 (Bootloader)固定存放在 Flash 起始位置0x0800 0000。B 区 (APP)从用户设定的偏移地址开始如0x0800 5000。2. OTA跳转程序参考正点原子实验30 串口IAP实验跳转是 IAP 的关键本质上是修改堆栈指针MSP和程序计数器PC2.1 设置spA区起始位置0x0800 5000给到sp//设置栈顶地址 //addr:栈顶地址 __asm void MSR_MSP(u32 addr) { MSR MSP, r0 //set Main Stack value BX r14 }2.2 设置pcA区起始位置0x0800 50004给到pctypedef void (*iapfun)(void); //定义一个函数类型的参数. iapfun jump2app; //跳转到应用程序段 //appxaddr:用户代码起始地址. void iap_load_app(u32 appxaddr) { if(((*(vu32*)appxaddr)0x2FFE0000)0x20000000) //检查栈顶地址是否合法. { jump2app(iapfun)*(vu32*)(appxaddr4); //用户代码区第二个字为程序开始地址(复位地址) MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址) jump2app(); //跳转到APP. } }3. APP向量表和程序地址设置要和ota程序设置的A分区的地址对应3.1 修改向量表系统文件不可修改的话需要改一下文件属性3.2 程序下载地址keil:魔术棒3.3 BIN文件的生成参考正点原子fromelf --bin !L -o .\BIN\APP.bin4. 功能实现参考https://www.bilibili.com/video/BV1SatHeBEVG/?spm_id_from333.337.search-card.all.clickvd_source1892e5ffdeb61332d745a9b5a19c116chttps://www.bilibili.com/video/BV1SatHeBEVG/?spm_id_from333.337.search-card.all.clickvd_source1892e5ffdeb61332d745a9b5a19c116c4.1 flash和w25q64的代码参考江科大4.2 24c02的代码参考正点原子5.程序包内容
返回列表