通过 KEIL 制作 QSPI 接口的外部 Flash 下载算法

本文详细介绍了如何使用KEIL为STM32H750制作QSPI接口的外部Flash下载算法。通过理解MDK下载算法基础知识,了解程序擦除、烧录和校验流程,以及MDK工程设置步骤,特别是FlashDev.c和FlashPrg.c的修改,以实现QSPI-FLASH驱动和库函数的添加。最终,讨论了算法的使用方法和注意事项,为开发者提供了一套完整的制作过程。
摘要由CSDN通过智能技术生成

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 的擦除过程包括以下几个步骤:

  1. a) 加载算法到 RAM(一般指片内 SRAM)
  2. b) 执行初始化函数 Init
  3. c) 执行擦除操作,根据用户的 MDK 配置,这里可以选择整个芯片擦除或者扇区擦除。
  4. d) 擦除操作结束后执行 Uninit 函数

图1.程序擦除操作执行流程
图1.程序擦除操作执行流程

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)操作结束

图2.程序烧录操作执行流程
在这里插入图片描述
从以上操作过程中可以看出,我们的用户代码是先放在 RAM 中缓存的,然后 IDE 通过调用 RAM 中的 FLASH 写入函数 Program Page 将代码写入到 Flash 中,完成代码的烧录。

5. 程序校验操作执行流程

程序校验操作大致流程如图 3(Algorithm Functions (keil.com))所示,其中校验要用到 MDK 生成的 axf 可执行文件。 校验就是 把 axf 文件中的程序和实际下载到芯片的程序读出来做比较。

  1. a)查看烧写算法 FLM 文件是否存在,如果不存在,则操作失败;如果存在,则继续
  2. b)加载算法到 RAM 中
  3. c)执行初始化 Init
  4. d)检查校验算法是否存在:
    如果存在,加载应用程序到 RAM 中,然后执行校验算法函数;
    如果不存在,计算 CRC,将芯片中读取出来的数据和 RAM 中加载应用计算输出的CRC 值做比较。
  5. e)执行 Uninit 函数。
  6. f)替换 BKPT( BreakPoint 断点指令)为 B. 死循环指令
  7. h)执行 RecoverySupportStop, 恢复支持停止。
  8. i)执行 DebugCoreStop,调试内核停止
  9. g)运行应用,若运行成功,则硬件复位
  10. k)操作完成,停止调试端口

图3.程序校验操作执行流程
在这里插入图片描述

6. MDK 创建下载算法过程通用步骤

6.1 使用 MDK 提供的通用模板

模板路径:
C:\Keil_v5\ARM\Packs\ARM\CMSIS\5.6.0\Device_Template_Flash

请找到自己 MDK 的安装路径,找到后将工程拷贝出来。然后将以下两个文件的只读属性取消。FlashDev.c 是 flash 信息描述文件,需要根据自己的 flash 实际情况修改。

FlashPrg.c 是具体擦除、写入、校验等接口函数实现文件,需要自己根据实际情况进行开发。

图4.程序烧录操作执行流程
图4.程序烧录操作执行流程
同时 MDK 提供的工程模板原始名字是 NewDevice.uvprojx, 大家可以根据自己的需要做修改。

6.2 MDK 工程设置

6.2.1. 修改使用的芯片型号

图5.修改使用的芯片型号
在这里插入图片描述

6.2.2. 修改输出算法文件名

图6.修改输出算法文件名
在这里插入图片描述
这个名字是方便用户查看的, 比如设置为 stm32h7,那么输出的算法文件就是stm32h7.flm。

6.2.3. 设置算法文件中 RO 和 RW 段的独立性

图7.设置算法文件中 RO 和 RW 断的独立性
在这里插入图片描述
选择“ ROPI”以及 “RWPI”选项, 可以避免用户不得不将代码加载到内存中的特定位置。

6.2.4. 将程序可执行文件 axf 修改为 FLM

通过以下命令即可在编译后生成 FLM 文件。

图8.将程序可执行文件 axf 修改未 FLM 格式
图8.将程序可执行文件 axf 修改未 FLM 格式

6.2.5. 分散加载设置

