APP下载

基于FSMC 总线的嵌入式系统多显示终端驱动设计

2022-09-01黄克亚

液晶与显示 2022年6期
关键词:数码管微控制器存储器

黄克亚

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

1 引 言

嵌入式系统均需配备显示设备以指示程序运行状态和输出控制结果。薄膜晶体管液晶显示器(TFT-LCD)因为功耗低、辐射小、颜色鲜艳、显示内容丰富等优点而成为嵌入式系统的主流,但是其控制复杂,需要移植厂家提供的底层驱动程序[1-2]。数码管亮度高、稳定可靠、价格便宜,在家用电器、工业控制和传感检测等领域有着广泛的应用,是嵌入式学习的经典器件。

为提高数据传输速度,降低软硬件设计难度,并行接口是数码管、液晶显示器与微控制器(MCU)连接的首选。但并口需要占用大量I/O口资源,以6 位数码管为例,共有6 个位选信号和8 个段选信号,TFT-LCD 显示模块则有6 个控制信号和16 位数据线。设计系统时,为了编程方便,一般希望位选信号、段选信号、LCD 数据线分别占用连续的16 位端口,而这些I/O 引脚又离散地分布于芯片的四周,上述技术需求给微控制器引脚资源分配和PCB 布线带来极大的挑战,同时降低了实验装置的可靠性,而破解这一难题的方法就是将二者均挂接在FSMC 总线上,同时进行信号线复用。

2 FSMC 总线

灵活静态存储控制器(Flexible Static Memory Controller,FSMC)能够连接同步、异步存储器和16 位PC 存储卡,支持SRAM、NAND Flash、NOR Flash 和PSRAM 等 类 型 存 储 器。FSMC 连接的所有外部存储器共享地址、数据和控制信号,但有各自的片选信号,所以FSMC 一次只能访问一个外部器件[3-4]。

如图1 所示,FSMC 将外部存储器1 GB 空间划分为固定大小为256 MB 的4 个存储块(Bank),Bank1 可连接多达4 个NOR Flash 或PSRAM/SRAM 存 储 器 件,Bank2 和Bank3 用 于 访 问NAND Flash 存储器,每个存储区域连接一个设备,Bank4 用于连接PC Card 设备。其中Bank1又被分为4 个区(Sector),每个区管理64 MB 空间,每个区都有独立的寄存器对所连接的存储器进行配置。

图1 FSMC 存储区域划分Fig.1 Division of FSMC storage area

如 表1 所 示,Bank1 的256 MB 空 间 由28 根地址线(HADDR[27:0])寻址。这里HADDR 是内部AHB 总线地址,其中HADDR[25:0]来自外部存储器地址FSMC_A[25:0],对应引脚地址信号;而HADDR[27:26]对4 个区进行寻址,由系统自动完成,无外部引脚对应信号。

表1 Bank1 存储区选择表Tab.1 Bank1 storage area selection table

在设计或分析系统时需要特别注意HADDR[25:0]的对应关系。

当Bank1 连接的是8 位宽度存储器时,总线和外设均采用字节编址,二者一一对应,即:HADDR[25:0]→FSMC_A[25:0]。

当Bank1 连接的是16 位宽度存储器时,总线字节编址,存储器双字节寻址,此时总线26 地 址 中 最 低 位HADDR[0]用 来 表 示16 位数 据 的 高 位 或 低 位,高25 位HADDR[25:1]对应16 位宽的存储器单元地址,即:HADDR[25:1]→FSMC_A[24:0],相当于总线地址右移了一位[5-6]。

3 系统硬件设计

作者设计的嵌入式系统实验装置结构框图如图2 所示,其重点展示TFT-LCD 和数码管的FSMC 总线连接关系,其他模块,如CMSIS-DAP调试器、LED 流水灯、独立/矩阵按键等虽也为实验装置重要组成部分,但不是本文讨论重点,故未绘制。实验装置主控芯片选择基于ARM Cortex-M4 内核,性能出色的STM32F407ZGT6微控制器,该芯片拥有完备的FSMC 接口系统,块1 的4 个子区可同时连接4 个NOR Flash/PSRAM/SRAM 存储设备。实验装置配备双显示终端,数码显示器为6 位14.22 mm(0.56 in)共阳数码管,PNP 三极管S8550 驱动;液晶显示器为70.82 mm(2.8 in)全彩TFT-LCD 显示模块,240 像素×320像素,2.8~3.3 V 供电,ILI9341驱动,16 位8080 并行接口。

图2 实验装置FSMC 连接结构框图Fig.2 FSMC connection structure block diagram of experimental device

3.1 FSMC 与TFT-LCD 连 接

在STM32 内部,FSMC 起到桥梁作用,其一端通过内部高速总线AHB 连接到Cortex 内核,另一端则是面向扩展存储器的外部总线,既能够进行信号类型的转换,又能够进行信号宽度和时序的调整,提供多种读写模式,使之对内核而言没 有 区 别[7-8]。模 式A 比 较 适 合 连 接 至Bank1 的NOR Flash/PSRAM/SRAM 存储器,其读写时序如图3 所示[9]。信号线主要包括26 位地址线A[25:0],16 位数据线D[15:0],片选信号NE[x],输出使能NOE,写入使能NEW。

图3 FSMC 模式A 读写时序Fig.3 Read and write timing of FSMC mode A

TFT-LCD 显示模块信号线包括:数据线D[15:0],寄存器/存储器选择RS,读使能RD,写使能WR,片选CS,复位RST。通常使用标准的16 位8080 并口与微控制器连接,其读写时序如图4 所示[10]。

图4 8080 接口读写时序Fig.4 Read and write timing of 8080 interface

对比图3、图4 读写时序和二者控制信号可以发现,TFT-LCD 模块,除了已连接至系统复位电路的RST 信号外,其他信号均可由FSMC 接口提供,所以FSMC 连接PSRAM/SRAM 的工作模式适合于连接TFT-LCD 显示模块。如图2所示,项目实施时选择FSMC 总线的Bank1.Sector4 连接TFT-LCD,FSMC_NE4 接LCD 片选 信 号CS,FSMC_NOE 接LCD 读 引 脚RD,FSMC_NWE 接LCD 写 引 脚WR,选 择FSMC_A6 地址线连接LCD 的寄存器/存储器选择信号RS,FSMC_D[15:0]接LCD 的16 位 数 据 线D15~D0,LCD 工作于16 位8080 接口模式。

3.2 FSMC 与数码管连接

如图2 所示,数码管和TFT-LCD 同时挂接在STM32F4 的FSMC 总线上,二者共享数据线,为使二者输出信号互不影响,需要将向数码管送出的数据信号进行锁存,锁存器选择2 片74HC573D,锁存引脚LE 高电平传输,低电平封锁。选择FSMC 总线的Bank1.Sector3 连接6 位共阳数码管,所以FSMC_NE3 作为数码管的片选信号,但是NE3 是低电平有效,与锁存器传输信号正好相反,所以FSMC_NE3 需要经反相器U2 连接U3 的两片74HC573D 的锁存引脚LE。由于只需要一路反相器,系统实施时采用由1 个PMOS 管和1 个NMOS 管构成的单路CMOS 反相器。数码管8 个段选线和6 个位选线共14 条信号线由FSMC_D[13:0]控制,需要经过锁存模块U3 锁存,FSMC_D[7:0]接一片锁存器输入端,锁存器输出端接数码管段选线dp~a,FSMC_D[13:8]接另一片锁存器的输入端,锁存器的输出端接数码管位选线DS6~DS1。

上述设计实现了数码管和TFT-LCD 数据线和控制线的时分复用,减少了微控制器GPIO需求,节约了CPU 资源,降低了PCB 布线难度,提升了系统可靠性。

4 系统软件设计

4.1 FSMC 初始化

系统底层软件设计的任务是完成显示设备的读写,因为显示设备均挂接在FSMC 总线上,所以要实现显示设备数据访问,首先就需要FSMC 初始化。

4.1.1 FSMC 读写时序

FSMC 有多种时序模型用于NOR Flash/PSRAM/SRAM 的 访 问,对TFT-LCD 来 说,读取操作比较慢,写入操作比较快,使用模式A 的读写分离时序控制比较方便,可以使读写操作均获得较高性能表现。数码管控制只涉及写,且没有速度要求,任何模式均可以满足要求,为了和LCD 保持一致,也采用模式A 进行控制。

访问NOR Flash/PSRAM/SRAM 的模式A的读取时序如图3(a)所示,写入时序如图3(b)所示,在这两个时序中都只需要设置地址建立时间ADDSET 和数据建立时间DATAST 这两个参数,它们都用HCLK 的时钟周期个数表示,其中ADDSET 最小值为0,最大值为15,DATAST 最小值为1,最大值为255。根据参考文献[9]说明,实际的地址建立时间是ADDSET 个HCLK 周期,数据建立时间是(DATAST+1)个HCLK周期。

4.1.2 FSMC 初始化

FSMC 工作模式灵活多变,控制寄存器众多,直接操作寄存器很难完成,一般采用基于库函数的开发方式,而库函数又分为标准库和硬件抽象层(Hardware Abstraction Layer,HAL)库。借助STM32 推出的图形化配置软件STM32CubeMX的HAL 库开发,只需要输入几个关键参数,即可自动完成FSMC 接口初始化工作。自动化程度高,是未来嵌入式开发的技术方向。

(1) 数码管FSMC 初始化设置

在STM32CubeMX 软件中,打开图5 所示的设置界面,首先设置Mode 选项内容,配置NOR Flash/PSRAM/SRAM/ROM/LCD 3,即 选 择Bank1. Sector3 连接数码管,片选信号:NE3,存储器类型:LCD Interface,LCD 的RS 信号:A6,数据宽度:16 位。随后配置Configuration 选项内容,其中大部参数采用默认即可,使能扩展模式,使其支持分开设置读写时序。对数码管的访问只有写不需要读,所以读时序参数可以任意设置;写时序中无需送出地址信号,所以写时序地址建立时间设置为0,以使其选中芯片后立即送出数据。因片选信号需要经过反相器送给锁存芯片以完成数据传输,所以数据送出后需要保持一定的时间,数据建立时间需要设置大一些,作者设置的是160。所有需要配置的信息在图5 中均使用红色框线标出。

图5 数码管FSMC 初始化界面Fig.5 FSMC initialization interface of digital tube

(2) LCD 的FSMC 初 始化设置

如 图6 所 示,TFT-LCD 的FSMC 初 始 化 基本上和图5 的数码管FSMC 初始化设置是一样的,不同的地方均使用蓝色框线标出。LCD 连接到FSMC 的Bank1. Sector4,所以此时需要配置NOR Flash/PSRAM/SRAM/ROM/LCD 4,片选信号也相应地调整为NE4。FSMC 总线选择模式A 分开设置读写时序控制LCD 显示屏,由于LCD 读速度要比写速度慢得多,所以在设置读时序时时间参数尽量设置大一些,作者将ADDSET 和DATAST 分别设置为15 和59。对于STM32F407 微控制器,在168 MHz 主频时,HCLK 约为6 ns,其对应的地址建立时间为15×6 ns=90 ns,数据建立时间为(59+1)×6 ns=360 ns。LCD 写时序的时间参数设置适当小一些,作者将ADDSET 和DATAST 分别设置为9和8,两个参数对应的时间数值均约为54 ns。上述参数设置对70.82 mm(2.8 in)TFT-LCD 的常规驱动芯片ILI9341 来说可以保证其稳定运行,并留有足够的裕量。

图6 LCD 的FSMC 初始化界面Fig.6 FSMC initialization interface of LCD

完成上述配置后,STM32CubeMX 会自动将FSMC 总线用到的GPIO 引脚配置为FSMC 复用推挽模式,无须上拉或下拉,并在FSMC 初始化程序中完成调用,大大减轻了用户编程工作量。

4.2 数码管显示程序设计

STM32CubeMX 完成FSMC 初始化后,生成Keil MDK 工程,在工程的主函数中会自动调用初始化函数,此时就可以直接访问数码管或LCD。6 位共阳数码管采用PNP 三极管S8550 驱动,所以位选码是低电平有效,段选码也是低电平相应笔划点亮。假设我们需要将DS1、DS3、DS5 三个数码管上面均显示的数字“1”,则应送出的显示码如表2 所示,即向FSMC 总线送出一个16 进制数据0xEAF9,即可实现显示控制。

表2 数码管控制实例显示码对应表Tab.2 Corresponding table of digital tube control example display code

数据管是挂接在FSMC 总线的Bank1.Sector3 上的,由表1 可知,这一区域对应的地址范围为0x6800 0000-0x6BFF FFFF,只要向这个64 MB 单元中任一地址送数据,即可将显示码发送至数据线,并自动产生片选信号FSMC_NE3,反相后形成锁存信号,完成数据锁存。为此选择这一区域的首地址0x6800 0000,转换为指针型常量,将其赋值给uint16_t 型指针型变量SEG_ADDR,向该地址写数据即可实现显示控制,十分简单。

4.3 LCD 显示程序设计

相比于数码管显示控制,LCD 显示程序则要复杂得多,分为底层驱动、基础显示和高层应用3 部分。基础显示程序和高层应用程序一般由显示屏厂家直接提供,且在移植了底层驱动程序之后,一般无需任何更改,就可直接使用,所以本文重点讨论的是基于FSMC 的底层驱动程序的实现。

对TFT-LCD 寄存器和存储器一体化控制简单、便捷的方法是定义一个LCD 数据访问结构体,包含寄存器和存储器2 个16 位无符号型成员。并确定该结构体的基地址为0x6C00007E,其 中HADDR[27:26]=11,表 明 选 择 的 是Bank1.Sector4,即片选信号FSMC_NE4 有效。

结构体第一个成员LCD_REG 地址和LCD 结构体的基地址相同,即:0x6C00007E,第二个成员LCD_RAM 地址为基地址加2,即:0x6C000080。如果只观察HADDR 低8 位,即LCD->LCD_REG的HADDR[7:0]=0111 1110,LCD->LCD_RAM的HADDR[7:0]=1000 0000,由于FSMC外接16 位存储器时内外地址对应关系为HAD⁃DR[25:1]→FSMC_A[24:0],相当于右移1 位。由此可知LCD->LCD_REG 的FSMC_A[6:0]=011 1111,FSMC_A6(RS)=0,读 写LCD 寄 存器;LCD->LCD_RAM 的FSMC_A[6:0]=100 0000,FSMC_A6(RS)=1,读写LCD 存储器。在FSMC 配置过程中选择不同的地址线连接LCD 的RS 信号,其基地址的确定亦可举一反三。

有了上述定义并确定好基地址之后,通过选择结构体的不同成员,即可实现对不同存储对象的访问,编程简洁、高效、直观。结合LCD 驱动芯片ILI9341[10]控制时序,将读写控制代码封装成LCD 基本读写函数,即为LCD 底层驱动程序,供基础显示程序和高层应用程序调用。

由于技术发展历史原因,一般LCD 控制程序是用标准库编写的,所以还需将标准库程序向HAL 库程序移植,一般步骤为:在STM32CubeMX中配置并自动生成FSMC 初始化代码,含LCD和数码管两部分;定义LCD 结构体、确定基地址,编写LCD 底层驱动程序;将原LCD 初始化程序中的FSMC 初始化和复用引脚配置代码删除,其余部分保留;移植基础显示和高层应用代码,经过上述步骤即可完成LCD 显示代码移植。

5 系统运行测试

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

第一步:数码管显示测试。编写数码管动态显示时间程序,在6 位数码管上显示时、分、秒数值,各占两位数码管,且在小时和分钟的末尾显示一个小数点。

第二步:LCD 显示测试。在完成显示程序移植之后,调用显示函数分别进行字符、字符串、整型、浮点数等文字信息显示测试;调用图形处理函数进行画点、画线、画圆、矩形、三角形、指定区域填充等图形显示测试;制作汉字字库并存于字库文件当中,调用中文显示函数进行多种字号汉字显示测试。

第三步:综合测试。设计了一个综合实例,系统主程序是一个电子万年历,实时采集现场温湿度信息,合并实验装置设计信息,所有信息均显示于TFT-LCD 显示屏上,同时将当前时间高亮显示于数码管,便于远距离观看,测试结果如图7 所示。由于项目综合性较强,主程序处理任务较多,而数码管动态显示是阻塞运行的,CPU占有率较高,作者采用定时器中断的方式依次刷新需要显示的数码管,在主程序中只需要对显示数组赋值即可,使两个显示设备显示控制方式基本相同,提升了系统运行效率。

图7 实验装置综合测试图Fig.7 Comprehensive test diagram of experimental device

第四步:对比测试。分别使用FSMC 总线、GPIO 并口、SPI 串口连接数码管和TFT-LCD 双显示设备,运行测试程序,使用STM32 定时器记录LCD 刷整屏时间,测试条件和测试结果如表3所示。由表3 可知,SPI 串口显示速度很慢,对于有刷新频率要求的场合原则上不使用。FSMC接口和GPIO 并口测试时使用相同的TFT-LCD模块和微控制器,工作于同一主频,使测试数据更具可比性。由表中数据计算得出,FSMC 接口相比于微控制器并口控制,减少了38.2% 的GPIO 引脚资源占有率,LCD 刷屏速度提高了17.6 倍。以上数据视软硬件设置情况会有小幅波动,但是大致范围不会变化。

表3 显示终端驱动接口对比测试Tab.3 Comparison test of display terminal driver interface

测试结果表明,采用FSMC 总线同时连接数码管和TFT-LCD 显示屏各项显示功能均很好完成,刷新速度快,画面清晰流畅,系统稳定可靠,项目设计达到了预期目标。

6 结 论

本文设计了一款嵌入式系统多显示终端实验装置,将数码显示器和TFT-LCD 均挂接在STM32 微控制器的高速FSMC 总线上,实现数据信号和控制信号时分复用。LCD 的8080 控制时序和数码显示器地址锁存信号均由硬件自动产生,FSMC 初始化亦可通过STM32CubeMX图形化配置工具轻松完成,软件设计工作量显著减少。相比于微控制器直接并口控制,减少了38.2%的GPIO 引脚资源占有率,LCD 刷屏速度提高了17.6 倍。系统设计方案具有较高的数据访问性能,降低了软硬设计难度,提高了系统可靠性。

猜你喜欢

数码管微控制器存储器
静态随机存储器在轨自检算法
基于51单片机的分数计数器设计
微课教学设计之“数码管动态显示”
TASKING针对英飞凌第三代AURIX微控制器推出多核开发环境
Arduino编程
MC9S08FL16单片机数码管静态显示分析
用于高品质电动汽车的分布式并行计算
电磁导向智能车设计探讨
存储器——安格尔(墨西哥)▲
基于MC9S08QG8低端微控制器的无线控制器设计