FSMC—液晶显示实验
本文章讲解如何使用FSMC 外设控制实验板配套的3.2 寸ILI9341 液晶屏,见图1,该液晶屏的分辨率为320x240,支持RGB565 格式。
学习本小节内容时,请打开配套的“固件库例程液晶显示程序液晶显示”目录下的工程配合阅读。
硬件设计
![e5f07c603bc2f8b561f3b10b5153d532.png](https://i-blog.csdnimg.cn/blog_migrate/2596f664e0024cc3742130abb501f34c.jpeg)
图1 液晶屏背面的PCB 电路对应图2、图3、图4 中的原理图,分别是屏幕PCB 底板原理图、触摸部分原理图、液晶排针接口线序图。
![b3d2ee17688fb6bef882736c113af96a.png](https://i-blog.csdnimg.cn/blog_migrate/a7657daa0c3948225186e58840d17024.jpeg)
屏幕的PCB 底板引出的信号线会通过PCB 底板上的FPC 接口与液晶面板连接,这些信包括液晶控制相关的CS、RS 等信号及DB0-DB15 数据线,其中RS 引脚以高电平表示传输数据,低电平表示传输命令;另外还有引出LCD_BK 引脚用于控制屏幕的背光供电,可以通过该引脚控制背光的强度,该引脚为低电平时打开背光。图中的X+/X-/Y+/Y-引脚是液晶面板上触摸屏引出的信号线,它们会被连接到PCB 底板的电阻触摸屏控制器,用于检测触摸信号,其原理图见图3。
![7354b6d1017cf324f9729abaaf9113a8.png](https://i-blog.csdnimg.cn/blog_migrate/b83ebe2c64abc12b47d6be227245e99d.jpeg)
触摸检测的主体是型号为XPT2046 的芯片,它接收触摸屏的X+/X-/Y+/Y-信号进行处理,把触摸信息使用SPI 接口输出到STM32 等控制器,在触摸屏章节将会详细讲解其检测原理。
![6281df68dc3a0c1a183e5d7b3f0af70d.png](https://i-blog.csdnimg.cn/blog_migrate/7abc3ad81f8f0cc20bd5c09ad53f759c.jpeg)
图4 表示的是PCB 底板引出的排针线序,屏幕整体通过这些引出的排针与开发板或其它控制器连接。
![573f179b8830500e6876614637809e88.png](https://i-blog.csdnimg.cn/blog_migrate/81323c23e2fe384e60bd944bd492b422.jpeg)
图5 是指南者开发板上的液晶排母接口原理图,它说明了配套的3.2 寸屏幕接入到开发板上时的信号连接关系。其中请着重关注图中液晶屏LCD_CS 及LCD_RS(即DC 引脚)与FSMC 存储区选择引脚FSMC_NE 及地址信号FSMC_A 的编号,它们会决定STM32 要使用什么内存地址来控制与液晶屏的通讯。
软件设计
为了使工程更加有条理,我们把LCD 控制相关的代码独立分开存储,方便以后移植。在“USART—串口通讯”工程的基础上新建“bsp_ili9341_lcd.c”及“bsp_ili9341_lcd.h”文件,这些文件也可根据自己的喜好命名,它们不属于STM32 标准库的内容,是由我们自己根据应用需要编写的。
1. 编程要点
(1) 初始化通讯使用的目标引脚及端口时钟;
(2) 使能FSMC 外设的时钟;
(3) 配置FSMC 为异步NOR FLASH模式以仿真8080 时序;
(4) 建立机制使用FSMC 向液晶屏发送命令及数据;
(5) 发送控制命令初始化液晶屏;
(6) 编写液晶屏的绘制像素点函数;
(7) 利用描点函数制作各种不同的液晶显示应用。
2. 代码分析
液晶LCD 硬件相关宏定义
我们把FSMC 控制液晶屏硬件相关的配置都以宏的形式定义到 “bsp_ili9341_lcd.h”文件中,见代码清单1。
![cc4e17a25ea3867252587c3b0e6c23fa.png](https://i-blog.csdnimg.cn/blog_migrate/1987d513748174d186524a93f4ed08d4.jpeg)
![6dcc819954b25a35b6f0bc242cb157ee.png](https://i-blog.csdnimg.cn/blog_migrate/eff90c87283720fb6e2c3747a52467e4.jpeg)
以上代码根据硬件的连接,把与FSMC 与液晶屏通讯使用的引脚号、引脚源以及复用功能映射都以宏封装起来。其中请着重关注代码中液晶屏LCD_CS 及LCD_RS(DC 引脚)与FSMC 存储区选择引脚FSMC_NE 及地址信号FSMC_A 的编号,它们会决定STM32 要使用什么内存地址来控制与液晶屏的通讯。
初始化FSMC 的 GPIO
利用上面的宏,编写FSMC 的GPIO引脚初始化函数,见代码清单2。
![01cac95677fb1112d8a74a683c298727.png](https://i-blog.csdnimg.cn/blog_migrate/d520697d51447f4497832a52775e8a4a.jpeg)
![7b5f8e83867fd72a28e8da7c63cc0c3a.png](https://i-blog.csdnimg.cn/blog_migrate/9c68dc9535f3f760ed162988f84047ed.jpeg)
与控制SRAM 中的GPIO 初始化类似,对于FSMC 引脚,全部直接初始化为复用推挽输出模式即可,而背光BK 引脚及液晶复信RST 信号则被初始化成普通的推挽输出模式,这两个液晶控制信号直接输出普通的电平控制即可。
配置FSMC 的模式
接下来需要配置FSMC 的工作模式,见代码