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。
在这里插入图片描述

在这里插入图片描述

  • 26
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值