使用KEIL下载文件到单片机外置存储器的方法

给单片机下载程序的原理

给单片机下载程序一般有两种方法:
1,使用厂家提供的bootloader,使用特定软件通过串口等方式下载二进制文件到单片机的内置flash,这种方法的局限性是只能下载到厂家bootloader定义的存储器上;
2,使用调试器通过SWD/JTAG接口下载二进制文件。这种方式原理相对复杂,分为以下几步:
1)下载运行在ram中的bootloader程序到目标单片机的ram中
2)下载部分数据到目标单片机的ram中做数据缓冲
3)bootloader把缓冲区中的数据搬运到存储器上
4)重复2-3步直到所有数据下载完成

实用性

使用KEIL下载文件到单片机外置FLASH的方法适用于:
1,项目开发中目标板没有预留其他通信接口,或者处于开发初期,没有文件传输的对应上位机又急需下载数据做项目开发用。
2,JLINK,STLINK等调试器都提供了下载二进制文件到自定义存储器的接口,但每种不同的调试器接口都不同,需要分别适配,并且JLINK并没有提供开发bootloader的SDK。使用KEIL可以不受这些限制。
3,较小的数据文件可以直接下载到单片机的内置存储器,或者首先下载到单片机的内置flash然后通过单片机程序搬运到外置存储器来间接实现。本方法同样适用于要下载的数据文件大于或远大于单片机内置存储器的情况。

要解决的难点

1,怎样编写bootloader程序
2,KEIL软件只能下载编译好的axf程序文件,怎样把要下载的数据文件转化为axf文件

怎样编写bootloader

在KEIL里,这段bootloader程序被称为flash算法,打开KEIL的设置面板
flash算法选择面板
看到flash算法一部分来自于芯片的package包,一部分来自于mdkcore,选中一个package包中的flash算法,复制其文件路径用文件管理器打开(去掉末尾的文件名):
复制算法的文件路径
其中有两个文件夹,是flash算法的工程模板,复制一份出来做修改,我这里已经复制好了:
flash算法工程模板文件夹。然后打开工程,修改生成的文件名:
修改生成文件名
精简FlashPrg.c文件,删除其中所有宏定义和函数的具体实现,因为我们用不到,然后保留以下函数的定义:
flash算法函数接口定义
针对自己的存储器实现这些接口函数,主要是Init,EraseSector,EraseChip和ProgramPage这4个函数,其他函数直接返回成功即可。
然后修改FlashDev.c文件中的结构体参数,我这里使用的flash芯片是w25q128,根据具体的存储器做修改:
flash参数
现在可以编译程序,生成如下文件:
生成的flash算法文件
现在打开KEIL发现我们自定义的算法还是没有出现,这时打开Keil.STM32L4xx_DFP.pdsc文件,文件路径为D:\Keil_v5\ARM\Pack\Keil\STM32L4xx_DFP\2.2.0,
在这里插入图片描述
我这里使用notpad++打开,Ctrl+F搜索单片机型号,我这里搜索STM32L4R9ZIY,看到了想要的东西
添加flash算法
红框中是我添加的,同时修改flash起始地址为0x09000000和大小为0x01000000。然后保存,打开keil,发现我们的自定义flash出现在了选择框内:
flash选择框

使用KEIL下载文件

KEIL只能下载axf文件,因此我们要想办法生成axf为文件,可以自己制作,但最方便的还是使用KEIL自己编译,主要有以下几步:
1,使用bin2C软件把要下载的文件转化为C语言数组
2,把此C语言数组添加进KEIL工程中,工程中只能有这个C语言数组,不能包含任何函数或其他数据
3,修改链接脚本,设置程序编译地址,注释掉*.o (RESET, +First)这一行
链接脚本
4,编译
编译flash文件
会产生一个没有程序入口的警告,不管他,如图编译成功。
5,下载
选择自定义的flash算法,然后下载axf文件(跟平时下载程序没有任何区别)
下载flash文件