【STM32H7教程】第84章STM32H7的SPI总线应⽤之SPIFlash的
MDK下载算法制作
完整教程下载地址:
第84章 STM32H7的SPI 总线应⽤之SPI Flash的MDK下载算法制作
本章节为⼤家讲解MDK下载算法制作⽅法。
84.1 初学者重要提⽰
84.2 MDK下载算法基础知识
84.3 创建MDK下载算法通⽤流程
84.4 SPI Flash的MDK下载算法制作
84.5 SPI Flash的MDK下载算法使⽤⽅法
84.6 实验例程说明
84.7 总结制作flash
84.1 初学者重要提⽰
1. SPI Flash的相关知识点可以看第78章和79章。
2. SPI Flash下载算法⽂件直接采⽤HAL库制作,⽅便⼤家⾃⼰修改。
84.2 MDK下载算法基础知识
Flash编程算法是⼀种⽤于擦除应⽤程序或将应⽤程序下载到Flash的程序代码。MDK本⾝⽀持的各种器件都⾃带下载算法,存放在MDK各种器件的软件包⾥⾯,以STM32H7为例,算法存放在\Keil\STM32H7xx_DFP\2.6.0\CMSIS\Flash(软件包版本不同,数值2.6.0不同),但不⽀持的需要我们⾃⼰制作,本章教程为此⽽⽣。
84.2.1 程序能够通过下载算法下载到芯⽚的核⼼思想
认识到这点很重要:通过MDK创建⼀批与地址信息⽆关的函数,实现的功能主要有初始化,擦除,编程,读取,校验等,然后MDK调试下载阶段,会将算法⽂件加载到芯⽚的内部RAM⾥⾯(加载地址可以通过MDK设置),然后MDK通过与这个算法⽂件的交互,实现程序下载,调试阶段数据读取等操作。
84.2.2 算法程序中擦除操作执⾏流程
擦除操作⼤致流程:
加载算法到芯⽚RAM。
执⾏初始化函数Init。
执⾏擦除操作,根据⽤户的MDK配置,这⾥可以选择整个芯⽚擦除或者扇区擦除。
执⾏Uinit函数。
操作完毕。
84.2.3 算法程序中编程操作执⾏流程
编程操作⼤致流程:
针对MDK⽣成的axf可执⾏⽂件做Init初始化,这个axf⽂件是指的⼤家⾃⼰创建应⽤程序⽣成的。
查看Flash算法是否在FLM⽂件。如果没有在,操作失败。如果在:
加载算法到RAM。
执⾏Init函数。
加载⽤户到RAM缓冲。
执⾏Program Page页编程函数。
执⾏Uninit函数。
操作完毕。
84.2.4 算法程序中校验操作执⾏流程
校验操作⼤致流程:
校验要⽤到MDK⽣成的axf可执⾏⽂件。校验就是axf⽂件中下载到芯⽚的程序和实际下载的程序读出来做⽐较。
查看Flash算法是否在FLM⽂件。如果没有在,操作失败。如果在:
加载算法到RAM。
执⾏Init函数。
查看校验算法是否存在
如果有,加载应⽤程序到RAM并执⾏校验。
如果没有,计算CRC,将芯⽚中读取出来的数据和RAM中加载应⽤计算输出的CRC值做⽐较。
执⾏Uninit函数。
替换BKPT(BreakPoint断点指令)为 B. 死循环指令。
执⾏RecoverySupportStop,恢复⽀持停⽌。
执⾏DebugCoreStop,调试内核停⽌。
运⾏应⽤:
执⾏失败。
执⾏成功,再执⾏硬件复位。
操作完毕,停⽌调试端⼝。
84.3 创建MDK下载算法通⽤流程
下⾯是MDK给的⼀种⼤致操作流程,不限制必须采⽤这种⽅法,⾃⼰创建也可以的。
84.3.1 第1步,使⽤MDK提供好的程序模板
位于路径:\Keil\ARM\Pack\ARM\CMSIS\version\Device\_Template_Flash。
效果如下:
84.3.2 第2步,修改⼯程名
MDK提供的⼯程模板原始名字是NewDevice.uvprojx,⼤家可以根据⾃⼰的需要做修改。⽐如修改为MyDevice.uvprojx。
84.3.3 第3步,修改使⽤的器件
在MDK的Option选项⾥⾯设置使⽤的器件。
84.3.4 第4步,修改输出算法⽂件的名字
这个名字是⽅便⽤户查看的,⽐如设置为stm32h7,那么输出的算法⽂件就是stm32h7.flm。
注:MDK这⾥设置的名字与下⾯位置识别出来的算法名⽆关:
这个名字是在FlashDev.c⾥⾯定义的。
84.3.5 第5步,修改编程算法⽂件FlashPrg.c
模板⼯程⾥⾯仅提供了接⼝函数,内容需要⽤户⾃⼰填。
/*
Mandatory Flash Programming Functions (Called by FlashOS):
int Init (unsigned long adr, // Initialize Flash
unsigned long clk,
unsigned long fnc);
int UnInit (unsigned long fnc); // De-initialize Flash
int EraseSector (unsigned long adr); // Erase Sector Function
int ProgramPage (unsigned long adr, // Program Page Function
unsigned long sz,
unsigned char *buf);
Optional Flash Programming Functions (Called by FlashOS):
int BlankCheck (unsigned long adr, // Blank Check
unsigned long sz,
unsigned char pat);
int EraseChip (void); // Erase complete Device
unsigned long Verify (unsigned long adr, // Verify Function
unsigned long sz,
unsigned char *buf);
- BlanckCheck is necessary if Flash space is not mapped into CPU memory space - Verify is necessary if Flash space is not mapped into CPU memory space
- if EraseChip is not provided than EraseSector for all sectors is called
*/
/*
* Initialize Flash Programming Functions
* Parameter: adr: Device Base Address
* clk: Clock Frequency (Hz)
* fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
/* Add your Code */
return (0); // Finished without Errors
}
/
*
* De-Initialize Flash Programming Functions
* Parameter: fnc: Function Code (1 - Erase, 2 - Program, 3 - Verify)
* Return Value: 0 - OK, 1 - Failed
*/
int UnInit (unsigned long fnc) {
/* Add your Code */
return (0); // Finished without Errors
}
/*
* Erase complete Flash Memory
* Return Value: 0 - OK, 1 - Failed
*/
int EraseChip (void) {
/* Add your Code */
return (0); // Finished without Errors
}
/*
* Erase Sector in Flash Memory
* Parameter: adr: Sector Address
* Return Value: 0 - OK, 1 - Failed
*/
int EraseSector (unsigned long adr) {
/* Add your Code */
return (0); // Finished without Errors
}
/*
* Program Page in Flash Memory
* Parameter: adr: Page Start Address
* sz: Page Size
* buf: Page Data
* Return Value: 0 - OK, 1 - Failed
*/
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
/* Add your Code */
return (0); // Finished without Errors
}
84.3.6 第6步,修改配置⽂件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
};
注:名字New Device 256kB Flash就是我们第4步所说的。MDK的Option选项⾥⾯会识别出这个名字。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论