在做嵌入式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)笔者目前还没有试过如何使用,后面尝试之后再看是否需要记录使用过程