1.2 OTA STM32F103C8T6-BootLoader实现
1.OTA方案参考(OTA方案:这是最后一篇了,五精华无悬念:STM32的IAP方案 https://bbs.eeworld.com.cn/thread-294115-1-1.html)
1.1 STM32常规的运行流程
-
上电/复位: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和程序计数器PC)
2.1 设置sp,A区起始位置0x0800 5000,给到sp
//设置栈顶地址
//addr:栈顶地址
__asm void MSR_MSP(u32 addr)
{
MSR MSP, r0 //set Main Stack value
BX r14
}
2.2 设置pc,A区起始位置0x0800 5000+4,给到pc
typedef void (*iapfun)(void); //定义一个函数类型的参数.
iapfun jump2app;
//跳转到应用程序段
//appxaddr:用户代码起始地址.
void iap_load_app(u32 appxaddr)
{
if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
{
jump2app=(iapfun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
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.bin
4.1 flash和w25q64的代码参考江科大
4.2 24c02的代码参考正点原子
5.程序包内容

更多推荐
4. 功能实现参考:


所有评论(0)