对于初入MCU领域的STM32小白,理解其与SOC的差异是关键入门步骤。本文以STM32 L4为例,对相关基础知识进行全面梳理,助力新手快速上手。 一、MCU与SOC的主要差异MCU与SOC在架构与应用场景上存在显著差异,这些差异决定了在MCU开发中,许多SOC上的技术理论难以直接沿用。MCU通常集成了处理器内核、存储器和各类外设接口,主要面向嵌入式控制系统,强调实时性和低功耗。而SOC则更侧重于复杂运算与高速数据处理,常见于智能手机、平板电脑等高性能设备。在存储架构、运算能力和功耗管理等方面,MCU与SOC均有本质区别,这要求开发者转变思路,掌握MCU独有的开发技巧与优化策略。 二、STM32的存储架构无DDR设计 :MCU未配备DDR,代码存储于nor flash,临时变量与栈的运行则依赖SRAM。MCU的CPU频率相对较低,一般在几十MHz到一二百MHz范围,nor flash的读取速度足以满足CPU取指需求。然而,nor flash写入速度较慢,因此引入SRAM作为临时变量和栈的运行空间,以此实现数据的快速读写,保障程序流畅运行。 存储架构优势 :这种架构设计使STM32具备成本低、功耗小的优势,尤其适用于对数据存储容量要求不高,但对实时性和稳定性要求严格的嵌入式应用场景,如智能家居传感器、工业自动化控制器等。在这些场景下,快速响应与低能耗比复杂计算更为关键。
三、STM32启动方式详解STM32提供了三种上电后的引导方式,分别为从flash引导启动、从system memory引导启动以及从SRAM引导启动。
source: http://www.ingchips.com/news/147.html不同的启动方式对应着不同的应用场景与配置要求。 从flash引导启动 :这种方式是将预先烧录好的固件程序存储在flash中,上电后CPU直接从flash加载bin文件并运行。它是最常见的启动方式,适用于正常运行用户程序的场景。在产品交付使用后,用户程序稳定运行时,基本都采用此模式启动。 从system memory引导启动 :当flash中的程序被擦除或损坏时,CPU会转而运行MCU出厂自带的一块ROM程序,即bootloader。该bootloader程序可通过串口、I2C、SPI或者USB等通信接口实现对flash的重新烧录,有效防止MCU因flash异常而变砖。STM32 Cube Programmer工具正是利用这段ROM程序,完成对flash的烧录操作,为开发者提供了便捷的程序更新手段。 从SRAM引导启动 :由于SRAM是掉电易失性存储器,因此该模式要求在程序写入SRAM后保持系统不断电,直接切换跳转运行。这种引导方式主要应用于在线仿真场景,方便开发者在开发调试阶段对程序进行实时监控与修改,使用场景相对小众。 这三种启动方式的选择是通过外部的BOOT0 pin或者nSWBOOT0 option bit进行配置的。若boot配置为flash启动,但flash为空,CPU会自动切换至system memory程序运行,这也解释了为何即使flash未写入程序,上电后某些GPIO仍会被配置的现象,这正是内部ROM程序运行的结果。 可以发现,CPU上电后是从地址 0开始运行的,但地址0 处存放的是什么代码?取决于BOOT configuration,不同的BOOT configuration会导致不同代码映射到0 地址处。 Flash memory的地址范围是0x08000000 ~ 0x08020000,所以 该MCU所支持挂载的最大flash容量为0x20000 byte,即128KB。flash的烧录地址也只能在这个范围选择。 四、STM32 OTA实现方案深度剖析随着物联网的发展,设备的远程更新(OTA)功能越发重要。以下是针对STM32的几种OTA实现方案,各有优劣,开发者可根据实际需求灵活选择。 方案一:bootloader + AB分区
原理与流程 :将flash划分为三个区,分别是bootloader、A分区和B分区。其中,bootloader分区代码不参与升级,其核心职责是引导分区以及进行升级检查。A分区和B分区大小相同,用于存储需要OTA的业务逻辑代码。在升级过程中,新固件会被写入A或B分区中的一个。重启后,bootloader会根据A、B分区的版本号,跳转至版本较新的分区代码运行。 优势 :该方案的优势在于实现了无感升级,可在正常业务运行时完成升级写入操作,无需进入专门的烧录模式,对用户体验十分友好。同时,具有较高的安全性,即使升级过程中写入flash失败,仍保留有上一个版本的固件可供使用,有效避免了设备变砖的风险。 局限性 :不过,该方案对flash容量要求较高,毕竟需要划分出两个分区用于存储不同版本的业务代码,在flash资源有限的情况下,可能会受到限制。
方案二:bootloader + A分区
- 原理与流程 :此方案仅划分bootloader和A分区两个区域。当接收到升级请求时,app程序会跳转执行bootloader代码,由bootloader负责数据接收以及flash烧录工作。烧录完成后,再跳转回app程序执行,从而完成升级过程。
- 优势 :相较于方案一,该方案节省了一个分区,对flash资源的占用更少,在flash容量有限的场景下更具适用性。
- 局限性 :然而,该方案要求MCU处于烧录模式才能进行升级操作。一旦烧录失败,设备将无法正常运行,只能重新尝试升级烧录,这在一定程度上增加了升级的风险与复杂性。
方案三:直接利用system memory分区进行升级
- 原理与流程 :该方案无需额外编写bootloader代码,而是直接通过重启并利用boot pin引导进入system memory分区,借助内部的ROM代码完成flash烧写操作。
五、总结与展望掌握STM32的基本架构与启动方式是入门MCU开发的基石,而根据不同应用场景选择合适的OTA方案,则是实现设备远程高效更新的关键。对于STM32小白而言,深入了解这些基础知识与技术方案,有助于在实际项目开发中做出明智决策,顺利完成从入门到进阶的跨越。 在后续学习过程中,建议新手开发者多动手实践,通过搭建开发环境、编写简单程序、调试运行等方式,加深对STM32的感性认识。同时,积极查阅官方文档、参考优秀开源项目,不断拓宽知识面与视野,逐步积累开发经验,从而在MCU领域实现稳步成长与进步。
|