STM32 控制lcm液晶ILI9341驱动的液晶驱动程序(续)

发布者:美丽的1号最新更新时间:2017-09-19 来源: eefocus关键字:STM32  cm液晶  ILI9341驱动  液晶驱动 手机看文章 扫描二维码
随时随地手机看文章

在做项目的过程中遇到了这个问题,感觉文章写得不错,共享给对FSMC的使用怀有疑惑的同伴们!

LCD有如下控制线:
CS:Chip Select片选,低电平有效
RS:Register Select寄存器选择
WR:Write写信号,低电平有效
RD:Read读信号,低电平有效
RESET:重启信号,低电平有效
DB0-DB15:数据线

假如这些线,全部用普通IO口控制。根据LCD控制芯片手册(大部分控制芯片时序差不多):
如果情况如下:
DB0-DB15的IO全部为1(表示数据0xff),也可以为其他任意值,这里以0xff为例。
CS为0(表示选上芯片,CS拉低时,芯片对传入的数据才会有效)
RS为1(表示DB0-15上传递的是要被写到寄存器的值),如果为0,表示传递的是数据。
WR为0,RD为1(表示是写动作),反过来就是读动作。
RESET一直为高,如果RESET为低,会导致芯片重启。
这种情况,会导致一个值0xff被传入芯片,被LCD控制芯片当作写寄存器值去解析。LCD控制芯片收到DB0-15上的值之后,根据其他控制线的情况,它得出结论,这个0xff是用来设置寄存器的。一般情况下,LCD控制芯片会把传入的寄存器值的高8位当做寄存器地址(因为芯片内部肯定不止一个寄存器),低8位当做真正的要赋给对应寄存器值。这样,就完成了一个写LCD控制芯片内部寄存器的时序。

如果上述情况不变,只将RS置低,那么得到的情况如下:LCD控制芯片会把DB0-15上的数据当做单纯的数据值来处理。那么假如LCD处在画图状态,这个传入的值0xff,就会被显示到对应的点上,0xffff就表示白色,那么对应的点就是白色。在这个数据值传递过来之前,程序肯定会通过设置寄存器值,告诉LCD控制芯片要写的点的位置在哪里。

如果上述两种情况都不变,分别把WR和RD的信号反过来(WR=1,RD=0),那么写信号就会被变成读信号。读信号下,主控芯片需要去读DB0-15的值,而LCD控制芯片就会去设置DB0-15的值,从而完成读数据的时序。读寄存器的时序麻烦一点。第一步,先要将WR和RD都置低,主控芯片通过DB0-15传入寄存器地址。第二步就和前面读数据一样,将WR置高,RD置低,读出DB0-15的值即可。在这整个的过程中,RS一直为低。好了,上面就是IO直接控制LCD的方法。假如放到STM32里面,用IO直接控制显得效率很低。

STM32有FSMC(其实其他芯片基本都有类似的总线功能),FSMC的好处就是你一旦设置好之后,WR、RD、DB0-DB15这些控制线和数据线,都是FSMC自动控制的。打个比方,当你在程序中写到:

*(volatile unsigned short int *)(0x60000000)=val;
那么FSMC就会自动执行一个写的操作,其对应的主控芯片的WE、RD这些脚,就会呈现出写的时序出来(即WE=0,RD=1),数据val的值也会通过DB0-15自动呈现出来(即FSMC-D0:FSMC-D15=val)。地址0x60000000会被呈现在数据线上(即A0-A25=0,地址线的对应最麻烦,要根据具体情况来,好好看看FSMC手册)。
那么在硬件上面,我们需要做的,仅仅是MCU和LCD控制芯片的连接关系:
WE-WR,均为低电平有效
RD-RD,均为低电平有效
FSMC-D0-15接LCD DB0-15
连接好之后,读写时序都会被FSMC自动完成。但是还有一个很关键的问题,就是RS没有接,CS没有接。因为在FSMC里面,根本就没有对应RS和CS的脚。怎么办呢?这个时候,有一个好方法,就是用某一根地址线来接RS。比如我们选择了A16这根地址线来接,那么当我们要写寄存器的时候,我们需要RS,也就是A16置高。软件中怎么做呢?也就是将FSMC要写的地址改成0x60020000,如下:
*(volatile unsigned short int *)(0x60020000)=val;
这个时候,A16在执行其他FSMC的同时会被拉高,因为A0-A18要呈现出地址0x60020000。0x60020000里面的Bit17=1,就会导致A16为1。当要读数据时,地址由0x60020000改为了0x60000000,这个时候A16就为0了。

