永发信息网

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

答案:1  悬赏:50  手机版
解决时间 2021-03-27 01:01
怎么重写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文件
首先是初始化



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的时钟的,偷懒没做。

扇区擦除函数


int EraseSector (unsigned long adr) {
SPIFlashSectorErase(adr-base_addr);
return (0); // Automatic Erase during Program Cycle
}
这里实现好的话,应该是根据SPFIlashSectorErase()的结果进行返回,到底是否成功擦除。需要注意的是,我这里地址全部都是MCU模拟的地址(或者可以叫虚拟地址),都需要把他转换为实际的物理地址,我就是直接减去base_addr。
写函数

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了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我的别克凯越汽车跑起路来一颠一颠的怎么回事
干天麻现在多少钱一公斤还有就是图片上的怎么
唐僧有几个名字
奔腾g2020cpu配什么显卡好
苯酚:氯仿:异戊醇为什么要25:24:1?
种植茶叶与管理
请问进入MHDD后,进行低格的命令是什么?
《八八穿越还珠之乾隆》txt全集下载
1868是多少世纪多少年代??
感觉身体一阵阵的发冷是怎么回事
月子中心为什么都说厦门华廷月子中心好呢?
床垫不平有什么说法
枣强新娘秘书店地址好找么,我有些事要过去,
自己做的葡萄酒保存的越久葡萄酒会很浓吗
我国生态板是否有甲醛含量e0级
推荐资讯
dn300给水球墨铸铁管都多长一根
—Are you content with Ang Lee’s new film
在括号里添上合适的词语
消防法中甲乙丙丁类厂房怎么区别
香酥烤蘑菇怎么做
您好~请问华硕quickfit关不掉,应该怎么办
为什么极昼极夜的纬度等于90度减直射点纬度
茶三酒四,三八现?是什么数字?
索尼2200e很索尼2500c对比
属牛一生的命运如何
朋友圈有人晒开保时捷 不过看到的是方向盘 重
葛溪驿 从全诗看 诗人运用哪些表达技巧来抒发
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?