基于FSMC总线的嵌入式系统多显示终端驱动设计
嵌入式系统均需配备显示设备以指示程序运行状态和输出控制结果。薄膜晶体管液晶显示器(TFT-LCD)因为功耗低、辐射小、颜色鲜艳、显示内容丰富等优点而成为嵌入式系统的主流,但是其控制复杂,需要移植厂家提供的底层驱动程序[
为提高数据传输速度,降低软硬件设计难度,并行接口是数码管、液晶显示器与微控制器(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一次只能访问一个外部器件[
如
图1 FSMC存储区域划分
Fig.1 Division of FSMC storage area
如
Bank1所选区 | 片选信号 | 地址范围 | HADDR | |
---|---|---|---|---|
[27:26] | [25:0] | |||
第1区 | FSMC_NE1 | 0X6000 0000-0X63FF FFFF | 00 | FSMC_A[25:0] |
第2区 | FSMC_NE2 | 0X6400 0000-0X67FF FFFF | 01 | |
第3区 | FSMC_NE3 | 0X6800 0000-0X6BFF FFFF | 10 | |
第4区 | FSMC_NE4 | 0X6C00 0000-0X6FFF FFFF | 11 |
在设计或分析系统时需要特别注意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],相当于总线地址右移了一位[
3 系统硬件设计
作者设计的嵌入式系统实验装置结构框图如
图2 实验装置FSMC连接结构框图
Fig.2 FSMC connection structure block diagram of experimental device
3.1 FSMC与TFT-LCD连接
在STM32内部,FSMC起到桥梁作用,其一端通过内部高速总线AHB连接到Cortex内核,另一端则是面向扩展存储器的外部总线,既能够进行信号类型的转换,又能够进行信号宽度和时序的调整,提供多种读写模式,使之对内核而言没有区别[
图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 8080接口读写时序
Fig.4 Read and write timing of 8080 interface
对比
3.2 FSMC与数码管连接
如
上述设计实现了数码管和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的读取时序如
4.1.2 FSMC初始化
FSMC工作模式灵活多变,控制寄存器众多,直接操作寄存器很难完成,一般采用基于库函数的开发方式,而库函数又分为标准库和硬件抽象层(Hardware Abstraction Layer,HAL)库。借助STM32推出的图形化配置软件STM32CubeMX的HAL库开发,只需要输入几个关键参数,即可自动完成FSMC接口初始化工作。自动化程度高,是未来嵌入式开发的技术方向。
(1) 数码管FSMC初始化设置
在STM32CubeMX软件中,打开
图5 数码管FSMC初始化界面
Fig.5 FSMC initialization interface of digital tube
(2) LCD的FSMC初始化设置
如
图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”,则应送出的显示码如
名称 | / | / | DS6 | DS5 | DS4 | DS3 | DS2 | DS1 | dp | g | f | e | d | c | b | a |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
FSMC | D15 | D14 | D13 | D12 | D11 | D10 | D9 | D8 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
数值 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
HEX | E | A | F | 9 |
数据管是挂接在FSMC总线的Bank1.Sector3上的,由
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位存储器时内外地址对应关系为HADDR[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[
由于技术发展历史原因,一般LCD控制程序是用标准库编写的,所以还需将标准库程序向HAL库程序移植,一般步骤为:在STM32CubeMX中配置并自动生成FSMC初始化代码,含LCD和数码管两部分;定义LCD结构体、确定基地址,编写LCD底层驱动程序;将原LCD初始化程序中的FSMC初始化和复用引脚配置代码删除,其余部分保留;移植基础显示和高层应用代码,经过上述步骤即可完成LCD显示代码移植。
5 系统运行测试
为检验电路功能和观察运行效果,依据系统设计成果,完成样品生产、组装和测试工作。
第一步:数码管显示测试。编写数码管动态显示时间程序,在6位数码管上显示时、分、秒数值,各占两位数码管,且在小时和分钟的末尾显示一个小数点。
第二步:LCD显示测试。在完成显示程序移植之后,调用显示函数分别进行字符、字符串、整型、浮点数等文字信息显示测试;调用图形处理函数进行画点、画线、画圆、矩形、三角形、指定区域填充等图形显示测试;制作汉字字库并存于字库文件当中,调用中文显示函数进行多种字号汉字显示测试。
第三步:综合测试。设计了一个综合实例,系统主程序是一个电子万年历,实时采集现场温湿度信息,合并实验装置设计信息,所有信息均显示于TFT-LCD显示屏上,同时将当前时间高亮显示于数码管,便于远距离观看,测试结果如
图7 实验装置综合测试图
Fig.7 Comprehensive test diagram of experimental device
第四步:对比测试。分别使用FSMC总线、GPIO并口、SPI串口连接数码管和TFT-LCD双显示设备,运行测试程序,使用STM32定时器记录LCD刷整屏时间,测试条件和测试结果如
驱动接口 | TFT-LCD显示模块 | 微控制器及主频 | I/O引脚数 | 刷屏时间/ms |
---|---|---|---|---|
FSMC | 70.82 mm (2.8 in) 240×320 ILI9341 | STM32F407ZGT6 168 MHz | 21 (20+01) | 2.9 |
并口 | 70.82 mm (2.8 in) 240×320 ILI9341 | STM32F407ZGT6 168 MHz | 34 (20+14) | 53.9 |
SPI | 60.96 mm (2.4 in) 240×320 ILI9341 | STM32F103ZET6 72 MHz | 19 (05+14) | 1 497.2 |
测试结果表明,采用FSMC总线同时连接数码管和TFT-LCD显示屏各项显示功能均很好完成,刷新速度快,画面清晰流畅,系统稳定可靠,项目设计达到了预期目标。
6 结论
本文设计了一款嵌入式系统多显示终端实验装置,将数码显示器和TFT-LCD均挂接在STM32微控制器的高速FSMC总线上,实现数据信号和控制信号时分复用。LCD的8080控制时序和数码显示器地址锁存信号均由硬件自动产生,FSMC初始化亦可通过STM32CubeMX图形化配置工具轻松完成,软件设计工作量显著减少。相比于微控制器直接并口控制,减少了38.2%的GPIO引脚资源占有率,LCD刷屏速度提高了17.6倍。系统设计方案具有较高的数据访问性能,降低了软硬设计难度,提高了系统可靠性。
- 2025年中科院分区表已公布!Scientific Reports降至三区
- 2023JCR影响因子正式公布!
- 国内核心期刊分级情况概览及说明!本篇适用人群:需要发南核、北核、CSCD、科核、AMI、SCD、RCCSE期刊的学者
- 我用了一个很复杂的图,帮你们解释下“23版最新北大核心目录有效期问题”。
- CSSCI官方早就公布了最新南核目录,有心的人已经拿到并且投入使用!附南核目录新增期刊!
- 北大核心期刊目录换届,我们应该熟知的10个知识点。
- 注意,最新期刊论文格式标准已发布,论文写作规则发生重大变化!文字版GB/T 7713.2—2022 学术论文编写规则
- 盘点那些评职称超管用的资源,1,3和5已经“绝种”了
- 职称话题| 为什么党校更认可省市级党报?是否有什么说据?还有哪些机构认可党报?
- 《农业经济》论文投稿解析,难度指数四颗星,附好发选题!