
1. 引言) B9 o- E, R; H6 Q3 ^) U 随着用户的应用越来越复杂以及 GUI 等需要大存储空间的需求越来越多,很多时候我们需要将代码或数据放在外扩的 Flash 存储空间。但是这样存在一个外部 Flash 烧写的问题,尤其是在应用调试时,需要将代码或数据烧录到外部 Flash。如果调试工具不能够一键烧录,势必会给调试带来诸多的麻烦。本文以 STM32H750 芯片为例,介绍通过 KEIL制作 QSPI 接口的外部 Flash 下载算法的方法。) H$ b: S0 F5 _2 j i & W6 N8 U5 T% K 2. MDK 下载算法基础知识3 W. n$ `4 l! W" ] FLASH 编程算法是一种用于擦除应用程序或将应用程序下载到 Flash 的程序代码。MDK 本身支持的各种器件都自带下载算法,存放在 MDK 各种器件的软件包里面,以STM32H7 为例,算法存在于 Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软件包版本不同,数字 2.6.0 会不同)。但是,只有 STM32 官方部分开发板提供了算法工程,大多数用户开发板都需要自己编写下载算法。不同的 QSPI-FLASH 的驱动略有差别,因此下载算法也不同。所以,掌握通用的下载算法制作步骤很重要。 MDK 通过创建一批与地址信息无关的函数,实现的功能主要有初始化,擦除,编程,读取,校验等,然后在 MDK 调试下载阶段,会将算法文件加载到芯片的内部 RAM 里面(加载地址可以通过 MDK 设置),然后 MDK 通过与这个算法文件的交互,实现程序下载,调试阶段数据读取等操作。2 ]8 E e; M" A $ V1 t& r) y- p' t9 T1 U 3. 程序擦除操作执行流程 如图 1所示,可以看出 Flash 的擦除过程包括以下几个步骤:8 i% P" P" P8 [0 N$ D2 S9 o! r a) 加载算法到 RAM(一般指片内 SRAM) b) 执行初始化函数 Init c) 执行擦除操作,根据用户的 MDK 配置,这里可以选择整个芯片擦除或者扇区擦除。% K- v5 z; `8 {2 {$ y d) 擦除操作结束后执行 Uninit 函数1 L2 G. T6 W& E. } J9 [% X ; i1 L0 K( l% U& x- l ( C2 ?# v9 L1 c' w- h; T- I0 m ![]() ) U8 t/ j9 _ B* u( o. u) f 4. 程序烧录操作执行流程' W! b5 A J3 Q. S# { 如图 2所示,程序烧录执行流程包括以下步骤:! ]' [. @5 |# o: N a)对所有的 AXF 文件做 init 初始化(AXF 是 MDK 生成的可执行文件,也就是需要烧录和调试的代码) b)查看烧写算法 FLM 文件是否存在,如果不存在,则操作结束;如果存在,则继续 c)加载算法文件到 RAM 中! r" O# a* Z1 ?+ J2 ` d)执行初始化函数 Init1 \* A! N L+ y @9 r5 P+ q9 E0 c e)加载用户程序代码至 RAM 中( G& P) e- ~, \5 O( W8 K f)执行写入编程函数 Program Page/ ]" v! z* ]/ W( \" p: B+ A g)执行 Uninit 函数 h)操作结束1 G f3 b5 X/ P3 l 3 I* b; W* v- w ![]() * G1 u4 j! i3 y 从以上操作过程中可以看出,我们的用户代码是先放在 RAM 中缓存的,然后 IDE 通过调用 RAM 中的 FLASH 写入函数 Program Page 将代码写入到 Flash 中,完成代码的烧录 $ {3 {0 A2 ~+ c f& T [7 {7 j 9 `6 l6 n" S X6 b e C9 n" c 完整版请查看:附件 ![]() |
OpenBLT移植到STM32F405开发板
为什么要先开启STM32外设时钟?
【STM32MP157】从ST官方例程中分析RPMsg-TTY/SDB核间通信的使用方法
【经验分享】STM32实例-RTC实时时钟实验④-获取RTC时间函数与中断服务函数
STM32 以太网 MAC Loopback 的实现
STM32功能安全设计包,助力产品功能安全认证
基于STM32启动过程startup_xxxx.s文件经验分享
HRTIM 指南
ST 微控制器电磁兼容性 (EMC) 设计指南
适用于STM32微控制器的ΣΔ数字接口入门