基于 STM32F407 的 SPI Flash下载算法


一、概述

本文将介绍如何使用 MDK 创建 STM32F407SPI Flash 下载算法。

其中,SPI Flash 芯片使用的是 W25Q128,其相关操作源码可以参考 STM32 通过 SPI 驱动 W25Q128,本文所使用的驱动 SPI Flash 的 API 和里面是一样的。

单片机的 Flash 下载算法是一个 FLM 文件,FLM 通过编译链接得到,其内部包含一系列对 FLASH 的操作,包括初始化、擦除、写、读、校验等等操作。

想要制作下载算法,先要了解下载算法的工作原理。我们下载一个程序的流程大概是这样的:

  1. 下载工具(比如 jlink)读取 FLM 文件
  2. 然后 JLINK 提取 FLM 文件的信息,将其传输到单片机的内部 SRAM
  3. 下载算法开始在 SRAM 中运行,由于下载算法包含了一系列对 Flash 的操作,那么下载工具通过下发初始化、擦除、写入、校验等指令给单片机,单片机去执行这些指令操作,实现对单片机 Flash 的下载。

二、自制 FLM 文件

我参照的是 MDK 给的程序模板来完成 Flash 下载程序,然后在模板的基础上加上自己的代码。

模板路径如下:D:\Keil_v5\ARM\Packs\ARM\CMSIS\5.8.0\Device\_Template_Flash,不同的 MDK 版本可能路径不一样。

然后将项目拷贝到你的工作目录下,并取消该工程项目的只读属性。

打开项目如下:

然后开始我们的工作。

1、修改使用的芯片

首先选择你的芯片类型和型号。

2、修改输出算法的名称

这一步不是必须的,改个名称方便自己查看。

注意这个名称只是项目最终生成输出的 FLM 文件的名称,和下面位置识别出的算法名(后面会介绍这个名称如何修改)无关。


3、其它设置

注意

这里的设置在模板文件中已经设置好了,这里主要是介绍一些,可以跳过


这两个设置是为了保证生成的算法文件中 RO 和 RW 段的独立性,即与地址无关。

如果程序的所有只读段都与位置无关,则该程序为只读位置无关(ROPIRead-only position independence)。ROPI 段通常是位置无关代码(PICposition-independent code),但可以是只读数据,也可以是 PIC 和只读数据的组合。选择“ ROPI”选项,可以避免用户不得不将代码加载到内存中的特定位置。这对于以下例程特别有用:

  • 加载以响应运行事件。
  • 在不同情况下使用其他例程的不同组合加载到内存中。
  • 在执行期间映射到不同的地址。

使用 Read-Write position independence 同理,表示的可读可写数据段。

通过下面的命令就可以将生成的 axf 可执行文件修改为 FLM

我们这里的分散加载文件直接使用 MDK 模板工程里提供好的即可,无需任何修改。

4、修改配置文件 FlashDev.c

模板工程里面提供简单的配置说明:

struct FlashDevice const FlashDevice  =  {
   
   
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "New Device 256kB Flash",   // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)
   0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 
   0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)
   SECTOR_END
};

这里的注释已经说得很明白了,大家根据自己的芯片来进行修改即可,我使用的是 W25Q128,其存储大小为 16MB,一个扇区 4KB,所以修改如下:

W25Q128 一页是 256KB,但这里写的 4096 是为了提高下载速率和擦除速率,如果你把 4096 改为 8,可以很明显得感受到下载速度变慢了

struct FlashDevice const FlashDevice  =  {
   
   
   FLASH_DRV_VERS,                  /* 驱动算法,由 MDK 制定,勿动 */
   "Yux_STM32F407VE_SPI_W25Q128",   /* 算法名称 */ 
   EXTSPI,                       
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值