那么有朋友就会有疑问,第一,为什么地址是0x6xxxxxxx而不是0x0xxxxxxx;第二,CS怎么接;第三,为什么Bit17对应A16?
先来看前两个问题,大家找到STM32的FSMC手册,在FSMC手册里面,我们很容易找到,FSMC将0x60000000-0x6fffffff的地址用作NOR/PRAM(共256M地址范围)。而这个存储块,又被分成了四部分,每部分64M地址范围。当对其中某个存储块进行读写时,对应的NEx就会置低。这里,就解决了我们两个问题,第一,LCD的操作时序,和NOR/PRAM是一样的(为什么一样自己找找NOR/PRAM的时序看看),所以我们选择0x6xxxxxxx这个地址范围(选择这个地址范围,操作这个地址时,FSMC就会呈现出NOR/PRAM的时序)。第二,我们可以将NEx连接到LCD的CS,只要我们操作的地址是第一个存储块内即可(即0-0x3ffffff地址范围)。第三个问题再来看一看FSMC手册关于存储器字宽的描述,我们发现,当外部存储器是16位时,硬件管脚A0-A24表示的是地址线A1-A25的值,所以我们要位移一下,Bit17的值,实际会被反应到A16这根IO来。关于数据宽度及位移的问题,初学的朋友可能会比较疑惑,当你接触了多NOR/PRAM这样的器件后,你会发现,很多芯片的总线,都是这样设计的,为的是节省地址线。


关键字:STM32  cm液晶  ILI9341驱动  液晶驱动 引用地址:STM32 控制lcm液晶ILI9341驱动的液晶驱动程序(续)

上一篇:STM32使用fsmc控制NOR flash 例程
下一篇:STM32 控制lcm液晶ILI9341驱动的液晶驱动程序

推荐阅读最新更新时间:2024-03-16 15:37

