STM32F0实现IAP升级固件

好几年前写过一篇关于 STM32 bootloader 升级固件的博客,但是使用的芯片是 STM32 F4 系列,升级固件的方式是在外部 flash 的 fat32 文件系统中存入固件文件,reset 后通过特定按键进入 IAP 程序。

最近需要在 STM32 上实现同样的 IAP 功能,但是方式不太一样,也发现一些芯片的差别,在此记录一下。

一、两个工程文件的 Rom/Ram 设置

  • Bootloader 程序工程文件设置

  • 应用程序工程文件设置

二、关键点

  1. boot 程序在 flash 的前 16KB 的空间,所以应用程序的地址需要向后偏移 16KB 。

  2. 应用程序需要把前 192B 留作中断向量表使用,所以需要把真正应用程序的变量向后偏移 0xC0。

  3. 在应用程序中,需要定义中断向量表,并且指定其在内存中的位置,类似下面的语句。具体的写法会根据不同的编译器而不同,就算同样是 Keil,MDK5 和 MDK6 的写法也不一样,如下是 MDK 6 的写法。
    #define APP_VectStoreAddr "0x20000000" __IO uint32_t VectorTable[48] __attribute__((section(".ARM.__at_"APP_VectStoreAddr)));

    从AC5移植到AC6,Keil官方有一个文档特别针对这个有说明,具体链接如下

    https://www.keil.com/appnotes/files/apnt_298.pdf

  4. 跳转到应用程序以后,需要先将存在 Flash 中的中断向量表拷贝到 IRAM1 中,并且重定向中断向量表。这点 F0 系列和 F4 系列有很大的不同。具体可查看这篇博客

c 复制代码
for(i = 0; i < 48; i++)
  {
    VectorTable[i] = *(__IO uint32_t*)(APPLICATION_ADDRESS + (i<<2));
  }

  /* Enable the SYSCFG peripheral clock*/
  __HAL_RCC_SYSCFG_CLK_ENABLE();
  /* Remap SRAM at 0x00000000 */
  __HAL_SYSCFG_REMAPMEMORY_SRAM();

三、IAP 程序实现

  1. 初始化串口,开启中断。
  2. 等待几秒钟,如果中途接收到指定字符,进入升级界面。否则直接跳转到应用程序。
  3. 升级是通过串口发送固件,采用 ymodem 协议,官方有教程, AN4065
相关推荐
LS_learner2 分钟前
树莓派(ARM64 架构)Ubuntu 24.04 (Noble) 系统 `apt update` 报错解决方案
嵌入式硬件
来自晴朗的明天43 分钟前
16、电压跟随器(缓冲器)电路
单片机·嵌入式硬件·硬件工程
钰珠AIOT1 小时前
在同一块电路板上同时存在 0805 0603 不同的封装有什么利弊?
嵌入式硬件
代码游侠1 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
代码游侠12 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法
xuxg200514 小时前
4G 模组 AT 命令解析框架课程正式发布
stm32·嵌入式·at命令解析框架
CODECOLLECT16 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen16 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠19 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件