怎么重写MDK(KEIL)Flash烧写程序

来源:互联网 发布:开发即时通讯软件 编辑:程序博客网 时间:2024/04/30 15:16

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\文件夹里


http://group.chinaaet.com/149/68464

原创粉丝点击