...32H7的SPI总线应用之SPIFlash的MDK下载算法制作
【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小时内删除。