一、概述
上一篇博文介绍了分散加载文件以及如何按照我们自己的需求修改它,这篇博文介绍的就是通过分散加载文件分配好空间以后,如何把数据下载到外部 Flash 。要将数据下载到外部 Flash,首先我们要编写与外部 Flash 型号对应的下载算法,然后将程序烧录到分散加载分配的对应空间里去。
二、下载算法介绍
2.1 下载算法概述
平时我们烧录代码大部分都是烧录到单片机的片内 Flash 中的,在 Keil 的设置中可以看到。
图 1. 片内 Flash 下载算法
下载算法也是一段程序,主要功能就是擦除相应的内存块,并将我们的程序写入到相应的内存区域上去。
LPCXpresso54608 开发板带有一颗 MT25QL128 的外置 Flash,并提供了对应的下载算法,打开 Keil 的安装目录,顺着路径 “ 安装目录 / ARM / Flash ” 就能找到,如下图所示。
图 2. 下载算法存放路径
这个是下载算法的工程文件,我们下载时使用的是此工程编译生成的 .FLM 文件,继续往下滑就能看到,如下图所示。
图 3. 下载算法文件
三、实现自己的 Flash 下载算法
以上面的 LPC54608 的为例,现在我们需要将数据放入型号为 W25Q128 的外部 SPI Flash ( 大小为 16 Mbyte )中,我们应该如何实现相应的下载算法呢?接下来就让我们开始尝试吧。
由于官方已提供 MT25QL128 的下载算法工程,所以我们不必从零开始,直接复制此工程,修改工程名,在上面进行修改。若其他型号的 MCU 未提供下载算法工程,也可以用工程模板来修改。
图 4. 下载算法工程模板
3.1 FlashDev.c
首先看看 FlashDev.c ,这是一个跟 Flash 相关的结构体,根据我们的实际情况进行修改,这里我们改为与 W25Q128 的结构相对应,结构体的第二个成员是最后编译生成的 .FLM 文件对应的名字,记得改为我们自己的型号。
图 5. FlashDev.c 原文件
图 6. FlashDev.c 修改文件
3.2 FlashPrg.c
接着是 FlashPrg.c ,此文件中放的是对 Flash 进行擦、写等操作的接口函数,这里我们改为与 W25Q128 对应的就可以,下面列出部分具体修改处。
图 7. FlashPrg.c 修改函数
根据手册,这个 SPIFI_EnableQuadMode() 里面我们改为 0x02 。
图 8. FlashPrg.c 修改指令代码
SPIFI_InitCommands() 中的指令代码也根据数据手册修改,这里就不一一列举了。
图 9. FlashPrg.c 修改函数
Init() 中原工程未使用 QUAD 模式,这里根据实际需求决定是否使能 QUAD 模式。
其他函数也是根据我们自己的需要,看是否修改,最终以自己实际使用的情况为标准,改完以后,这个算法工程就完成了。
3.3 生成 .FLM 文件
现在,编译我们的算法工程,会看到 Build Output 窗口有提示,已生成 .FLM 文件。
图 10. 生成 .FLM 文件
这个 .FLM 文件有的会默认放到安装目录下,若没有自动放到安装目录的,记得自己移过去哈。最好在安装目录下确认一下,看能不能找到这个文件。
图 11. 确认 .FLM 文件路径
3.4 下载数据到外部 Flash
图 12. 添加片外 Flash 下载算法
准备好了下载算法,我们就可以下载数据到外部 Flash 了,在“ Flash Download ”设置界面添加刚刚生成的下载算法,现在就可以开心地下程序了。
四、参考资料
(1) LPC546XX 系列相关资料均可在 NXP 官网下载,网址如下:
(2) 博客《 keil 将程序装入外部 FLASH 详解 》,网址如下:
https://blog.csdn.net/waitig1992/article/details/38611357
(3) 博客《 Cortex-M 单片机下载数据到外部 flash 》,网址如下: