keil烧写程序到内部flash(keil烧写hex文件)

keil5怎么把程序烧到板子上

Keil5使用JTAG烧写器连接板子,然后使用Flash Downloader功能进行程序烧写。首先,需要将程序编译生成Hex文件,然后选择烧写器,选择Hex文件,设置烧写地址,然后点击烧写按钮,即可完成烧写。

keil如何设置使得程序烧入flash后脱离仿真器ARM能够自主工作

这更多的可能是硬件有问题,而不是烧录问题。

Keil可以直接控制ULink烧录程序,的确不需要使用其他工具软件。

keil下往LPC2294的flash烧写程序,下列问题。。怎么回事啊。

确认下这个添加正确与否:

1、Open Options for Target - Utilities.

2、Choose the JLink Debugger and press Settings.

3、Press Add and choose the algorithm that fits your device. In case that the Address Range for the device is wrong select the algortihm and correct the Start and Size information.

4、Define the address spaces RAM for Algorithm and the Flash ROM area valid for the algorithm with Start and Size.

请问在keil里怎样将程序烧写到arm板的flash里面 需要怎样配置? 谢谢~~

首先,需要下载线,j-tag或者j-link或者其他的都可以;

其次,需要设置下载线,当然保证你的下载线是好的;不同的下载线可以再设置里面选择,配置不同的开发板芯片,不同的flash大小等等。

最后,编译,链接你的程序,生成二进制hex文件,然后下载到开发板里面;

ok。

怎么重写MDKFlash烧写程序之SPIFlash实例

struct FlashDevice const FlashDevice = {

FLASH_DRV_VERS, // Driver Version, do not modify!

"SPIFlash", // Device Name

EXTSPI, // Device Type

0x80000000, // Device Start Address

0x80000, // Device Size in Bytes (512kB)

256, // Programming Page Size

0, // Reserved, must be 0

0xFF, // Initial Content of Erased Memory

1000, // Program Page Timeout 1000 mSec

1000, // Erase Sector Timeout 1000 mSec

// Specify Size and Address of Sectors

0x01000, 0x00000, // Sector Size 4kB (512 Sectors)

SECTOR_END

};

Diver Version 不要动,在FlashOS.h里宏定义;

Device name 随意了,你喜欢就好;

DeviceType 选择EXTSPI,外部SPIFlash;

DeviceStart Address,这个需要斟酌下,原则上来看只需要避开内部Flash和RAM的地址就行了,我选了一个0x8000,0000

Device Size 大小,我设置了一个0x80000,512K字节

Programming Page Size 这个问题不大,不过,设置大一些应该传输的次数少一些,但是可能需要的ram会多些,自行选择;

Initial Content of Erased Memory 这个不懂嘛意思。。。。(跳过)

Program Page Timeout

Erase Sector Timeout 这2个就是超时了,一个是写页允许的最长时间,另外一个扇区擦除的允许的最长时间,单位是ms,

SECTOR_END 结尾符号

再看这个FlashPrg.c文件

首先是初始化

/*

* 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) {

switch(fnc)

{

case 1:

case 2:

case 3:

default:

SystemInit();

SD_HardWareInit();

base_addr = 0x80000000;

break;

}

return (0);

}

这里有好几个需要注意的地方。

1.初始化程序在擦除,写,和校验的时候都会可能调用,外部SPIFlash首先他不是直接挂在总线上的,不能通过总线对他进行操作,因此,在使用擦除,写,和校验(读)的时候,你得保证SPIflash的正常工作的。对于外部总线型的flash,他只需要总线初始化就行了,然后剩余的就是总线操作。SPIFlash你必须保证一下几点:

a.) MCU已经初始化完毕,可以给SPI控制器送clock

b.)SPI接口已经初始化完毕,可以读写flash

2.base_addr 的作用。这得配合之前的地址来说。0x80000000--- Device Start Address这个是我们给这个Flash虚构的,在MCU里面的一个地址,而实际的地址却不是这个。base_addr的作用就是用来映射这两者之间的关系。比如你需要把MCU的0x8000,0000映射到SPIFlash 的物理地址0x0000,0000 这个基地址就设置为0x8000,0000。如果你要把他映射到SPIFlash物理地址0x10000(64K)开始,那么就把base_addr设置为(0x8000,0000-0x10000)。

3.adr 没用过,不确定是否就是基地址,诸君可以试下。

4.clk 没实现,按理来说应该是调整SPIFlash的时钟的,偷懒没做。

扇区擦除函数

/*

* Erase Sector in Flash Memory

* Parameter: adr: Sector Address

* Return Value: 0 - OK, 1 - Failed

*/

int EraseSector (unsigned long adr) {

SPIFlashSectorErase(adr-base_addr);

return (0); // Automatic Erase during Program Cycle

}

这里实现好的话,应该是根据SPFIlashSectorErase()的结果进行返回,到底是否成功擦除。需要注意的是,我这里地址全部都是MCU模拟的地址(或者可以叫虚拟地址),都需要把他转换为实际的物理地址,我就是直接减去base_addr。

写函数

/*

* 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) {

//int i;

SPIFlashWritePage(adr-base_addr,buf,sz);

return (0);

}

校验函数

unsigned long Verify (unsigned long adr, // Verify Function

unsigned long sz,

unsigned char *buf)

{

uint32 ret;

ret = SPIFlashVerify(adr-base_addr,buf,sz);

return (adr + ret);

//return

}

这个需要说一下,就是返回值的问题,他实际上将返回addr+ret,这个ret,如果都一致,那么ret=sz,否则ret

如果有不一致,他将会退出,并且告诉KEIL,哦,你这个地址xxx不一致,校验到地址xxx 实际是多少,希望是多少。

我在这里没有列举SPIFlash的具体程序,主要是因为SPIFlash是个个性化差异很大的地方,涉及硬件,每个人都会有自己的硬件接口,都有自己的SPIFlash程序,因此,你只需要把你好使的SPIFLash程序移植到上面的函数就行了。

移植完毕以后就可以生成flx或者flm了。

361知讯网

本文链接:http://pdidw.com/keil/53074.html

发表评论

评论列表

还没有评论,快来说点什么吧~