STM32CubeMX实战教程(七)——TFT_LCD液晶显示(附驱动代码)

会开发的喵 2020-07-30 16:10:53 2636 收藏 53
分类专栏: STM32CubeMX——HAL库开发 文章标签: 嵌入式 单片机 stm32
版权
液晶显示
前言
材料
TFT_LCD
FSMC接口
原理图
工程配置
进入代码
驱动程序引入
代码分析
TFTLCD_Init
LCD_Drawxxx
LCD_Fill
LCD_Showxxxx
功能实现
下载验证
结语
前言
想来想去,也不知道更新什么内容比较好了,犹豫了好久还是先跟大家讲讲液晶显示的配置吧,毕竟我觉得这个在很多项目中都非常实用,我个人是比较喜欢用一块TFT液晶来做显示终端的,大大的屏幕显示什么都方便,接到产品上面也显得特别高端,当然在考虑成本的情况下OLED和12864这些也是不错的选择。

材料
STM32F4正点原子探索者
开发板原理图
TFT_LCD(我这里用的是4.3寸的液晶,芯片为ILI9341,但理论上本驱动程序支持的芯片包括ILI9341/ILI9325/RM68042/RM68021/ILI9320/ILI9328/LGDP4531/LGDP4535/SPFD5408/1505/B505/C505/NT35310/NT35510/SSD1963等)
LCD驱动芯片的手册(这里用的是ILI9341)
有手就行
TFT_LCD
由于TFT_LCD的知识,比较多,我这里尽量简明扼要地讲讲我认为开发中需要用的部分

FSMC接口
FSMC,即灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。
FSMC的框图如下图所示:

TFTLCD通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如我们把RS接在A0上面,那么当FSMC控制器写地址0的时候,会使得A0变为0,对TFTLCD来说,就是写命令。而FSMC写地址1的时候,A0将会变为1,对TFTLCD来说,就是写数据了。这样,就把数据和命令区分开了,他们其实就是对应SRAM操作的两个连续地址。当然RS也可以接在其他地址线上,而这个板子是把RS接在A6上面。
这里需要注意:FSMC接口驱动LCD时,其实是将LCD当作一个外部的SRAM来驱动的,唯一不同就是TFTLCD有RS信号,但是没有地址信号
FSMC驱动外部SRAM时,外部SRAM的控制一般有:地址线(如A0-A25)、数据线(如D0-D15)、写信号(WE,即WR)、读信号(OE,即RD)、片选信号(CS),如果SRAM支持字节控制,那么还有UB/LB信号。

STM32的FSMC支持8/16/32位数据宽度,我们这里用到的LCD是16位宽度的,所以在设置的时候,选择16位宽就OK了。FSMC的外部设备地址映像,STM32的FSMC将外部存储器划分为固定大小为256M字节的四个存储块。

STM32的FSMC存储块1(Bank1)用于驱动NOR FLASH/SRAM/PSRAM,被分为4个区,每个区管理64M字节空间,每个区都有独立的寄存器对所连接的存储器进行配置。Bank1的256M字节空间由28根地址线(HADDR[27:0])寻址。
这里HADDR,是内部AHB地址总线,其中,HADDR[25:0]来自外部存储器地址FSMC_A[25:0],而HADDR[26:27]对4个区进行寻址。如下表所示:

当Bank1接的是16位宽度存储器的时候:HADDR[25:1]-> FSMC_A[24:0]
当Bank1接的是8位宽度存储器的时候:HADDR[25:0]->FSMC_A[25:0]

不论外部接8位/16位宽设备,FSMC_A[0]永远接在外部设备地址A[0]
STM32的FSMC存储块1 支持的异步突发访问模式包括:模式1、模式A~D等多种时序模型,驱动SRAM时一般使用模式1或者模式 A,这里我们使用模式A来驱动LCD(当SRAM用)

原理图
这里跟之前的实验一样是用的正点原子探索者开发板,MCU为STM32F407ZGT6,其中原理图的LCD部分如下:

对应芯片中的引脚呢,是这样的(有点多):
其中部分引脚的功能呢,前面也已经讲到了,这里不再重复


复位脚和单片机的复位是接到一起的,也就是整个系统的复位,在程序中并没有额外操作







背光电源脚,开了屏幕才能亮

