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 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博1 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
时光の尘2 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣4 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再5 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件
yufengxinpian6 小时前
集成了高性能ARM Cortex-M0+处理器的一款SimpleLink 2.4 GHz无线模块-RF-BM-2340B1
单片机·嵌入式硬件·音视频·智能硬件
__基本操作__7 小时前
历遍单片机下的IIC设备[ESP--0]
单片机·嵌入式硬件
网易独家音乐人Mike Zhou13 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵13 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu15 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组