如何把字库生成直接烧入SPI

如何把字库生成直接烧入SPI,第1张

1.使用一片SPI flash,比如W25X16,有2M的空间给你储存点阵字库。可以将汉字字库文件在电脑上拷贝到SD卡,单片机通过FAT文件系统读取字库文件数据复制到W25X16中。

2.将SD卡当做一个超大的flash,先由PC通过串口将字库数据逐个传入单片机,单片机再兄乎通过SPI传给SD卡,这样SD卡中斗尘圆就储存好字库,不过,这种空塌方法不利于字库更新。

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了。

STC单片机烧录代码步骤:(以下文字由wannenggong经键盘录入)

1、需要有一根下载线。可以是连接电脑主板原生串行9针COM端口经MAX232芯片转换的串口连接线;也可以是连接电脑USB端口经CP21xx或CH3xx芯片转换的串口接线,如果使用的是USB转串口的下载线,使用前需要在电脑中安装相应转换芯片的驱动程序,目前使用最多的是CH340下载线,驱动安装成功后可以在电脑“设备管理器”端口列表中看到:USB-SERIAL CH340(COMx)项、此时需要牢记这个x也就是串口号码,例如:COM4。

2、连接下载线与STC单片机的串口1(P3.0,P3.1端口),此时需要注意的是下载线的TXD/RXD与单片机的TXD/RXD引线需要交叉连接。

3、到STC单片机官网下载最新版的STC-spi软件,打开软件后(1)、选择待下载芯片的型号。(2)、选择串口。(3)、设置波特率,最低波特率设为2400最高可以根银咐芦据不同芯片从低到高试着设置。(4)、打开锋带编译通过的.hex目标文件。

4、先不给单片机通电,点击“下载/编程”,等待3秒左右为单片机上电,接下来可以看到软件窗口的自动 *** 作的各项提示和下载进度条,等待一段时间即可完成下简州载。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12496081.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存