高通点阵字库芯片在32位MCU上的应用实践

 目录

  • 前言
  • 一、字库芯片的驱动流程
  • 二、如何使用高通字库接口
    • 1.初始化字库芯片
    • 2.调用接口获取字形数据
    • 3.显示字符
    • 4.显示函数实现
    • 5.显示函数实现(优化版)
    • 6.检验初始化是否成功
  • 总结


前言

大家好,本章内容将为大家讲解在32位MCU上如何驱动和使用高通点阵字库芯片,实现文本的显示。高通字库及GT-FontLab是目前嵌入式字库领域主流的商用字库和开源字库解决方案。高通字库芯片提供了软硬件一体的一站式解决方案,解决包括字库设计、字库合成、编码排编、调用算法以及软硬件调试、测试等工作。


一、字库芯片的驱动流程

本章将重点讲解如何在32位MCU平台上集成高通点阵字库芯片,来实现简单快速的文字显示功能。其步骤主要分为五步。

           
 这里使用GTDB4AP-28型号开发板,板载AT32F437VGT7型号mcu,搭配GT30L32S4W字库芯片为例(演示操作):

 1. 连接字库芯片与MCU参考字库芯片规格书的引脚排布将字库芯片与mcu通过SPI4接口连接,即CS-PB6,SCK-PB7,MISO-PB8以及MOSI-PB9引脚

2. 添加字库文件到Keil工程项目从高通字库官网或者官方技术渠道获取获取字库资料压缩文件,将字库资料压缩文件中的.a或.lib的库文件与.h头复制到keil工程项目的文件夹中,打开keil软件将静态库文件添加进来。

3.实现字库芯片的SPI底层驱动初始化PB6,PB7,PB8,PB9引脚,初始化SPI4,使能SPI4。初始化代码如下:

oid GT_SPI_init(void)
{
  gpio_init_type gpio_initstructure;
  spi_init_type spi_init_struct;
  
  crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
  crm_periph_clock_enable(CRM_DMA1_PERIPH_CLOCK, TRUE);
  /* software cs, pa4 as a general io to control flash cs */
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
  gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins = GPIO_PINS_6;
  gpio_init(GPIOB, &gpio_initstructure);
  
  /* hold */
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;  
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
  gpio_initstructure.gpio_mode           = GPIO_MODE_OUTPUT;  
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins = GPIO_PINS_3;
  gpio_init(GPIOB, &gpio_initstructure);
  gpio_bits_set(GPIOB, GPIO_PINS_3);
  
  /* sck */
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;  
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;  
  gpio_initstructure.gpio_pins = GPIO_PINS_7;
  gpio_init(GPIOB, &gpio_initstructure);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE7, GPIO_MUX_6);
  
  /* miso */
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;   
  gpio_initstructure.gpio_pins = GPIO_PINS_8;
  gpio_init(GPIOB, &gpio_initstructure);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE8, GPIO_MUX_6);
  
  /* mosi */
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;   
  gpio_initstructure.gpio_pins = GPIO_PINS_9;
  gpio_init(GPIOB, &gpio_initstructure);
  gpio_pin_mux_config(GPIOB, GPIO_PINS_SOURCE9, GPIO_MUX_6);
  
  FLASH_CS_HIGH();
  crm_periph_clock_enable(CRM_SPI4_PERIPH_CLOCK, TRUE);
  spi_default_para_init(&spi_init_struct);
  spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_8;
  spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  spi_init(SPI4, &spi_init_struct);
  spi_enable(SPI4, TRUE);
}

4. 实现外部驱动函数与接口函数的连接:实现.h头文件中带有extern关键字声明的外部驱动函数,将底层驱动与接口函数接通,(外部函数声明有几个就需要实现几个),GT30L32S4W芯片中声明了一个外部驱动函数, 

* 外部函数声明 */
extern unsigned char gt_read_data(unsigned char* sendbuf , unsigned char sendlen , unsigned char* receivebuf, unsigned int receivelen);

函数实现的方式不唯一,关键在于实现函数功能即可,gt_read_data函数功能是先发送sendlen个字节的sendbuf数据,再接收receivelen个字节的数据,存储到receivebuf中。驱动的实现在FAE发的参考资料的“参考文件“文件夹里都有相应的示例代码参考,或从高通官网(高通字库-字库芯片 (gaotongfont.cn))下载获取 (其中的SPI1_ReadWriteByte函数为mcu示例代码实现的SPI读取发送函数),

