基于SPI闪存和主存IAP的嵌入式平台中文显示系统设计

2022-03-22 08:04黄克亚
实验室研究与探索 2022年12期
关键词:字库微控制器扇区

黄克亚, 陈 良

(苏州大学机电工程学院,江苏 苏州 215131)

0 引 言

中文显示是嵌入式系统的普遍需求,可实现界面友好,系统易用性大幅提升。实现中文显示存在两条技术路线,一种方法是将汉字字模数据定义为常量数组,存储于系统主存储器当中,显示时直接访问主存,速度很快,但仅可存储个别汉字,需要手动取模,通用性较差;另一种方法是将所有汉字包含全角英文字符,取字模后存储于外部存储器当中,显示时先访问外存获取字模数据再调入内存完成显示,系统通用性强,可实现任意汉字以及部分特殊字符显示,但显示速度较慢,对嵌入式系统实时性有一定的影响[1-2]。

因为嵌入式系统需要显示的汉字是有限且相对固定的,本文将上述两种技术方法组合在一起,设计了一通用嵌入式平台中文显示系统,在外部SPI(Serial Peripheral Interface)接口Flash 存储器上存储中文字库,在片内利用IAP(In Application Programming)技术缓冲存储常用汉字字模数据,取长补短,兼顾系统通用性和快速性,且中文显示平台对用户和程序员来说是完全透明的[3-6]。

1 系统硬件设计

1.1 系统结构

嵌入式系统中文显示平台硬件结构如图1 所示,主控芯片选择基于ARM Cortex-M4 内核的性能强劲的STM32F407ZET6 微控制器,168 MHz 主频,512 KB 片内Flash ROM,完备的FSMC 接口,更快的USART 和SPI通信速度。使用灵活静态存储控制器(Flexible Static Memory Controller,FSMC)连接数码显示器和TFT LCD两个显示设备,CPU 引脚资源利用率高,访问速度快。使用SPI接口连接片外Flash ROM存储器W25Q128。板载CMSIS-DAP 调试器支持JTAG/SWD两种调试方式,同时还具有串口通信功能。

图1 嵌入式平台硬件结构

1.2 显示设备

嵌入式平台显示系统硬件连接如图2 所示,系统配备双显示终端,数码显示器为6 位共阳数码管,PNP三极管驱动,74HC573D 锁存;液晶显示器为71.12 mm(2.8 in)全彩TFT LCD 显示模块,240 ×320 像素,ILI9341 驱动,16 位8080 并行接口。设计时使用FSMC总线的存储块1 子区4 连接TFT LCD,FSMC接口与LCD数据、控制信号直接相连,由FSMC 控制器产生LCD的8080 控制时序。数码显示器通过锁存器与LCD复用数据线,FSMC 总线的存储块1 子区3 片选信号反相后作为数码显示器的选通信号[7-11]。

图2 嵌入式平台显示设备连接电路

1.3 外部存储器

Flash结合了ROM和RAM的长处,不仅具备电可擦编程只读存储器(E2PROM)的功能,还可以快速读取数据,具有非易失性随机访问存储器的优势。为存储字库数据,实验平台扩展了一片容量为128 Mbit 的NOR Flash 存储芯片W25Q128,连接至微控制器的SPI1 接口,硬件电路如图3 所示。W25Q128 芯片的DO、DI、CLK 引脚分别接至微控制器的SPI1_MISO、SPI1_MOSI、SPI1_SCK。微控制器的PB14 引脚连接存储器的引脚,低电平选中。存储芯片和引脚接VDD,即不使用写保护和数据保持功能。

图3 嵌入式平台W25Q128连接电路

1.4 CMSIS-DAP调试器

CMSIS-DAP调试器硬件电路如图4 所示,电路核心为F103T8U6 微控制器,通过运行监控程序,模拟JTAG/SWD两种调试协议,可实现一键下载,单步执行、连续运行等全部调试方式。监控程序还虚拟出一个USART串行接口,用于嵌入式平台与上位机双向数据通信。CMSIS-DAP调试器可实现嵌入式平台下载、调试、通信、供电功能四合一,同时还具有开源、高速、免驱动等优点。

图4 CMSIS-DAP调试器硬件电路

2 系统软件设计

2.1 字库生成与存储

要实现中文显示,需要对每种字体制作相应的中文字库,并将字库存储于片外SPI Flash当中。

2.1.1 字库生成

中文显示系统采用GB2312 字符集,包括汉字、全角英文及部分特殊字符共8 178 个字符,每个字符均设置4 种字体,分别为12 ×12、16 ×16、24 ×24、32 ×32,要实现中文显示第一步就需要制作不同字体的字库文件。

