MDK提供了Flash烧写程序接口,位于文件夹C:\Keil\ARM\Flash (不同的安装目录参考相对路径)。KEIL提供了各种的demo,打开_Template文件夹
有个NewDevice的工程文件,打开里面可以看到程序的架构。
分2部分,第一部分是Program Functions实现Flash的初始化,读,写等函数;第二部分是Device Description,是一个结构体变量,里面定义的是Flash的相关信息。
先看第一部分:
如果使用内部Flash只需实现以上5个函数就可以了,如果是外部Flash,还需实现
int BlankCheck (unsigned long adr, // Blank Check
unsigned long sz,
unsigned char pat);
和
unsigned long Verify (unsigned long adr, // Verify Function
unsigned long sz,
unsigned char *buf);
第二部分:
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
};
看注释基本就OK了,需要说明的一点是,Device Type 是个在FlashOS.h里面的宏定义,如下:
#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
到这里可能大家看明白了,KEIL的Flash不单单支持Onchip的,不单单支持Bus的,还支持SPI接口的。这个是SPI将是我们的所需要的。
编译工程,将生成:NEW_DEVICE.FLX ,并且copy到了flash文件夹里(注意查看工程的Command)
PS.还有另外一种格式是FLM,我下面会介绍不同的用法
新建一个工程,我们看看是否已经加入
厄,很遗憾没有。。。。。
肿么回事?
再看看这个工程,
OH my_ladygaga!
原来是有2种工程,我们再看看他们之间的区别,就单单从生成的文件来看,M系列用的FLash是flm,ARM7/ARM9用的是flx,果然不简单。。。。。。。
其他的当然是编译器不一样了,到了这里,元芳,你怎么看?
大人,此事必有蹊跷。
确实。为嘛,要不同区分不同的核心呢?
其实这个工程生成的最终产物,xxx.flx或者xxx.flm算是一个bin,他是从axf产生出来的。在KEIL需要操作Flash的时候,他就调用这个工程里面的函数,首先他会把xxx.flx或者xxx.flm加载到某个ram的区间,然后再调用。这个当中还是有那么一点复杂。我也没深入研究透彻。但是肯定的一点就是不同的MCU是需要不同的编译器的,因为指令都不一样,编译出来的flx自然是不一样的。
完了在再到工程里看看
哇哈哈,有了!
选择测试下。
第一次测试,OK鸟~~~~
同理,需要实现MDK像写内部Flash那样写外部SPIFlash,只需要重写这个Flash的烧写程序就行了。
我附上一个空白的程序给大家看看,其实是一个空操作,没对flash进行任何的操作。NewDevice.rar
需要说明的一点是,必须放到C:\Keil\ARM\Flash(不同的安装目录参考相对路径)因为里面会有一个FlashOS.h头文件,还有就是他会自动把生成的flx/flm copy到Flash\文件夹里。
(未完待续.........)