分散加载文件 Target.lin 模板中有提供,–diag_suppress L6305 用于屏蔽 L6503 类型警告信息,设置了分散加载后, 此处的配置就不再起作用了。

图9.分散加载设置 1
在这里插入图片描述

7. 添加 QSPI-FLASH 驱动及其有关库函数

使用 CubeMX 生成一个工程模板,然后将其中的 Drivers 文件夹拷贝到工程文件夹下,同时准备调试好可用的 Flash 驱动(QSPI 方式驱动),在 MDK 中新建如下分组,并添加对应的文件。

图10. 复制相关文件到工程文件夹
在这里插入图片描述
图11. MDK 新建分组并添加文件
图11. MDK 新建分组并添加文件

  • • CMSIS 分组中的 system_stm32h7xx.c 在
    Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates 中
  • • HAL 分组中添加必要的 HAL 库文件
  • • QSPI 分组中添加 QSPI Flash 驱动

这里注意 stm32h7xx_hal_conf.h 这个头文件在 CubeMX 生成的生成工程\Core\Inc 文件夹中可以找到,同时要把使用的 HAL 库文件使能,而且要修改该头文件中HSE_VALUE 的值,实际晶振多大,这里就改成多少。

最后,添加头文件路径,否则编译会报大量错误。头文件添加如图所示:

图12. 添加头文件路径
图12. 添加头文件路径

7.1. 修改 FlashDev.c

图13. 修改 FlashDev.c
在这里插入图片描述
这里需要根据自己板子上 Flash 实际情况来修改,具体参数含义自行查阅相关 Flash 芯片手册,注意这里的 Flash 起始地址是内存映射模式下 Flash 的映射地址。算法名会反馈到下图这个地方。
在这里插入图片描述

7.2. 修改 FlashPrg.c

该文件是我们整个算法的核心文件,我们至少需要实现初始化、擦除、写入等函数接口。

7.2.1. 实现 Init 函数

在这里插入图片描述
初始化完毕后要将其设置为内存映射模式,SystemClock_Config()可以从 CubeMX 生成的空白工程中拷贝过来,这是对系统外设时钟初始化函数,必须添加。

7.2.2. 实现 EraseChip 函数

在这里插入图片描述
在这里插入图片描述
这是对整个芯片进行擦除的函数接口,如果勾选了如下的选项就会调用该函数,实际应用中不建议勾选,因为全片擦除比较耗时。
在这里插入图片描述

7.2.3. 实现 EraseSector 函数

在这里插入图片描述
在这里插入图片描述
当勾选了如下图所示的选项时,则调用该函数
在这里插入图片描述

7.2.4. 实现 ProgramPage 函数

在这里插入图片描述

7.3. 读取和检验函数

我们程序中未做读取函数,那么 MDK 会以总线方式进行读取,这是为什么要设置成内存映射模式的原因。如果程序中未做校验函数,那么 MDK 会读取数据做 CRC 校验。校验函数,实际上也可以不写。

8. 算法使用方法

算法生成后,将对应的算法 FLM 文件拷贝到 MDK 安装路径下 C:\Keil_v5\ARM\Flash
在这里插入图片描述
然后打开上图所示的设置界面,点击 ADD 按钮即可找到下载算法,然后添加即可。注意右上角 RAM for Algorithm 一定要设置大一点,否则可能算法运行失败。

9. 小结

本文介绍了基于 MDK 通用模板和已有工程制作 MDK 下载算法的过程。制作过程很容易造成失败,除了要注意工程中的相关设置以外,建议多参考 ST 官方固件包提供的DEMO,有时可以直接找到对应型号 MCU 的烧写算法 DEMO,如果没有可以参考功能外设相似的 MCU 工程 DEMO,也可以在其 DEMO 上直接修改,主要是替换 QSPI 的驱动(引脚、命令等),还有就是注意自己板子 MCU 的时钟配置,建议直接拷贝可以成功运行工程中的时钟配置。

参考文献

在这里插入图片描述

文档中所用到的工具及版本

Keil V5.36


本文档参考ST官方的《【应用笔记】LAT1198+通过+KEIL+制作+QSPI+接口的外部+Flash+下载算法》文档。
参考下载地址:https://download.csdn.net/download/u014319604/88971329

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值