3843|4

2002

帖子

24

TA的资源

五彩晶圆(高级)

楼主
 

【LPC54100】第五周-串口下载中文字库到flash [复制链接]

本帖最后由 shower.xu 于 2015-5-15 14:34 编辑

总觉得时间和口袋里的钱一样,越来越不够用了.....

先把所有帖子做个汇总:
【LPC54100】第一周-分享部分原理图和blink跑起
第一周2-添加一个小显示屏并驱动成功
【LPC54100】第二周-添加按键处理程序并在LCD上显示
【LPC54100】第三周-彩屏驱动并移植GUI
【LPC54100】第二周-添加按键处理程序并在LCD上显示
【LPC54100】第四周-状态机多任务实现
【LPC54100】第五周-串口下载中文字库到flash

好了,牢骚发完,谈谈今天的主题:通过串口下载中文字库到板子上的flash芯片里。之所以产生这个想法是因为板子意外带的那个大彩屏lcd引起的,本来以为是官方板子,准备了一块小单色屏(看这里,第一周2-添加一个小显示屏并驱动成功),但现在有了彩屏,肯定要做得漂漂亮亮的,上图片和gui之外,中文的支持是必不可少的,那怎么把字库放进来呢,中文字库有2xxKB大,放flash里面占资源,一看板子上有块flash片子,这不现成的么,开干。

先来张最终效果:





一、字库下载到flash有很多途径,之前做过通过sd卡更新,实现起来需要sd卡接口,移植文件系统,操作flash,步骤比较多,但是速度快很多,这块板子没带sd模块,虽然可以用spi接口外接,但是考虑到复杂度,另一方面想玩新鲜的,决定实现串口下载。



串口下载字库主要用到两部分,一是uart口模块,我们选择的串口0,而且不用板子上的dp9口,直接把板子上的JP8调开,用串口模块直接引过来,方便好用。二部分是flash的spi接口,实现对flash的操作,这个更简单了,我们只需要初始化,芯片擦除,写入和读取几个函数就好了,当然如果你想提速,可以建个大的缓冲区,实现对flash的扇区写入和擦除,这样速度应该会有所提升。

  1. /* 更新字库 */
  2. void uart_FontLib(void)
  3. {
  4.         uint8_t temp = 0;
  5.         if(check_flash()!=ERR_FLASH_NOFOUND)
  6.         {
  7.                 uart_ms=0;
  8.                 SPI_Flash_ChipErase();
  9.                 Board_UART_Init ( LPC_USART0, 115200, &UART0arg );
  10.                 Board_UART_SetRxBuff ( LPC_USART0, rx0buff, sizeof(rx0buff) );
  11.                 GUI_PutStrEx(2,120,(uint8_t *)"2.Send font lib files in 5S.",16);        
  12.                 RxCount=0;
  13.                 while(uart_ms<=5000);
  14.                 Board_UART_Disable( LPC_USART0, 115200, &UART0arg );                                                        
  15.     uart_ms=0;
  16.                 //更新标记
  17.                 temp=FLASH_UPDATA;
  18.                 SPI_Flash_Write(FLASH_FONTLIB_FLAG,&temp,1);
  19.         }
  20. }
复制代码
这个是更新字库函数,里面先擦除flash,打开串口,等待传输完成,然后关闭串口即可。是不是很简单,接收并写入的部分在串口中断里

  1. #include "spiflash.h"
  2. uint32_t uart_ms;
  3. void UART0_IRQHandler ( void )
  4. {
  5.         uint8_t rx_char;
  6.         uint32_t sta = LPC_USART0->INTSTAT;
  7.         //Receive
  8.         if ((sta & 0x01) > 0) {
  9.                 rx_char =LPC_USART0->RXDAT;
  10.                 SPI_Flash_Write(0x0100+(RxCount),(&rx_char),1);
  11.                 RxCount++;
  12.                 uart_ms=0;
  13.         }
复制代码
这是串口中断,接收到一个字节储存到flash的对应地址里去,其实一般情况下程序中不建议在中断里进行大量的操作,这里也这样,开辟一个缓冲区,最好是flash的一个扇区大小,接收满后在中断外把它一次性写入flash,继续下一轮,这样既快速,又不会占用太多中断时间,但这对上位机有要求要分段发送,这里我们采用简单的方法一就算了。



二、字库的准备和生成。

中文字库很多,网络到处都是,生成工具也很多,我是用的牧马字模软件,设置如下



生成的字库是c语言数组形式的,如果大家不写入flash的话可以把它include到程序项目里调用,前提是空间足够。

要通过串口发送,我们要把它转换为十六进制的文本形式,便于载入,我在网上找的一个小工具可以实现,请看附件。



三、串口下载

我用的串口工具是叫串口调试助手V3.6,但是杀毒一直报警,我加入白名单才过的,就不提供下载了,大家可以网上搜搜看有没有合适的。



串口使用的115200的波特率,所以下载起来速度大概在1分零10秒左右,这个速度比sd卡的慢得多,提高波特率的话需要匹配flash写入速度,这个大家可以尝试。



四、中文显示

下载完成后字库便位于flash的特定位置,我们要显示的时候就需要通过基本地址和文字的编码计算出偏移量,然后读取文字点阵信息,打点显示。

  1. /*******************************************************************************
  2. * Function Name  : GetGBKCode
  3. * Description    : 取GBK内码 数据
  4. * Input          : - *c: 输入的GBK内码,如'我'
  5. * Output         : - *pBuffer: 存放数据的指针
  6. * Return         : None
  7. * Attention                 : 输入一个GBK内码,取得它的32Byte显示代码并将其存放到一个32byte的显示缓冲pBuffer[]中
  8. *******************************************************************************/
  9. void GetGBKCode(unsigned char* pBuffer,unsigned char * c)
  10. {
  11.    unsigned char High8bit,Low8bit;
  12.    High8bit=*c;     /* 取高8位数据 */
  13.    Low8bit=*(c+1);  /* 取低8位数据 */

  14.    SPI_Flash_Read_EX(0x100+((High8bit-0xb0)*94+Low8bit-0xa1)*32,pBuffer,32);
  15. }
复制代码
就是通过这个函数实现的。



五、最终效果和资料

既然可以显示中文,我就把之前的界面字符用中文代替了,果然顺眼多了。

最终实现的效果如下





视频





字库工具

tool.rar (242.26 KB, 下载次数: 14, 售价: 1 分芯积分)



源代码在这里

Uart_FontLib.rar (802.23 KB, 下载次数: 80, 售价: 1 分芯积分)



此帖出自NXP MCU论坛

最新回复

rom
看起很清爽,不错  详情 回复 发表于 2015-6-11 13:18
点赞 关注
 

回复
举报

22

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
如果改用GPDMA会不会更加犀利呢??串口DMA到SRAM,然后SRAM再DMA到SPI。可行么??
此帖出自NXP MCU论坛
 
 
 

回复

16

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
怎么没看到工程文件呀?
此帖出自NXP MCU论坛
 
 
 

回复

2002

帖子

24

TA的资源

五彩晶圆(高级)

4
 
附件里有
此帖出自NXP MCU论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
看起很清爽,不错
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表