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。
相关推荐
G***技8 小时前
杰和科技亮相中国工博会:嵌入式边缘AI驱动自动化场景落地
嵌入式硬件·边缘ai·工博会
QYR-分析10 小时前
汽车碳刷市场深度解析:存量维保支撑需求,电动化重塑行业格局
单片机·嵌入式硬件·汽车
沐欣工作室_lvyiyi11 小时前
基于单片机的升降式立体车库系统设计(论文+源码)
单片机·嵌入式硬件·毕业设计·rfid·单片机毕业设计·数据库设计·物联网毕业设计
碧海银沙音频科技研究院11 小时前
基于炬芯ATS3089X的BLE opus音频传输系统设计
stm32·单片机·嵌入式硬件
Yiran_G12 小时前
智能家居自动化为什么会失效?从一次开灯失败看无线通信链路
嵌入式硬件·物联网·智能家居
编程圈子13 小时前
I.MX6U 裸机开发 25. PWM 与 LCD 背光
单片机·嵌入式硬件
创界工坊工作室13 小时前
35-基于AT89C51单片机的罐头生产线传送系统设计
stm32·单片机·嵌入式硬件·51单片机·proteus·生产线
qq_4017004114 小时前
MCU串口接收不定长数据的三种方案,哪种最稳?
stm32·单片机·嵌入式硬件
inrichtt14 小时前
第七课时:STM32时钟系统揭秘:从零理解时钟树
c语言·数据结构·stm32·单片机·嵌入式硬件
硅基手札15 小时前
【Linux 内核专栏 17】进程间通信 IPC(上)— 管道·信号·System V IPC·mmap·文件锁
linux·运维·服务器·stm32·单片机·mcu