本帖最后由 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的扇区写入和擦除,这样速度应该会有所提升。
- /* 更新字库 */
- void uart_FontLib(void)
- {
- uint8_t temp = 0;
- if(check_flash()!=ERR_FLASH_NOFOUND)
- {
- uart_ms=0;
- SPI_Flash_ChipErase();
- Board_UART_Init ( LPC_USART0, 115200, &UART0arg );
- Board_UART_SetRxBuff ( LPC_USART0, rx0buff, sizeof(rx0buff) );
- GUI_PutStrEx(2,120,(uint8_t *)"2.Send font lib files in 5S.",16);
- RxCount=0;
- while(uart_ms<=5000);
- Board_UART_Disable( LPC_USART0, 115200, &UART0arg );
- uart_ms=0;
- //更新标记
- temp=FLASH_UPDATA;
- SPI_Flash_Write(FLASH_FONTLIB_FLAG,&temp,1);
- }
- }
复制代码这个是更新字库函数,里面先擦除flash,打开串口,等待传输完成,然后关闭串口即可。是不是很简单,接收并写入的部分在串口中断里
- #include "spiflash.h"
- uint32_t uart_ms;
- void UART0_IRQHandler ( void )
- {
- uint8_t rx_char;
- uint32_t sta = LPC_USART0->INTSTAT;
- //Receive
- if ((sta & 0x01) > 0) {
- rx_char =LPC_USART0->RXDAT;
- SPI_Flash_Write(0x0100+(RxCount),(&rx_char),1);
- RxCount++;
- uart_ms=0;
- }
复制代码这是串口中断,接收到一个字节储存到flash的对应地址里去,其实一般情况下程序中不建议在中断里进行大量的操作,这里也这样,开辟一个缓冲区,最好是flash的一个扇区大小,接收满后在中断外把它一次性写入flash,继续下一轮,这样既快速,又不会占用太多中断时间,但这对上位机有要求要分段发送,这里我们采用简单的方法一就算了。
二、字库的准备和生成。
中文字库很多,网络到处都是,生成工具也很多,我是用的牧马字模软件,设置如下
生成的字库是c语言数组形式的,如果大家不写入flash的话可以把它include到程序项目里调用,前提是空间足够。
要通过串口发送,我们要把它转换为十六进制的文本形式,便于载入,我在网上找的一个小工具可以实现,请看附件。
三、串口下载
我用的串口工具是叫串口调试助手V3.6,但是杀毒一直报警,我加入白名单才过的,就不提供下载了,大家可以网上搜搜看有没有合适的。
串口使用的115200的波特率,所以下载起来速度大概在1分零10秒左右,这个速度比sd卡的慢得多,提高波特率的话需要匹配flash写入速度,这个大家可以尝试。
四、中文显示
下载完成后字库便位于flash的特定位置,我们要显示的时候就需要通过基本地址和文字的编码计算出偏移量,然后读取文字点阵信息,打点显示。
- /*******************************************************************************
- * Function Name : GetGBKCode
- * Description : 取GBK内码 数据
- * Input : - *c: 输入的GBK内码,如'我'
- * Output : - *pBuffer: 存放数据的指针
- * Return : None
- * Attention : 输入一个GBK内码,取得它的32Byte显示代码并将其存放到一个32byte的显示缓冲pBuffer[]中
- *******************************************************************************/
- void GetGBKCode(unsigned char* pBuffer,unsigned char * c)
- {
- unsigned char High8bit,Low8bit;
- High8bit=*c; /* 取高8位数据 */
- Low8bit=*(c+1); /* 取低8位数据 */
- SPI_Flash_Read_EX(0x100+((High8bit-0xb0)*94+Low8bit-0xa1)*32,pBuffer,32);
- }
复制代码就是通过这个函数实现的。
五、最终效果和资料
既然可以显示中文,我就把之前的界面字符用中文代替了,果然顺眼多了。
最终实现的效果如下
视频
字库工具
tool.rar
(242.26 KB, 下载次数: 14, 售价: 1 分芯积分)
源代码在这里
Uart_FontLib.rar
(802.23 KB, 下载次数: 80, 售价: 1 分芯积分)