剩下几个脚是触摸屏才需要用到的,这里先不详说
ps:找到这些引脚的目的是在STM32CubeMX中进行比对,确保生成代码的引脚是对应的,要是引脚都对不上的话肯定驱动不起来咯,代码跑不了的第一步也是检查底层硬件对应情况,是个好习惯。

工程配置
这次做的是LCD显示字符串的配置,老规矩,基础配置不多说了,直接上图

我这边是开了一个LED灯作为系统运行指示的,LED配置具体也不说了哈,前面的
《STM32CubeMX实战教程(二)——按键点个灯》有详细介绍了。

然后这边最好开一个串口,并在程序中进行重定向,因为在驱动程序中需要打印一下LCD的ID,如果不开的话会卡在这里,具体会在后面程序分析的时候讲到,如果实在不想开启也可以将串口相关代码删掉。

《STM32CubeMX实战教程(六)——串口通信(为啥你的中文会乱码)》

在配置FSMC之前先把背光电源脚使能一下,这个不属于FSMC的内容,如果下载程序后屏幕亮不起来那么八成是这里出问题了。
根据原理图背光脚是PB15,配置为上拉高速,初始电平为低。

下面是FSMC的配置,先上图
外设中选择FSMC,配置如下:

这边的选择根据在FSMC介绍的时候都已经详细讲到了,这里就只进行大致的说明。
1.NOR Flash/PSRAM/SRAM/ROM/LCD 1,这里选择这个也就是STM32的FSMC存储块1(Bank1)了
2. Chip Select,选择Bank1的第四区,是根据原理图的映射管脚进行选择的,这里选择不同区对应的引脚是不同的
3. Memory Type,存储类型,这里当然是选择LCD接口,那么里面还可以选择其他的存储类型,如果需要使用其他类型的存储设备也可以详细了解
4. LCD Register Select,这里是选择RS脚,也就是命令/数据选择位,同样是根据原理图得知这里应该选择A6
5. Data,数据位,很明显从原理图看出有16个数据引脚,这里选择16bits就好
接下来这里有一件事情需要大家注意一下,就是最好将目前为止的引脚使能情况跟原理图中的一一对应,也就是检查一遍,虽然花不了多少时间,但是由于使能了大量的引脚,一旦出错那么整个工程就是失败的

参数配置如下:
这里需要使能读写不同的时序,也就是Write operation,下面的参数分别是:

地址建立的时钟周期
数据建立的时钟周期
总线转阶段持续时间
扩展地址建立时间
扩展数据建立时间
扩展总线建立时间
这里扩展的意思就是写时序,而上面几条是读时序。
参数设置的根据是LCD芯片手册中的驱动时序,不同的芯片需要根据不同的手册进行计算,但计算的方法都是一样的,时序如下:

其中红框中的部分就是我们需要的,显然,WR就是写时序,RD就是读时序,对ILI9341来说,数据保持时间,其实就是低电平持续时间,地址建立时间,相当于高电平持续时间。那么剩下就很简单了,由于F4的一个HCLK=6ns(1/168M),稍加计算就可以得到需要多少个HCLK了。
到这里所有的工程配置工作就结束了,接下来偷个懒就进代码吧,怎么生成代码这里就不多说了。

进入代码
驱动程序引入
上面的内容是我转发的
下面和他的不同
进来后第一件事当然是编译了,编译完后,需要加入一份正点原子的驱动程序.,可以到《正点原子资料下载中心》下载


这个是原子的工程,把红色方框里的文件加到自己的工程中
这后会有一个错误

把上面选中的代码注释就好了

然后调用 LCD_Init(); 进行初始化
加入下面的代码就能显示了
POINT_COLOR=RED;
LCD_ShowString(30,50,200,16,16,“Explorer STM32F4”);