unsigned char gt_read_data(unsigned char* sendbuf , unsigned char sendlen , unsigned char* receivebuf, unsigned int receivelen){
    unsigned int i;
    Rom_csL;          //片选选中字库芯片

    for(i=0;i<sendlen;i++){
        SPI1_ReadWriteByte(sendbuf[i]);
    }
    for(i=0;i<receivelen;i++){
        receivebuf[i]=SPI1_ReadWriteByte(0x00);
    }
    Rom_csH;
}

5. 调用字库初始化函数进行字库初始化:即可通过编码调用.h中声明的接口函数获取字库的字形数据。

* ----------------------------------------------------------- */
//字库初始化(在调用字形接口前,请务必在初始化SPI后调用以进行字库初始化)
int GT_Font_Init(void);
/* ----------------------------------------------------------- */

二、如何使用高通字库接口?

步骤1.初始化字库芯片

调用以下函数进行初始化:

GT_SPI_init();          //字库芯片SPI初始化
GT_Font_Init();         //初始化字库芯片

步骤2.调用接口获取字形数据

调用以下函数获取指定编码和字体大小的字形数据:

   ASCII_GetData(0x41,ASCII_8X16,buf);

其中,0x41为ASCII编码,ASCII_8X16为字体大小,DZ_Data为存放字形数据的数组。

步骤3.显示字符

调用以下函数将字形数据显示在屏幕上:

    Display_W(buf,10,20,8,16);

其中,DZ_Data为字形数据数组,10和10为字符显示的起始坐标,8和16为字体的宽度和高度。

步骤4.显示函数实现

使用以下函数实现字符的显示:

void Display_W(unsigned char *pBits,unsigned int x,unsigned int y,unsigned int widt,unsigned int high)
{
    unsigned int i,j,k,n;
    unsigned char temp;
    n = 0;
    for( i = 0;i < high; i++)
    {
        for( j = 0;j < ((widt+7)>> 3);j++)
        {
            temp = pBits[n++];
            for(k = 0;k < 8;k++)
            {
                if(((temp << k)& 0x80) == 0 )
                {
                    /* 显示一个背景像素点 */
                    lcd_drawpoint( x+k+(j*8), y+i, WHITE);
                }
                else
                {
                    /* 显示一个字体像素点 */
                    lcd_drawpoint( x+k+(j*8), y+i, BLACK);
                }
            }
        }
    }
}

步骤五:显示函数实现(优化版)

使用以下函数实现字符的显示(优化版):

void Display_W_ram(unsigned char *pBits,unsigned int x,unsigned int y,unsigned int widt,unsigned int high)
{
    unsigned int i,j,k,n;
    unsigned char temp;
    n = 0;
    widt = ((widt+7) >> 3) << 3;//8的倍数取整
    lcd_setblock(x, y, widt + x -1, high + y - 1);  //设置刷屏区域

    for( i = 0;i < high; i++) //高度行
    {
        for( j = 0;j < (widt >> 3);j++)//每一行字节数
        {
            temp = pBits[n++];
            for(k = 0;k < 8;k++)//字节内每位
            {
                if(((temp << k)& 0x80) == 0 )
                {
                    /* 写背景像素点ram */
                    lcd_writeonepoint(WHITE);
                }
                else
                {
                    /* 写字体像素点ram */
                    lcd_writeonepoint(BLACK);
                }
            }
        }
    }
}

步骤六:检验初始化是否成功

如果无法正确显示或获取数据,请确保硬件正常。在硬件正常的情况下,可以运行以下代码进行检验:

unsigned char tmp_buf[4];
tmp_buf[0] = 0x9f;
gt_read_data(tmp_buf, 1, tmp_buf, 3);

如果tmp_buf[0]和tmp_buf[1]不为0也不为FF,且不相等,且tmp_buf[2]是以1开头的十六进制数据,则初始化大概率是成功的。如果GT_Font_Init()返回值仍为-1或0,请联系高通官方技术支持人员进行处理。

总结

本文详细介绍了如何在32位MCU上驱动和使用高通点阵字库芯片的全过程,包括硬件连接、字库文件的添加、SPI底层驱动的实现、外部驱动函数与接口函数的连接以及字库初始化等关键步骤。通过这些步骤,开发者不仅可以快速获取字形数据,还可以将其有效地显示在屏幕上。此外,本文还提供了一些实用的接口调用和显示函数实现方法,以及如何进行初始化成功的检验,为开发者提供了全方位的技术支持。通过实践本文的指导,开发者可以提升嵌入式系统的用户体验,满足不同应用场景的需求,实现高效的文字显示功能。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值