记录STM32F103ZET6制作SPI接口外部Flash下载算法的过程
在做嵌入式UI开发的时候发现有时候UI图片很大,而单片机的Flash有限,所以考虑挂载外部flash,将UI图片、字库等耗资源的部分放到外部flash中,于是了解到可以通过MDK制作外部flash下载算法来实现这个,再次对该过程做一次记录。
1、准备工作
1、Keil V5版本、STM32Cube(可选)
2、外部Flash驱动工程,(工程可以自己制作,或者用其他的标准例程来修改),保证读写檫除等功能都是OK的
2、开始制作
笔者使用的是STM32F103ZET6开发板,板上挂载了W25Q64 8M的外部Flash,用STM32cube生成配置,将Flash初始化,读写接口,檫除接口一并移植到工程中,其中有两处注意
Project中选择不生成main函数
![]()
Code Generator中选择只复制需要的文件到工程目录下,这样可以减小工程大小

(1)找到Keil安装目录中ARM/CMSIS/_Template_Flash文件夹下,将其中的几个文件拷贝到刚生成的工程目录下

(2)添加目录到工程文件中
![]()
(3)修改FlashPrg.c文件中的接口函数
Init()初始化,将初始化的接口都放在其中

EraseChip(),檫除全片,把Flash接口中的檫除全片接口在此处调用

EraseSector(),区檫除,把Flash接口中的檫除区接口在此处调用

ProgramPage(),页编程,把Flash接口中的页编程接口在此处调用

Verify(),自己编写

(4)修改FlashDev.c文件FlashDevice,其中注意Device Type改成EXTSPI,外部SPI设备,0x90000000为调用起始地址,和单片机Flash地址区分开,0x00800000为外部Flash大小,此处为8M,页大小256字节,区大小4096字节

(5)将原工程中的启动文件屏蔽掉,右键->Options for file


(6)修改编译内容
Output->Name of Executable下的名称为最后生成算法的名称

User->Run #1中填写 cmd.exe /C copy "STM32F103ZET6_W25Q64\%L" ".\@L.FLM"
其中注意字段STM32F103ZET6_W25Q64为输出文件的目录
![]()

C/C++项下,注意以下几处的配置

Linker项下
取消第一项的勾选
选择Target.lin文件
在Misc中填写--diag_suppress L6305

之后再开始编译

编译成功后在工程目录下生成一个.FLM文件
笔者之前遇到过一个编译失败的情况
cannot use the address of 'RWPI (R9 used as SB)' function

后来发现是移植之前测试Flash驱动的时候,在Target中勾选了Use MicroLIB的原因,把这个勾选去掉之后,编译就通过了,没有错误

(7)生成FLM之后,将该生成文件移动到Keil安装目录下ARM/Flash文件夹中即可。

(8)在Keil/Flash Download项下点击Add,可以找到我们刚生成的算法

(9)笔者目前还没有试过如何使用,后面尝试之后再看是否需要记录使用过程
更多推荐



所有评论(0)