STM32CubeMX实战TFT_LCD液晶显示-探索者专用(转发)相关推荐

  1. STM32CubeMX实战教程(七)——TFT_LCD液晶显示(附驱动代码)

    液晶显示 前言 材料 TFT_LCD FSMC接口 原理图 工程配置 进入代码 驱动程序引入 代码分析 TFTLCD_Init LCD_Drawxxx LCD_Fill LCD_Showxxxx 功能 ...

  2. STM32CubeMX实战教程(三)——外部中断(中断及HAL_Delay函数避坑)

    外部中断 前言 材料 NVIC 新建及配置工程 外部中断和事件中断 NVIC配置 进入代码 回调函数 HAL_Delay()分析 下载验证 结语 前言 学单片机的,相信对中断的概念都已经了如指掌了,中 ...

  3. STM32CubeMX 实战教程:定时器中断实验(LL 库)

    1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取: 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章:   博主分享不易,请给三连哦(关注 + 点赞 + 收藏 ...

  4. STM32CubeMX实战教程(一)——软件入门

    软件入门 前言 新建工程 界面简介 MCU 外设配置 时钟树 工程设置 工具 生成代码 代码分析 main.c gpio.c stm32f4xx_it.c 程序下载 现象 结语 前言 STM32Cub ...

  5. 微信小程序开发实战9_2 小程序页面转发

    小程序页面转发是小程序分享的一个重要方式,在设计小程序应用时就需要考虑那些页面需要实现转发功能,以及页面的转发参数.本节介绍如何进行小程序页面的分享,并介绍如何获取小程序卡片的分享票据. 9.2.1小 ...

  6. 四年嵌入式技术沉淀,处女作《STM32CubeMX系列实战教程》诞生

    上百篇原创人工智能系列教程,从理论到实战,手把手带你掌握人工智能,点击☞这里☜进入传送门~ 秒变 STM32 大神,STM32CubeMX你值得拥有! 本教程共包含 20 篇文章,手把手带你学会用 S ...

  7. STM32CubeMX学习笔记(38)——FSMC接口使用(TFT-LCD屏显示)

    一.TFT-LCD简介 TFT-LCD(Thin Film Transistor-Liquid Crystal Display) 即薄膜晶体管液晶显示器.TFT-LCD 与无源 TN-LCD. STN ...

  8. STM32CubeMX学习笔记(39)——FSMC接口使用(TFT-LCD屏触摸)

    一.TFT-LCD简介 TFT-LCD(Thin Film Transistor-Liquid Crystal Display) 即薄膜晶体管液晶显示器.TFT-LCD 与无源 TN-LCD. STN ...

  9. STM32CubeMX学习笔记(5)——基本定时器接口使用

    一.定时器简介 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器. 基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能 ...

最新文章

  1. acwing yxc总结时间算法复杂度
  2. vmware中centos6.4突然无法进入图形界面解决方法
  3. python数组的乘法_在Python中乘法非常大的2D数组
  4. Oracle redo
  5. maven release插件将一版本发布到仓库中时Return code is: 401, ReasonPhrase:Unauthorized
  6. pandas之dataframe去掉冗余行以及左连接合并dataframe
  7. Q2 Spring Boot自动配置原理(ok)
  8. fastunfolding算法_社区发现算法综述—part1
  9. 安卓安装之离线搭建Android Studio开发环境
  10. spark第十篇:Spark与Kafka整合
  11. Linux怎么查看编译ARM平台程序的编译器arm-linux-gcc
  12. Extjs使用(最最基础)
  13. JavaWeb:(练习)十四、基于mybatis框架的简单的学生管理系统
  14. 5节锂电池升压充电管理芯片
  15. java分布式事务框架_Java分布式事务,及解决方案
  16. linux 文本字符串过滤,Linux文本过滤与处理命令
  17. thingsboard2.4.3 api接口调用简单说明
  18. 大话Linux之 跟我走吧,现在就出发[2]Linux我想和你在一起(2)Vim,vim,I love you!有图有真相!
  19. 全网最全面的python的讲解,讲的无可挑剔《记得收藏》
  20. matlab 运算符

热门文章

  1. Android拦截黑名单(简易版)
  2. Ubuntu Edgy Sources list
  3. 游戏鼠标的dpi测试软件,自己就可以测试鼠标的DPI
  4. Zookeeper集群启动异常: Cannot open channel to x at election address xx/xxx.xxx.xxx.xxx:3888
  5. postman Error: connect ECONNREFUSED xxx
  6. [iOS]-Masonry的使用
  7. 搭建qnx开发环境,虚拟qnx系统+虚拟win7系统+QNX Momentics IDE 4.6
  8. 斯帅:没料到詹姆斯会耗光时间再投
  9. 若问杭州何处好,此中听得野莺啼——关于杭州
  10. KeyMix for Mac破解教程