STM32--简单的IAP操作
STM32支持在应用中编程,也就是所谓的IAP,这对产品的在线升级带来了很大方便。 在线升级的原理简介如下: 在单片机的FLASH中有两段代码,一段是IAP代码,另一段就是用户的应用程序即APP代码,IAP代码放在单片机复位时的起始地址,而APP代码则放在IAP后面的地址,上电时CPU首先执行IAP代码,再通过IAP代码跳转到APP代码开始执行。 在IAP代码执行期间,通过检测某一个事件(如IO电平)来判断是否对APP代码进行更新,如果该事件无效,则不更新,直接跳转到APP代码执行;如果该事件有效,则更新APP代码,而更新的文件则从外部磁盘通过串口或USB写入FALSH应用程序空间。 流程图如下: 当然,这只是一种最简单
[单片机]
STM32--简单的IAP操作
stm32 定时器3产生指定数量的脉冲
一、场景描述:利用PB5产生一定数量的脉冲信号。PB5是定时器3的第2通道。 二、产生PWM代码: void Timer3_Configuration(void ) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_DeInit(TIM3); // ƵÂÊ30K //Õ¼¿Õ±È50% // TIM_TimeBaseStructure.TIM_Period = 100-1; //TIM_TimeBaseStructure.TIM_Prescaler =24-1;
[单片机]
<font color='red'>stm32</font> 定时器3产生指定数量的脉冲
STM32 通用定时器与滴答定时器
STM32 通用定时器与滴答定时器 前言:STM32包括TIM1/TIM8两个高级定时器,TIM2~TIM5四个通用定时器,TIM6/TIM7两个基本定时器,还有使用非常方便的系统滴答定时器(systick),基本操作为:配置(使能时钟/设置工作方式及初值/配置中断/开启中断和时钟/使能定时器) 计数 产生中断。 一、通用定时器使用 void TimerConfig(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能时钟/复位/自动重装载设置/时钟预分频设置/采样分频/up/清除中断/开启时钟 RCC_APB1PeriphClock
[单片机]
STM32学习之路-MDK4.7(JLINk问题)+VIM
主机环境:win7 开发板:STM32F103VE 问题一:MDK4.7a对部分用户的JLINK(当然是山寨版的)存在问题.. 问题描述: 当setting的时候会出现问题,它会叫你升级你的JLINK,这对于我们用山寨版的JLINK用户来说是不可能的,一旦升级就玩完了 所以不能升级。不过有些用户就没有出现这样的问题,不知道是什么回事,连软件都会鄙视人,没法活了.. 解决方案: (1)购买正版的JLINK,然后升级(貌似是废话) (2)下载JLinkARM_V440(我以前的是V410版本的),将改安装目录下的JLinkARM.dll 文件 替换掉keil安装目录下的ARMSegger下的JLin
[单片机]
<font color='red'>STM32</font>学习之路-MDK4.7(JLINk问题)+VIM
STM32的LED闪烁实验
下面我就把点亮STM32 的LED灯过程分享一下: 首先你的了解以下俩点: 1、 了解 STM32 用有几种 GPIO 模式。 2、 怎么学会设置 STM32 的 GPIO 输出控制 LED 灯。 首先我们来看一下我们开发板上面 LED 的接线图: 从上面的图,我们可以看到 LED 灯是接到单片机的 PC 口的 PC0 到 PC7。而 点 亮一盏LED的原理就是把相应LED接到单片机的相应的IO口输出低电平, IO 口 输出为高电平就能够熄灭 LED(由图中得LED灯都是共阳极接高电平,所以 当所接开发板的引脚输出低电平时,有电流流过LED灯,灯才亮)。 了解了这些以后就可以开始动工了》
[单片机]
STM32入门系列-使用库函数点亮LED软硬件分析
电路图分析 首先找来单片机的原理图,根据原理图进行相关的设计工作。 例如在上图中相同网络标号表示它们是连接在一起的,因此D1发光二极管阴极是连接在STM32的PC0管脚上,D2指示灯阴极连接在PC1管脚上,其他LED管脚以此类推。如果要使D1指示灯亮,只需要控制PC0管脚输出低电平, 如果要使D1指示灯灭,只需控制PC0输出高电平。如果你们使用的是其他板子,连接LED的管脚和极性不一样,那么只需要在程序中修改对应的GPIO管脚和输出电平状态即可,原理是一样的。 要点亮D1发光二极管,也就是让STM32的PC0管脚输出一个低电平。 库函数支持文件 如果采用的是库函数开发,需要复制创建好的库函数模板,在此模板上进行程序开发
[单片机]
<font color='red'>STM32</font>入门系列-使用库函数点亮LED软硬件分析
ST推出STM32无线微控制器模块,提升物联网产品开发效率
半导体供应商意法半导体推出一个新的加快物联网产品上市的解决方案,该方案可利用现成的微型STM32无线微控制器(MCU)模块加快基于Bluetooth® LE和802.15.4新物联网设备的开发周期。 这个7mm x 11.3mm的 STM32WB5MMG模块让缺少无线设计能力的产品研发团队也能开发物联网产品。为开发层数最少的低成本PCB电路板而设计,新模块集成了直到天线的整个射频子系统。用户还可以免费使用意法半导体的STM32Cube MCU开发生态系统工具、设计向导、射频协议栈和完整软件库,快速高效地完成开发项目。 意法半导体部门副总裁兼微控制器产品总经理Ricardo de Sa Earp表示:“我们的首个基于S
[单片机]
ST推出<font color='red'>STM32</font>无线微控制器模块,提升物联网产品开发效率
STM32快速入门教程
开发 编译的 软件 : IAR EWARM 4.42A JTAG工具: ST-LINK2(开发板自带) 开发板: 万利 STM32EK(199元) 建议 看的 资料 : 《STM32F10X-128K-EVAL MCU》 ST公司 STM32开发板的电路图 《STM32技术参考 手册 RM0008.pdf 或 STM32F103-CN.pdf 》 《Cortex-M3权威指南Cn.pdf》 《如何在IAR下使用STM库.pdf》 《STM32F10xxx_Library_Manual_ChineseV2.pdf》 《汉化STM32F的固件.rar》----网友: SUNKE9 《 netjob的BLO
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved