小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法
小猫爪:嵌入式小知识09-KEIL/IAR FLASH算法
1 前言
FLASH算法是什么东西?可能一开始接触MCU编程的人来说有点懵,简单的来说FLASH算法是一个工具,它的作用就是为了将代码烧进FLASH的工具。以KEIL将代码下载进FLASH中来举例,当我们写好代码后编程出可执行文件,这个时候我们只需要点击下载按钮,程序就会很快地被下载进FLASH中。其实当我们点击下载按钮后,KEIL干的第一件事是将FLASH算法下载进RAM中,然后仿真器会调用已经在RAM中的FLASH算法函数,对FLASH进行擦写,最后完成代码的下载。接下来,看看这个FLASH算法究竟为何物。
2 KEIL的FLASH算法
KEIL可以在下面的界面选择合适的FLASH算法。
对于SIP(system in a package)类型的芯片来说 ,都是内嵌的FLASH,所有厂家都会提供相应的FLASH算法,我们只管用就好了,但是对于有些外置FLASH的芯片来说,这时候就需要针对自己使用的FLASH特性自制FLASH算法了。
我们打开KEIL的安装目录下,打开文件夹C:\Keil_v5\ARM\Flash可以看到里面有各种文件夹和FLM文件,FLM/FLX文件就是KEIL独有的FLASH算法文件,文件夹都是各个产家的FLASH算法源码,我们可以在这基础上进行更改出自己的FLASH算法,KEIL还给我方便提供了原始模板_Template,也可以在这个模板上修改。
先打开这个模板工程,看看我们需要在里面完善一些什么?Oh My God!!!里面啥都没有?what?原来FLASH算法如此的简单,我们只需要完善5个功能性的函数,完善描述FLASH特性的结构体,就OK了。
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
};
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
/* Add your Code */
return (0); // Finished without Errors
}
int UnInit (unsigned long fnc) {
/* Add your Code */
return (0); // Finished without Errors
}
int EraseChip (void) {
/* Add your Code */
return (0); // Finished without Errors
}
int EraseSector (unsigned long adr) {
/* Add your Code */
return (0); // Finished without Errors
}
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
/* Add your Code */
return (0); // Finished without Errors
}
在FlashDevice 结构体中,有一个DevType参数,这个参数可以是以下几种情况:
#define UNKNOWN 0 // Unknown
#define ONCHIP 1 // On-chip Flash Memory
#define EXT8BIT 2 // External Flash Device on 8-bit Bus
#define EXT16BIT 3 // External Flash Device on 16-bit Bus
#define EXT32BIT 4 // External Flash Device on 32-bit Bus
#define EXTSPI 5 // External Flash Device on SPI
大家可以根据实际情况去选择。可以结合厂家的实例代码去实现自己的FLASH算设计。
(注意:①FLM和FLX文件都是FLASH算法文件,区别就是cortex-M核用是FLM,ARM7/ARM9用的是FLX。
②项目在user command界面调用了:cmd.exe /C copy "Objects\%L" ".\@L.FLM
"命令将输出文件复制到了本工程文件夹的母文件夹里,大家需要根据自己的需求修改命令,总之需要将生成的文件放在KEIL的FLASH文件夹下,这样在添加FLASH算法界面里才能找到。)
2 IAR的FLASH算法
IAR可以在下面的界面选择合适的FLASH算法。
让我们打开这个文件看看有啥(在IAR的安装目录里:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\config\flashloader\NXP),打开文件如下:
<?xml version="1.0" encoding="iso-8859-1"?>
<flash_board>
<pass>
<loader>$TOOLKIT_DIR$\config\flashloader\NXP\FlashIMXRT1050_EVK_FlexSPI.flash</loader>
<range>CODE 0x60000000 0x7f7fffff</range>
</pass>
</flash_board>
可以看到这个文件最后包含了一个.flash文件,找到这个文件打开发现它又包含了一个.out文件和.mac文件,俄罗斯套娃。mac文件中是对芯片的一些初始化操作,out文件才是FLASH算法编译出的可执行文件。
打开IAR的安装目录,找到路径:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\config\flashloader,IAR中自带的FLASH算法全部都在这个文件夹中了,它是按照芯片产商来划分的,但是这个文件夹中并没有源码,FLASH源码的算法在:C:\Program Files (x86)\IAR Systems\Embedded Workbench 8.4\arm\src\flashloader中,我们打开一个工程看一下对于IAR的FLASH算法中需要做什么。
以ST公司的STM32为例:
#if USE_ARGC_ARGV
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,
uint32_t link_address, uint32_t flags,
int argc, char const *argv[])
#else
uint32_t FlashInit(void *base_of_flash, uint32_t image_size,
uint32_t link_address, uint32_t flags)
#endif
{
return RESULT_OK;
}
uint32_t FlashWrite(void *block_start,
uint32_t offset_into_block,
uint32_t count,
char const *buffer)
{
return RESULT_OK;
}
uint32_t FlashErase(void *block_start,
uint32_t block_size)
{
return RESULT_OK;
}
uint32_t FlashSignoff(void)
{
//Restore modified registers
return RESULT_OK;
}
可以看到对于IAR的FLASH算法来说,它只需要拥有4个函数,大家可以根据实际情况去选择。可以结合厂家的实例代码去实现自己的FLASH算设计。
END
本文地址:https://blog.csdn.net/Oushuwen/article/details/109638219