目录
- 前言
- 一、字库芯片的驱动流程
- 二、如何使用高通字库接口
- 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底层驱动的实现、外部驱动函数与接口函数的连接以及字库初始化等关键步骤。通过这些步骤,开发者不仅可以快速获取字形数据,还可以将其有效地显示在屏幕上。此外,本文还提供了一些实用的接口调用和显示函数实现方法,以及如何进行初始化成功的检验,为开发者提供了全方位的技术支持。通过实践本文的指导,开发者可以提升嵌入式系统的用户体验,满足不同应用场景的需求,实现高效的文字显示功能。