系统中使用过多的汉字会出现芯片容量不够用的问题,可将数据存储在外部FLASH中,在需要使用时进行调用即可。本文是通过STM32串口1实现对W25X16的汉字字库存储。软件层面,配置串口1和SPI1即可,程序初始化后,在对W25X16进行写之前,必须先擦除,可以一个字节、一页、一扇区、一块以及整片擦除。写字库前,我们用整片擦除方式,如下:
整个程序中,关键在于串口接收中断函数的编写,如下:
u32 WriteAddress=0;
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GeTITStatus(USART1,USART_IT_RXNE)!=RESET)
{
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
Res=USART_ReceiveData(USART1);
SPI_Flash_Write_NoCheck(&Res,WriteAddress,1);
WriteAddress++;
}
}
也就是从地址0开始,一个字节一个字节进行写入。
代码为最简单的通信代码,不过多说,然后打开串口助手,进行配置,勾选启用文件数据源,选择下载或者自己做好的字库文件;勾选按十六进制发送,在芯片完全擦除后再进行发送:
经过几十秒的等待,字库会发送完成,通过看发送的字节数与字库的字节数对比,即可知道是否发送完毕。(上图中发送字节数不是字库字节数)前面的文章有写过汉字点阵获取的方法,此处不再赘述。如此,即可通过SPI访问外部FLASH来调用汉字,并将其显示在显示屏上。同样对于asiic码可以将其写入某个块中,然后通过地址的偏移来计算对应的字符。
对于图片的存储也是相同原理,在之前实现汉字显示的基础上,笔者测试了图片的显示,而且获得正确的显示。笔者使用的显示屏为TFT1.44的,为128*128,占用32768字节,两张图片正好占用65536字节,也就是64Kb,而W25X16一个块是64Kb,进行块擦除后,每个块可以载入两张图片,非常完美。基本程序相同,只是此时因为字库的写入,不使用片擦除指令,而使用块擦除实现对未使用块区的擦除:
计算了下,字库占用了3个块多点,因此彻底避开此区+在:
可以打开看下字库文件,然后对获取的图片文件进行编辑即可。下面贴出自己编写的图片显示的代码:
void ShowImage_W25X16(u32 WriteAddr)
{
int i;
u32 j;
unsigned char picH,picL;
u8 datatemp[2];
Lcd_Clear(WHITE);
Lcd_SetRegion(0,0,127,127);
for(j=0;j《1024;j++)
for(i=0;i《16;i++)
{
SPI_Flash_Read(datatemp,WriteAddr,2);
picL=datatemp[0];
picH=datatemp[1];
WriteAddr=WriteAddr+2;
LCD_WriteData_16Bit(picH《《8|picL);
}
}
技术专区
- 基于高级驾驶员辅助系统汽车应用方案
- 利用光线追踪对光线与设计及交互进行建模
- 嵌入式视觉和网络边缘智能应用市场前景愈加明朗
- 儒卓力亚洲总经理:聚焦四个核心领域,提供最佳电子供应链服
- 浅谈51单片机指令执行的过程