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. 功能实现参考:https://www.bilibili.com/video/BV1SatHeBEVG/?spm_id_from=333.337.search-card.all.click&vd_source=1892e5ffdeb61332d745a9b5a19c116c https://www.bilibili.com/video/BV1SatHeBEVG/?spm_id_from=333.337.search-card.all.click&vd_source=1892e5ffdeb61332d745a9b5a19c116c

4.1 flash和w25q64的代码参考江科大

4.2 24c02的代码参考正点原子

5.程序包内容

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