STM32驱动LCD实战
前段时间写了《STM32驱动LCD原理》和《STM32的FSMC外设简介》两篇文章,本文将对STM32驱动LCD进行实战应用。LCD是深圳市拓普微科技开发有限公司的LMT028DN,分辨率是320*240,大小2.8寸,颜色65K的彩色屏,采用的是ST7789s液晶控制IC。颜色模式是565。
01 驱动时序
我们通常说的MCU-LCD接口,就是8080接口,8080接口的详细介绍请看《STM32驱动LCD原理》。
下面是LMT028DN给出的8080模式总线时序
下面是总线时序中的参数
时序参数
Tast->地址设置时间
Taht->地址保持时间(写)
Tchw->芯片选择高脉冲宽度
Tcs->芯片选择设置时间(写)
Tcsf->芯片选择等待时间(写)
Twc->写入周期
Twrh->控制脉冲高电平时间
Twrl->控制脉冲低电平时间
Tdst->数据设置时间
Tdht->数据保持时间
根据FSMC的配置和时序图,我们需要的3个时序参数是
3个重要参数
1、地址建立时间:5ns
2、地址保持时间:13ns
3、数据建立时间:13ns
以上数据均是满足时序图的最小时间,实际应用中,不能设置成最小值,也不能大于最大值(如果有的话),以实际应用为主,如果设置时间太快,反而不稳定。
因为我们把LCD使用8080接口驱动SRAM的方式,所以可以选择FSMC的模式1和模式A,但是/RD的切换,也就是FSMC的NOE的切换,所以只能选择模式A,观察时序图,读写时序一致,所以可以选择读写一致的配置。
02 FSMC外设配置
FSMC外设配置代码,具体FSMC外设解析请看《STM32的FSMC外设简介》
- readWriteTiming.FSMC_AddressSetupTime = 0x02; //地址建立时间(ADDSET)为2个HCLK 2*1/120M=16ns
- readWriteTiming.FSMC_AddressHoldTime = 0x02; //地址保持时间(ADDHLD),16ns
- readWriteTiming.FSMC_DataSetupTime = 0x06; //数据建立时间,50ns
- readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;//总线恢复时间
- readWriteTiming.FSMC_CLKDivision = 0x00;// 时钟分频因子
- readWriteTiming.FSMC_DataLatency = 0x00;//数据产生时间
- readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A; //模式A
- FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;// 这里我们使用NE1 ,也就对应BTCR[6],[7]。
- FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;// 不复用数据地址
- FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;
- FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存储器数据宽度为8bit
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;// 存储器写使能
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;// 读写使用相同的时序
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming;//读写时序
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &readWriteTiming;//写时序
读写接口代码:
结构体定义,这里利用了结构体地址递增特性
- typedef struct
- {
- uint8_t LCD_CMD;//用于LCD命令操作
- uint8_t LCD_DATA;//用于LCD数据操作
- } LCD_TypeDef;
- #define LCD_BASE ((uint32_t)(0x60000000 | 0x0000FFFF))
- #define LCD ((LCD_TypeDef *) LCD_BAS
读写接口
- void LMT028_Write_Cmd ( uint8_t usCmd )
- {
- LCD->LCD_CMD=usCmd;
- }
- void LMT028_Write_Data ( uint8_t usData )
- {
- LCD->LCD_DATA = usData;
- }
也可以简单明了的如下写法
- #define FSMC_Addr_LMT028_CMD ( ( uint32_t ) 0x60000000 )
- #define FSMC_Addr_LMT028_DATA ( ( uint32_t ) 0x60010000 )
- void LMT028_Write_Cmd ( uint8_t usCmd )
- {
- *( (uint32_t * )FSMC_Addr_LMT028_CMD)=usCmd;
- }
- void LMT028_Write_Data ( uint8_t usData )
- {
- *( (uint32_t * )FSMC_Addr_LMT028_DATA) = usData;
- }
03 背光驱动
LED背光驱动,根据高电平的占空比决定的,共有32个亮度等级,使用PWM驱动最为合适,通过调节占空比,调节亮度。
04 复位驱动
复位脚大于10ms的低电平,然后最大170ms的高电平
05 寄存器配置
寄存器配置还是要先参考厂家给的示例demo,根据LMT028手册进行修改,LMT028手册只有重要的寄存器说明,详细的寄存器说明需要参考ST7789手册。
代码开源地址:
https://github.com/strongercjd/STM32F207VCT6
点击查看本文所在的专辑,STM32F207教程
LMT028D手册、ST7789S手册、LMT028D的demo和ST7789S的demo等资料下载链接
下载链接:https://pan.baidu.com/s/1VgAP6GpcOX8bqTvZUPzAcg 提取码:t4uq
STM32驱动LCD实战的更多相关文章
- STM32驱动LCD原理
TFTLCD即薄膜晶体管液晶显示器.它与无源TN-LCD.STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性 ...
- STM32驱动ILI9341控制器控制TFTLCD显示
STM32驱动ILI9341控制器控制TFTLCD显示 一.用STM32控制TFTLCD显示的编程方法,在编程驱动TFTLCD液晶显示器之前,我们先熟悉以下概念: 1.色彩深度,这是一个与TFTLCD ...
- 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...
- [.NET领域驱动设计实战系列]专题二:结合领域驱动设计的面向服务架构来搭建网上书店
一.前言 在前面专题一中,我已经介绍了我写这系列文章的初衷了.由于dax.net中的DDD框架和Byteart Retail案例并没有对其形成过程做一步步分析,而是把整个DDD的实现案例展现给我们,这 ...
- [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结
一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核心复杂性应对之道.实现领域驱动设计 ...
- [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst
一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...
- esp8266的STM32驱动
esp8266的STM32驱动,数据发送接收由DMA完成,释放CPU. 目前只能发送返回消息为成功或失败的AT命令,并判断是否成功,详见esp8266_cmd():其它返回消息不可预知的命令(如查看A ...
- 用普通IO驱动LCD的控制方法-松瀚汇编源程序
/*************************************** 本例程为IO直接驱动LCD的方法 以下是松瀚MCU汇编源程序 **************************** ...
- NET 领域驱动设计实战系列总结
NET 领域驱动设计实战系列总结 一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核 ...
随机推荐
- mini-web框架-装饰器-总结1(5.3.1)
@ 目录 1.说明 2.代码 关于作者 1.说明 原则:开放封闭 可以扩展,但是不可以修改.也就是说软件对扩展开放,对修改关闭. 运用技术:闭包 一共两种方法,一个使用闭包,一个使用类 使用多个装饰器 ...
- Centos7__Scrapy + Scrapy_redis 用Docker 实现分布式爬虫
原理:其实就是用到redis的优点及特性,好处自己查--- 1,scrapy 分布式爬虫配置: settings.py BOT_NAME = 'first' SPIDER_MODULES = ['fi ...
- 从零开始手把手教你使用javascript+canvas开发一个塔防游戏01地图创建
项目演示 项目演示地址: 体验一下 项目源码: 项目源码 代码结构 本节做完效果 游戏主页面 index.html <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- CVE-2017-10271漏洞复现
漏洞描述 Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令. ...
- springboot(一)入门篇
作者:纯洁的微笑 出处:www.ityouknow.com 版权所有,欢迎保留原文链接进行转载:) 根据原文以下内容略有调整(由于SpringBoot版本更新引起) 什么是spring boot Sp ...
- CentOS安装TensorFlow
1.升级python 系统自带的python是2.6,不能用,升级到2.7,方法见:http://www.cnblogs.com/stAr-1/p/9055980.html 2.升级python带来的 ...
- 什么是CDN?哪些是流行的jQuery CDN?使用CDN有什么好处?
内容传送网络或内容分发网络(CDN)是部署在因特网上的多个数据中心的大型分布式服务器系统.CDN的目标是为具有高可 用性和高性能的最终用户提供内容. 有3个流行的jQuery CDN:谷歌,微软jQu ...
- JDBC UPDATE误区
1 package com.lykion; 2 3 import java.sql.Connection; 4 import java.sql.PreparedStatement; 5 import ...
- Spring IOC 笔记
什么是IOC与DI IOC(inversion of control) 它描述的其实是一种面向对象编程中的设计原则,用来降低代码之间的耦合度, 而DI(dependency Injection)依赖注 ...
- java零基础之---常见java面试题
看到别人分享的面试题,感觉蛮全面的,分享出来,慢慢研究答案. 一.Java 基础 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.两个对象的 hashCode() ...