打印
[8/16-bit MCU]

串口下载中文字库到flash

[复制链接]
2336|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
风的样子|  楼主 | 2015-12-18 20:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过串口下载中文字库到板子上的flash芯片里。之所以产生这个想法是因为板子意外带的那个大彩屏lcd引起的,本来以为是官方板子,准备了一块小单色屏(看这里,第一周2-添加一个小显示屏并驱动成功),但现在有了彩屏,肯定要做得漂漂亮亮的,上图片和gui之外,中文的支持是必不可少的,那怎么把字库放进来呢,中文字库有2xxKB大,放flash里面占资源,一看板子上有块flash片子,这不现成的么,开干。

相关帖子

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



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

使用特权

评论回复
板凳
风的样子|  楼主 | 2015-12-18 20:45 | 只看该作者
    /* 更新字库 */
    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);
            }
    }

使用特权

评论回复
地板
风的样子|  楼主 | 2015-12-18 20:46 | 只看该作者
这个是更新字库函数,里面先擦除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;
        }

使用特权

评论回复
5
风的样子|  楼主 | 2015-12-18 20:46 | 只看该作者
这是串口中断,接收到一个字节储存到flash的对应地址里去,其实一般情况下程序中不建议在中断里进行大量的操作,这里也这样,开辟一个缓冲区,最好是flash的一个扇区大小,接收满后在中断外把它一次性写入flash,继续下一轮,这样既快速,又不会占用太多中断时间,但这对上位机有要求要分段发送,这里我们采用简单的方法一就算了。二、字库的准备和生成。

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



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

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

使用特权

评论回复
6
风的样子|  楼主 | 2015-12-18 20:48 | 只看该作者
三、串口下载

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



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



四、中文显示

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

使用特权

评论回复
7
风的样子|  楼主 | 2015-12-18 20:48 | 只看该作者
/*******************************************************************************
* 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);
}

使用特权

评论回复
8
echo休| | 2017-8-5 11:42 | 只看该作者
你的附件呢楼主??

使用特权

评论回复
9
mugua521| | 2017-8-30 14:28 | 只看该作者
楼主一忘,就是几年了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

247

帖子

1

粉丝