芯达STM32入门系列教程之十三《点亮LCD液晶屏》

上传人:qt****68 文档编号:43503575 上传时间:2018-06-06 格式:DOC 页数:6 大小:147KB
返回 下载 相关 举报
芯达STM32入门系列教程之十三《点亮LCD液晶屏》_第1页
第1页 / 共6页
芯达STM32入门系列教程之十三《点亮LCD液晶屏》_第2页
第2页 / 共6页
芯达STM32入门系列教程之十三《点亮LCD液晶屏》_第3页
第3页 / 共6页
芯达STM32入门系列教程之十三《点亮LCD液晶屏》_第4页
第4页 / 共6页
芯达STM32入门系列教程之十三《点亮LCD液晶屏》_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《芯达STM32入门系列教程之十三《点亮LCD液晶屏》》由会员分享,可在线阅读,更多相关《芯达STM32入门系列教程之十三《点亮LCD液晶屏》(6页珍藏版)》请在金锄头文库上搜索。

1、 STM32入门系列教程 点亮LCD液晶屏 Revision 0.01 ( 2010-04-28 ) 原想把本期点亮LCD液晶屏教程放在GPIO编程之后,以提高大家的兴趣,但考虑 到可能网友学习STM32,是想更多地了解STM32内部工作机制,因此在之前的教程,我们先 介绍了串口、外部中断、定时器等最基本的外设模块,有了这些基础,相信您再来学习LCD 液晶,已经很轻松了。 我们使用的是芯达STM32配套的2.4寸TFT液晶触摸屏,它是山寨手机上的触摸液晶屏,内 部驱动IC为ILI9325。我们操作LCD,实际上就是在操作ILI9325。有关该芯片的资料,请参 考如下两个网址: ILI9325英

2、文datasheet:http:/ ILI9325指令说明(中文):http:/ 考虑到“触摸”涉及到太多的原理,因此把触摸屏单独列出一期教程详细讲解。这里只讲 述如何去点亮LCD液晶屏,如果您看完本期教程,能理解LCD驱动过程,那么笔者心满意足。要驱动LCD,分两个部分讲解: 1、CPU内部模块支持的LCD接口(这里使用FSMC模块) 2、LCD控制电路 一、STM32的FSMC原理 如果是单片机,相信大家再熟悉不过了,直接拿P0或者P1口用作LCD数据总线,再另外拿 出几个IO口用作控制信号线 一个LCD控制电路完成了。STM32相对于单片机,有啥过 人之处呢? 对于STM32系列的CPU

3、来说,有两种方法给LCD总线赋值。第一个方法,就是给对应的 GPIOx_ODR寄存器赋值 这与单片机一样,单片机也是给P0-P3寄存器赋值,使得信号 能从对应的IO端口输出。而STM32的另一种方法就是使用FSMC。FSMC全称“静态存储器控 制器”。使用FSMC控制器后,我们可以把FSMC提供的FSMC_A25:0作为地址线,而把 FSMC提供的FSMC_D15:0作为数据总线。 1、FSMC包括哪几个部分? FSMC包含以下四个模块: (1)AHB接口(包含FSMC配置寄存器) (2)NOR闪存和PSRAM控制器 (3)NAND闪存和PC卡控制器 (4)外部设备接口 要注意的是,FSMC可

4、以请求AHB进行数据宽度的操作。如果AHB操作的数据宽度大于 外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的 数据宽度,以适应外部设备的数据宽度。 2、FSMC对外部设备的地址映像 从上图可以看出,FSMC对外部设备的地址映像从0x6000 0000开始,到0x9FFF FFFF结束, 共分4个地址块,每个地址块256M字节。可以看出,每个地址块又分为4个分地址块,大小64M。对NOR的地址映像来说,我们可以通过选择HADDR27:26来确定当前使用的是哪个 64M的分地址块,如下页表格。而这四个分存储块的片选,则使用NE4:1来选择。数据线/ 地址

5、线/控制线是共享的。 这里的HADDR是需要转换到外部设备的内部AHB地址线,每个地址对应一个字节单元。因 此,若外部设备的地址宽度是8位的,则HADDR25:0与STM32的CPU引脚FSMC_A25:0一 一对应,最大可以访问64M字节的空间。若外部设备的地址宽度是16位的,则是 HADDR25:1与STM32的CPU引脚FSMC_A24:0一一对应。在应用的时候,可以将FSMC_A 总线连接到存储器或其他外设的地址总线引脚上。 二、LCD控制电路设计 1、信号线的连接 STM32F10xxx FSMC有四个不同的banks(每个64M字节)可支持NOR以及其他类似的存 储器。这些外部设备