用PCtoLCD2002 软件制作宋体16 ×16 中文字库设置界面如图5 所示,字模选项设置为:阴码、逆向、逐行式,对于不同驱动芯片扫描方式会有所差别。对于其他字号取模只需修改图5 中红色框线标出的字宽和字高数字即可。之后单击工具栏“导入大量文本或一个文本文件生成字库”按钮,保持默认选项,单击“生成国标汉字库”,即可生成二进制字库文件。依据上述方法,依次生成4 种字体所对应的字库文件。

图5 中文字库制作界面

2.1.2 地址分配

制作生成的中文字库相对于微控制器主存来说是海量数据,所以系统外扩了一片SPI接口的NOR Flash存储器W25Q128,用于存储中文字库信息。

W25Q128 总容量为16 MB,存储器的访问单位分为块、扇区和页。因为擦除和写入都是以扇区为单位进行的,所以只需了解整个存储空间划分为4 096 个扇区,每个扇区的大小为4 096 byte,由此可知存储器的24 位地址的高12 位表示扇区号,低12 位表示扇区内的字节地址。NOR Flash 读和写都可以从任意地址开始,但是写之前一定要确保要写入单元原来是空白(0xFF),否则一定要先擦除再写,而要擦除必须整个扇区擦除。

嵌入式平台片外Flash 存储器并不只有存储字库一个用途,往往是其增值功能。本文制作的4 种字体中文字库所占空间接近2 MB,考虑到其他应用习惯于从0 地址开始对存储器频繁读写,例如嵌入式课程的SPI通信实验,所以将字库存储于Flash 芯片的高8 MB空间,即从0x0080 0000 地址开始,同时为了擦除和读写方便,字库存储是按扇区对齐的,字库所占空间和详细地址分配信息如表1 所示。

表1 字库地址分配表

2.1.3 字库存储

因为字库文件数据量远超微控制器的SRAM 容量,无法直接读取并写入外存,但可以将微控制器作为中转站,在PC机和微控制器之间建立数据传输通道,PC机分批发送数据,微控制器循环接收实时写入。由此可见,字库存储软件设计分为上位机软件开发和下位机程序设计两部分[12-16]。

(1)上位机软件设计。上位机软件采用可视化编程工具开发,程序首先获取PC 机可用串口并对其进行初始化。随后等待下位机返回Flash 芯片初始化状态,直至下位机准备就绪,加载字库文件,向下位机发送包含起始地址和数据长度的传输启动命令。依次将字库文件以4096 B分块发送,每块数据发送完成之后插入软件延时,以等待下位机完成数据接收和存储操作。循环发送直至字库数据传输完成,整个通信过程中实时显示下位机接收和处理数据状态。

(2)微控制器端程序设计。微控制器要实现串口接收上位机发来的字库数据,并将其写入W25Q128,首先就需要对USART和SPI接口进行初始化。

串口初始化界面如图6(a)所示,选择USART1,异步工作模式,波特率115.2 Kb/s,数据宽度8 位,1位停止位,无奇偶校验位,同时打开串口接收中断。

SPI接口初始化界面如图6(b)所示,选择SPI1,全双工模式,Motorola帧格式,8位数据宽度,MSB先行,预分频系数8,波特率10 Mb/s,时钟极为高,时钟相位为第2边沿跳变,NSS信号类型为软件设置。由于系统使用的是硬件SPI,经过上述初始化之后即可调用库函数实现字节数据的接收和发送,但是对SPI 接口Flash 芯片W25Q128的读写还需要编写驱动程序。

图6 微控制器端初始化

微控制器完成初始化之后,串口处于数据接收状态,当监听到上位机发来数据传输准备命令时,从中获取数据存储起始地址、长度,将存储字库用到的扇区全部擦除,发送应答信息。上位机确认微控制器已准备就绪时,随即启动数据传输。微控制器每收到4096 B数据,进行一次W25Q128 写入操作,即写入一个扇区,同时复位缓冲区数据指针。当接收到全部数据时,计算最后一帧数据长度,并将其写入最后一个扇区。

(3)存储操作。由图5 取模生成的4 个字库文件,需要根据表1 确定的起始地址分别写入SPI Flash存储器,在产品量产时十分麻烦且容易出错。为此通过编程语言将4 个字库文件合并成一个总字库,存储效率大幅提升,数据共享也更为方便。合成字库扇区对齐,中间填充空白字符,末尾以回车换行符结束。

通过CMSIS-DAP 调试器连接嵌入式平台与PC机,下载微控制器端字库存储程序,复位运行。启动可视化编程工具开发的上位机通信软件W25Qxx串口下载助手,选择芯片:W25Q128,输入起始地址:0x0080 0000,打开合成的字库文件,等待下位机初始化成功后,单击发送文件按钮,启动文件传输,经过一段时间等待之后,字库文件的传输和写入工作便已完成。

2.2 主存储器IAP

在应用编程(In Application Programming IAP)是用户程序在运行过程中通过内部的I-Code 指令总线或D-Code数据总线访问内置闪存模块,既可以通过预留的通信接口对固件程序更新升级,又可将主存部分区域作为数据存储区,实现批量数据快速访问。

STM32F4 的主存储器,用来存放代码和数据常量,共分为12 个扇区,前4 个扇区为16 KB大小,扇区4 是64 KB大小,扇区5 ~11 是128 KB 大小,不同型号的微控制器其Flash 容量也有所不同,作者所设计的嵌入式平台配备F407ZET6 微控制器,主存储器容量为512 KB,拥有8 个扇区。

主存数据存储区在设置时不能与代码区重叠,否则将会造成程序错乱,引发未知错误。保险的做法是将数据区设置在主存的最后一个扇区,即F407ZET6的扇区7,其地址范围为:0x08060000 ~0x0807FFFF,共128 KB,使用时,4 种字体缓冲区仅占用整个扇区的低96 KB,详细地址空间分配如表2 所示。

表2 主存缓冲区存储空间分配表

由表2 可知,每种字体单个汉字所占的存储空间除汉字本身的字模信息而外,均附加了2 B 的索引信息,用于存放该汉字的内码。由于本设计在主存中缓冲中文字库信息,字模数据是随机存储的,为确定字模信息对应的字符,以汉字内码作为索引信息是简单有效的,因为在所有计算机设备当中,汉字均以内码存储和传递的。

在主存储器中缓冲存储中文字库信息,包含主存IAP写入和IAP读取两方面操作。主存储器写入可以以字、半字、字节为单位进行写入,字写入速度最快,字节写入最慢。由表2 可知,每种字体字模数据附加上索引信息之后长度已经不是4 的倍数呢,但仍是2 的倍数,所以字库信息缓冲存储时是以半字为单位进行写入的。字库在主存当中是环形缓冲的,由于NOR Flash只能在空白单元写入,所以缓冲数据是依次写入的,当缓冲区写满时需要从头开始,但此时需要将整个扇区全部擦除再写入。

主存储器IAP读取相对来说比较简单,这也是主存的典型工作状态,中文字库在主存中是从某一地址依次存储的,可以采用和写入相对应的读取方法,即一次读取一个汉字结构体数据到SRAM 当中,然后再进行数据处理。本文采用的方法是将字库的起始地址转换为字库结构体指针,然后使用结构体数组的形式访问,时间复杂度和空间复杂度都是最小的,体现了C语言指针的强大和灵活。

2.3 显示系统设计

要实现液晶显示屏信息显示,需要驱动TFT LCD,由于LCD是挂接在FSMC总线上的,所以第1 步就是LCD的FSMC初始化设置。

2.3.1 FSMC初始化设置

TFT LCD初始化界面如图7 所法,所有需要配置的信息在图中均使用红色框线标出。首先设置Mode选项,配置NOR Flash/PSRAM/SRAM/ROM/LCD 4,即选择Bank1.Sector4 连接TFT LCD,片选信号:NE4,存储器类型:LCD Interface,LCD 的RS 信号:A6,数据宽度:16 位。随后配置Configuration选项内容,选择模式A分开设置读写时序控制液晶显示屏,由于LCD读取速度要比写入速度慢得多,所以读时序参数需要设置大一些,写时序则可以小一些,参考设置如图7 所示。上述参数设置对71.12 mm TFT LCD的常规驱动芯片ILI9341 来说可以保证其稳定运行,并留有足够的裕量。

图7 LCD的FSMC初始化设置界面

在STM32CubeMX中配置并自动生成FSMC 初始化代码,定义LCD 结构体、确定基地址,编写LCD 底层驱动程序;移植显示屏厂家提供的基础显示和高层应用代码,即可实现TFT LCD显示控制。

2.3.2 主存缓冲中文显示系统

在完成了系统总体规划,字库取模及片外存储,主存IAP读取和写入,LCD初始化及驱动移植等各项工作之后,即可开展基于SPI 闪存和主存IAP 的嵌入式平台中文显示系统设计。

中英文混合显示主程序流程如图8(a)所示,函数入口参数为一字符串指针,读取其指向的第1 个元素,如果其值大于等于0x80,则为中文字符,根据不同字号调用相应中文显示函数,返回之后指针向下偏移2位;否则为英文字符,调用英文显示函数,返回之后指针下移1 位,如此往复直至整个字符串显示完成。

