目录预览
1. 引言 2. MDK 下载算法基础知识 3. 程序擦除操作执行流程 4. 程序烧录操作执行流程 5. 程序校验操作执行流程 6. MDK 创建下载算法过程通用步骤 7. 添加 QSPI-FLASH 驱动及其有关库函数 8. 算法和使用方法 9. 小结
1.引言 随着用户的应用越来越复杂以及 GUI 等需要大存储空间的需求越来越多,很多时候我们需要将代码或数据放在外扩的 Flash 存储空间。但是这样存在一个外部 Flash 烧写的问题,尤其是在应用调试时,需要将代码或数据烧录到外部 Flash。
如果调试工具不能够一键烧录,势必会给调试带来诸多的麻烦。本文以 STM32H750 芯片为例,介绍通过 KEIL制作 QSPI 接口的外部 Flash 下载算法的方法。
2.MDK 下载算法基础知识 FLASH 编程算法是一种用于擦除应用程序或将应用程序下载到 Flash 的程序代码。MDK 本身支持的各种器件都自带下载算法,存放在 MDK 各种器件的软件包里面,以STM32H7 为例,算法存在于 Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash (软件包版本不同,数字 2.6.0 会不同)。但是,只有 STM32 官方部分开发板提供了算法工程,大多数用户开发板都需要自己编写下载算法。不同的 QSPI-FLASH 的驱动略有差别,因此下载算法也不同。所以,掌握通用的下载算法制作步骤很重要。
MDK 通过创建一批与地址信息无关的函数,实现的功能主要有初始化,擦除,编程,读取,校验等,然后在 MDK 调试下载阶段,会将算法文件加载到芯片的内部 RAM 里面(加载地址可以通过 MDK 设置),然后 MDK 通过与这个算法文件的交互,实现程序下载,调试阶段数据读取等操作。
3.程序擦除操作执行流程 如图 1 (Algorithm Functions (keil.com)所示 可以看出 Flash 的擦除过程包括以下几个步骤: a) 加载算法到 RAM(一般指片内 SRAM) b) 执行初始化函数 Init c) 执行擦除操作,根据用户的 MDK 配置,这里可以选择整个芯片擦除或者扇区擦 除。 d) 擦除操作结束后执行 Uninit 函数
4.程序烧录操作执行流程 如图 2 (Algorithm Functions (keil.com) 所示,程序烧录执行流程包括以下步骤: a)对所有的 AXF 文件做 init 初始化(AXF 是 MDK 生成的可执行文件,也就是需要烧 录和调试的代码) b)查看烧写算法 FLM 文件是否存在,如果不存在,则操作结束;如果存在,则继续 c)加载算法文件到 RAM 中 d)执行初始化函数 Init e)加载用户程序代码至 RAM 中 f)执行写入编程函数 Program Page g)执行 Uninit 函数 f)操作结束
从以上操作过程中可以看出,我们的用户代码是先放在 RAM 中缓存的,然后 IDE 通过调用 RAM 中的 FLASH 写入函数 Program Page 将代码写入到 Flash 中,完成代码的烧录。
5.程序校验操作执行流程 程序校验操作大致流程如图 3(Algorithm Functions (keil.com)所示 其中校验要用到 MDK 生成的 axf 可执行文件。
校验就是 把 axf 文件中的程序和实际下载到芯片的程序读出来做比较。
a)查看烧写算法 FLM 文件是否存在,如果不存在,则操作失败;如果存在,则继续 b)加载算法到 RAM 中 c)执行初始化 Init d)检查校验算法是否存在: 如果存在,加载应用程序到 RAM 中,然后执行校验算法函数 如果不存在,计算 CRC,将芯片中读取出来的数据和 RAM 中加载应用计算输出的 CRC 值做比较。 e)执行 Uninit 函数。 f)替换 BKPT( BreakPoint 断点指令)为 B. 死循环指令 h)执行 RecoverySupportStop, 恢复支持停止。 i)执行 DebugCoreStop,调试内核停止 g)运行应用,若运行成功,则硬件复位 k)操作完成,停止调试端口 file:///C:/Users/aqxx-36/AppData/Local/Temp/ksohtml93740/wps3.jpg
|