6、的地址线,数据先和控制线是共享的。每个设备的访问通过片选来决定, 而每次只能访问一个设备。 FSMC提供了所有的LCD控制器的信号: FSMC_D16:0 16bit的数据总线 FSMC NEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外 设的片选分为是NE1-NE4,对应的引脚为:PD7NE1,PG9NE2,PG10-NE3,PG12 NE4 FSMC NOE:输出使能,连接LCD的RD脚。 FSMC NWE:写使能,连接LCD的RW脚。 FSMC Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的 RS脚,该线可用地址线的任意一根线,

7、范围:FSMC_A25:0。 注:RS = 0时,表示读写寄存器;RS = 1表示读写数据RAM。 举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们 访问LCD显示RAM的基址为0x6002 0000,访问LCD寄存器的地址为:0x6000 0000。 举例2:选择NOR的第四个存储区,使用FSMC_A0控制LCD的RS脚,则访问LCD显示 RAM的基址为0x6000 0002,访问LCD寄存器的地址为:0x6000 0000。 实际上,可用于LCD接口的NOR存储块信号如下: FSMC_D15:0,连16bit数据线 FSMC_NE1,连片选:只有ba

8、nk1可用 FSMC NOE:输出使能 FSMC NEW:FSMC写使能 FSMC Ax:连接RS,可用范围FSMC_A23:16 2、时序问题 一般使用模式B来做LCD的接口控制,不适用外扩模式。并且读写操作的时序一样。此种情 况下,我们需要使用三个参数:ADDSET,DATAST,ADDHOLD。这三个参数在位域 FSMC_TCRx中设置。 当HCLK的频率是72MHZ,使用模式B,则有如下时序: 地址建立时间:0x1 地址保持时间:0x0 数据建立时间:0x5 好像有点理论化,呵呵,我们来编程看看就理解了。 三、LCD驱动编写 请大家在阅读此部分之前,务必先阅读LCD的驱动IC:ILI9

9、325。查看在本期教程开始,我 们给出的两个网址即可。 我们的思路是:既然想使用STM32的FSMC模块,就首先要使能它的时钟,并初始化这个模 块。然后初始化LCD启动配置,这时候,我们才可以编写用户程序,来控制LCD显示各种字 符、图形。 根据这个思路,我们调用函数: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); 来使能FSMC模块所使用的时钟。呵呵,STM32固件库果然给我们提供了超方便的库函 数,我们无需了解任何东西,只要知道调用这个函数即可。项目开发进度大大加快。 下面配置FSMC初始化部分,采用的函数是FSMC_LCD_Init

10、();,来看下它的实现吧! void FSMC_LCD_Init(void) FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure; FSMC_NORSRAMTimingInitTypeDef FSMC_TimingInitStructure; FSMC_TimingInitStructure.FSMC_AddressSetupTime = 0x02; FSMC_TimingInitStructure.FSMC_AddressHoldTime = 0x00; FSMC_TimingInitStructure.FSMC_DataSetupTime =

11、 0x05; FSMC_TimingInitStructure.FSMC_BusTurnAroundDuration = 0x00; FSMC_TimingInitStructure.FSMC_CLKDivision = 0x00; FSMC_TimingInitStructure.FSMC_DataLatency = 0x00; FSMC_TimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_B; FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; FSMC_NORSRAM

12、InitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable; FSMC_NORSRAMInit

13、Structure.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_

14、NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable; FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable; FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable; FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = FSMC_NORSRAMInitStructure.FSMC_WriteTim

15、ingStruct = FSMC_NORSRAMInit( FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE); 上面的函数实现字体是小五,如果需要查看完整FSMC-TFT-LCD例程,请查看芯达STM32 的光盘。此部分可作为一个模板,复制到您的项目文件中直接使用。实际上,控制LCD关键 在于下面的初始化序列: LCD_WriteReg(0x00E3, 0x3008); / Set u16ernal timing LCD_WriteReg(0x00E7, 0x0012); / Set u16ernal timing LCD_WriteReg(0x00EF

16、, 0x1231); / Set u16ernal timing LCD_WriteReg(0x0001, 0x0100); / set SS and SM bit LCD_WriteReg(0x0002, 0x0700); / set 1 line inversion LCD_WriteReg(0x0003, 0x1038); / set GRAM write direction and BGR=1. LCD_WriteReg(0x0004, 0x0000); / Resize register LCD_WriteReg(0x0008, 0x020E); / set the back porch and front porch LCD_WriteR

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号