中文字符显示函数流程如图8(b)所示,进入函数首先计算主存缓冲区已存汉字数量,从字库首地址开始,以字库结构体长度为步长,依次向后寻找直至主存空白(连续两个字节为0xFF)结束,即可统计出已存汉字个数,统计程序仅执行一次。

图8 中英混合显示流程

在主存字库存储区依次比对显示汉字内码,若成功则读取主存字模数据,完成汉字显示。若显示汉字不在主存缓冲区当中,需要访问外存读取字模信息,GB2312 字符集是一种区位码,分为94 个区,每区94个字符,每个字符的区号和位号加上0xA1,即为汉字内码。在制作国标字库时是按区位号依次存放的,所以将内码还原为区位号,然后区号乘以94,加上位号,即为该汉字在字库的中的偏移量,由此计算出显示汉字在W25Q128 中的绝对地址,从中读出字模数据,完成汉字显示。将汉字内码作为索引信息添加到字模数据的前面,一并写入主存已有字库的末尾,实现该汉字的字库缓冲存储。

由于主存NOR Flash是非易失性的随机访问存储器,且缓冲区设置较大,多数情况下是一次缓冲,始终受益的,程序员在进行系统开发时也无需关心字库的具体存储位置,项目设计最终为嵌入式工程师提供了高速、透明的中文显示平台。

3 系统运行测试

为检验电路功能和观察运行效果,依据系统设计成果,完成样品生产、组装和测试工作。

3.1 接口性能测试

分别使用FSMC总线、GPIO并口连接TFT LCD显示模块,运行测试程序,使用STM32 定时器记录LCD刷新整个屏幕时间。GPIO并口连接时需要54.62 ms,而FSMC接口仅为3.54 ms,速度提升14.4 倍。

3.2 主存缓冲测试

通过串口传输并写入字库至W25Q128,擦除主存最后一个扇区,运行基于SPI 闪存和主存IAP 的嵌入式平台中文显示系统。调用通用显示函数,输出16 号汉字“黄克亚”,通过调试器查看主存,初次显示时,系统已将字模信息写入主存,结果如图9 所示。当再次输出相同字号汉字,即使打乱输出顺序,依然可以成功显示,且主存缓冲数据没有变化,表明显示程序实现既定功能。

图9 主存缓冲存储观察窗口

3.3 中文显示速度测试

编写测试程序在TFT LCD全屏显示24 ×24 中文汉字,通过定时器记录显示程序运行时间,字库片外存储时需要128.69 ms,字库主存缓冲时需要16.28 ms,当系统不进行大量中文信息显示时,在系统调试阶段已完成常用汉字主存缓冲存储,使用论文设计方法,可使中文显示速度提升6.9 倍。

3.4 系综综合测试

设计一个综合实例,系统主程序是一个电子万年历,实时采集现场温度、湿度、光照等环境信息,合并实验装置设计信息显示于TFT LCD显示屏上,同时将当前时间高亮显示于数码管,便于远距离观看,测试结果如图10 所示。

图10 实验装置综合测试图

测试结果表明,基于SPI 闪存和主存IAP 的嵌入式平台中文显示系统各项显示功能均很好完成,刷新速度快,画面清晰流畅,系统稳定可靠,项目设计达到了预期目标。

4 结 语

本文设计了一款嵌入式平台通用中文显示系统。硬件上将TFT LCD 显示模块通过FSMC 接口连接至内部高速AHB 总线;通过SPI 接口扩展了一片NOR Flash存储器W25Q128;CMSIS-DAP 调试器可实现嵌入式平台下载、调试、通信、供电功能四合一。系统软件设计工作是分阶段完成的,第一阶段工作是对4 种字体国标汉字取模,合成单个字库文件,通过串口分块发送至微控制器,以扇区为单位写入SPI 闪存。第二阶段工作是编写通用显示函数,如果字模数据已缓存则主存IAP 读取显示,否则SPI 读取外存字模数据,LCD显示并主存IAP缓冲写入。测试表明,嵌入式平台可实现全部中文显示,显示效果清晰流畅;LCD 刷新速度较GPIO并口连接提升14.4 倍,中文显示速度较SPI Flash 存储方式提高6.9 倍;主存IAP 一次缓冲,始终受益,显示系统对程序员来说是透明的,通用性强,可移植性好。

猜你喜欢
字库微控制器扇区
分阶段调整增加扇区通行能力策略
No.2 喜茶联合汉仪字库推出微型书和书签
U盘故障排除经验谈
论计算机字库单字的著作权保护
——以方正诉宝洁案为例
物联网技术在微控制器实验教学中的应用
基于贝叶斯估计的短时空域扇区交通流量预测
重建分区表与FAT32_DBR研究与实现
老家的惜字库
Atmel针对新一代物联网应用发布全新32位微控制器
最新STM32设计工具增加对混合信号微控制器的支持