STM32 - 内存分区与OTA

最近搞MCU,发现它与SOC之间存在诸多差异,不能沿用SOC上一些技术理论。本文以STM L4为例,总结了一些STM32 小白入门指南。

标题MCU没有DDR?

是的。MCU并没有DDR,而是让代码存储在nor flash上,临时变量和栈运行在SRAM上。之所以这么做是因为MCU的cpu频率很低,都是几十MHZ到一二百MHZ,nor flash的读取速度能够满足cpu 的取指需求,但nor flash 的写入速度很慢,所以引入了SRAM 作为临时变量和栈的运行空间。

标题STM32启动方式

STM32提供三种上电后的引导方式:从 flash引导启动,从 system memory引导启动 和 从 SRAM引导启动。

从 flash引导启动就是加载 flash里面的 bin文件,运行用户烧录后的固件程序。

从 system memory启动是去运行MCU出厂自带的一块 ROM程序,该程序可称作为bootloader,提供通过串口、I2C、SPI或者USB去烧录flash,防止flash擦除后变砖,也可以用来实现MCU OTA,但要想用起来还需要遵从通讯协议开发上位机程序。STM32 Cube Programmer应该也是利用这段程序,完成 flash烧录的。

从 SRAM启动,比较难理解,SRAM不是掉电易失吗?怎么还能引导启动?既然SRAM是掉电易失,那就要写入程序后不掉电,直接切换跳转运行,所以该模式主要用来做在线仿真,使用场景比较小众。

这三种启动方式的选择是通过外部的BOOT0 pin或者 nSWBOOT0 option bit配置选择的。

但如果boot配置为flash启动,但flash又为空怎么办?这个ST也已经考虑到了,在这种情况下,检查发现flash为空,cpu转头会去运行system memory程序,所以你会发现即使flash没程序,上电后某些GPIO仍然被配置了,其实这就是内部ROM程序运行导致的后果。详细内容参看官方文档: AN2606。

分析一下内存地址表:
在这里插入图片描述

可以发现,CPU上电后是从地址 0开始运行的,但地址0 处存放的是什么代码?取决于BOOT configuration,不同的BOOT configuration会导致不同代码映射到0 地址处。

Flash memory的地址范围是0x08000000 ~ 0x08020000,所以 该MCU所支持挂载的最大flash容量为0x20000 byte,即128KB。flash的烧录地址也只能在这个范围选择。

标题STM32 OTA实现方案

标题方案一:bootloader + AB分区

该方案把flash分为三个区:bootloader、A分区、B分区。

bootloader分区代码不参与升级,只负责引导分区和升级检查。A和B 分区大小需要一致,里面是需要OTA的业务逻辑代码。升级时,将升级固件写入A或B分区,重启之后,bootloader根据A B分区的版本号跳转到最新的版本分区代码运行。这样做的好处是:1、无感升级,不需要进专门的烧录模式,可以在正常业务运行的情况下升级写入flash。2、不会变砖,即使升级写入flash失败,依然存在上一个版本的固件可以使用,安全性高。

缺点:flash容量需求大。

标题方案二:bootloader + A分区

该方案可节省一个分区,对flash压力很小。升级烧录逻辑放在 bootloader,app在接收到升级请求后跳转执行到bootloader代码,bootloader进行数据接收和flash烧录,完成后,跳转执行app程序,升级完成。

该方案适用性好,毕竟很少会因为OTA,而闲置一半的 flash空间。此模式需要MCU处于烧录模式,烧录失败后,无法正常运行,只能重新尝试升级烧录。

标题方案三:直接利用system memory分区进行升级

与方案二的区别就是不用写bootloader代码,直接重启利用boot pin引导进入system memory分区,利用里面的ROM代码进行flash烧写。缺点就是需要配置boot pin重启,风险大,且bootloader是官方固化提供的,无法修改,使用不方便,但也是一条路子。参考文档:AN3155。
在这里插入图片描述

在这里插入图片描述

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 09:24:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 09:24:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 09:24:05       57 阅读
  4. Python语言-面向对象

    2024-07-12 09:24:05       68 阅读

热门阅读

  1. Postman接口测试工具详解

    2024-07-12 09:24:05       26 阅读
  2. GESP C++ 三级真题(2024年3月)T2 完全平方数

    2024-07-12 09:24:05       22 阅读
  3. 【排序 - 选择排序优化版(利用堆排序)】

    2024-07-12 09:24:05       22 阅读
  4. 【贪心算法题记录】134. 加油站

    2024-07-12 09:24:05       24 阅读
  5. 超级源点/汇点(算法篇)

    2024-07-12 09:24:05       30 阅读
  6. 【MySQL】6.表的增删查改(CURD)

    2024-07-12 09:24:05       23 阅读
  7. 开源项目的机遇与挑战

    2024-07-12 09:24:05       24 阅读
  8. 从0到1搭建数据中台(2):数据中台架构

    2024-07-12 09:24:05       24 阅读
  9. 【C/C++】内存相关

    2024-07-12 09:24:05       25 阅读
  10. 【LeetCode 0169】【摩尔投票算法】主元素

    2024-07-12 09:24:05       24 阅读
  11. 每日一道算法题 LCR 151. 彩灯装饰记录 III

    2024-07-12 09:24:05       30 阅读
  12. 【随想】社交

    2024-07-12 09:24:05       22 阅读
  13. 谷歌独立站:纯净网络空间,自由与创新的融合

    2024-07-12 09:24:05       25 阅读