您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 芯达STM32入门系列教程之十三《点亮LCD液晶屏》
STM32入门系列教程点亮LCD液晶屏Revision0.01(2010-04-28)原想把本期《点亮LCD液晶屏》教程放在《GPIO编程》之后,以提高大家的兴趣,但考虑到可能网友学习STM32,是想更多地了解STM32内部工作机制,因此在之前的教程,我们先介绍了串口、外部中断、定时器等最基本的外设模块,有了这些基础,相信您再来学习LCD液晶,已经很轻松了。我们使用的是芯达STM32配套的2.4寸TFT液晶触摸屏,它是山寨手机上的触摸液晶屏,内部驱动IC为ILI9325。我们操作LCD,实际上就是在操作ILI9325。有关该芯片的资料,请参考如下两个网址:ILI9325英文datasheet:=1979ILI9325指令说明(中文):=1980考虑到“触摸”涉及到太多的原理,因此把触摸屏单独列出一期教程详细讲解。这里只讲述如何去点亮LCD液晶屏,如果您看完本期教程,能理解LCD驱动过程,那么笔者心满意足。要驱动LCD,分两个部分讲解:1、CPU内部模块支持的LCD接口(这里使用FSMC模块)2、LCD控制电路一、STM32的FSMC原理如果是单片机,相信大家再熟悉不过了,直接拿P0或者P1口用作LCD数据总线,再另外拿出几个IO口用作控制信号线——一个LCD控制电路完成了。STM32相对于单片机,有啥过人之处呢?对于STM32系列的CPU来说,有两种方法给LCD总线赋值。第一个方法,就是给对应的GPIOx_ODR寄存器赋值——这与单片机一样,单片机也是给P0-P3寄存器赋值,使得信号能从对应的IO端口输出。而STM32的另一种方法就是使用FSMC。FSMC全称“静态存储器控制器”。使用FSMC控制器后,我们可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。1、FSMC包括哪几个部分?FSMC包含以下四个模块:(1)AHB接口(包含FSMC配置寄存器)(2)NOR闪存和PSRAM控制器(3)NAND闪存和PC卡控制器(4)外部设备接口要注意的是,FSMC可以请求AHB进行数据宽度的操作。如果AHB操作的数据宽度大于外部设备(NOR或NAND或LCD)的宽度,此时FSMC将AHB操作分割成几个连续的较小的数据宽度,以适应外部设备的数据宽度。2、FSMC对外部设备的地址映像从上图可以看出,FSMC对外部设备的地址映像从0x60000000开始,到0x9FFFFFFF结束,共分4个地址块,每个地址块256M字节。可以看出,每个地址块又分为4个分地址块,大小64M。对NOR的地址映像来说,我们可以通过选择HADDR[27:26]来确定当前使用的是哪个64M的分地址块,如下页表格。而这四个分存储块的片选,则使用NE[4:1]来选择。数据线/地址线/控制线是共享的。这里的HADDR是需要转换到外部设备的内部AHB地址线,每个地址对应一个字节单元。因此,若外部设备的地址宽度是8位的,则HADDR[25:0]与STM32的CPU引脚FSMC_A[25:0]一一对应,最大可以访问64M字节的空间。若外部设备的地址宽度是16位的,则是HADDR[25:1]与STM32的CPU引脚FSMC_A[24:0]一一对应。在应用的时候,可以将FSMC_A总线连接到存储器或其他外设的地址总线引脚上。二、LCD控制电路设计1、信号线的连接STM32F10xxxFSMC有四个不同的banks(每个64M字节)可支持NOR以及其他类似的存储器。这些外部设备的地址线,数据先和控制线是共享的。每个设备的访问通过片选来决定,而每次只能访问一个设备。FSMC提供了所有的LCD控制器的信号:FSMC_D[16:0]16bit的数据总线FSMCNEx:分配给NOR的256M,再分为4个区,每个区用来分配一个外设,这四个外设的片选分为是NE1-NE4,对应的引脚为:PD7—NE1,PG9—NE2,PG10-NE3,PG12—NE4FSMCNOE:输出使能,连接LCD的RD脚。FSMCNWE:写使能,连接LCD的RW脚。FSMCAx:用在LCD显示RAM和寄存器之间进行选择的地址线,即该线用于选择LCD的RS脚,该线可用地址线的任意一根线,范围:FSMC_A[25:0]。注:RS=0时,表示读写寄存器;RS=1表示读写数据RAM。举例1:选择NOR的第一个存储区,并且使用FSMC_A16来控制LCD的RS引脚,则我们访问LCD显示RAM的基址为0x60020000,访问LCD寄存器的地址为:0x60000000。举例2:选择NOR的第四个存储区,使用FSMC_A0控制LCD的RS脚,则访问LCD显示RAM的基址为0x60000002,访问LCD寄存器的地址为:0x60000000。实际上,可用于LCD接口的NOR存储块信号如下:FSMC_D[15:0],连16bit数据线FSMC_NE1,连片选:只有bank1可用FSMCNOE:输出使能FSMCNEW:FSMC写使能FSMCAx:连接RS,可用范围FSMC_A[23:16]2、时序问题一般使用模式B来做LCD的接口控制,不适用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用三个参数:ADDSET,DATAST,ADDHOLD。这三个参数在位域FSMC_TCRx中设置。当HCLK的频率是72MHZ,使用模式B,则有如下时序:地址建立时间:0x1地址保持时间:0x0数据建立时间:0x5好像有点理论化,呵呵,我们来编程看看就理解了。三、LCD驱动编写请大家在阅读此部分之前,务必先阅读LCD的驱动IC:ILI9325。查看在本期教程开始,我们给出的两个网址即可。我们的思路是:既然想使用STM32的FSMC模块,就首先要使能它的时钟,并初始化这个模块。然后初始化LCD启动配置,这时候,我们才可以编写用户程序,来控制LCD显示各种字符、图形。根据这个思路,我们调用函数:RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);来使能FSMC模块所使用的时钟。呵呵,STM32固件库果然给我们提供了超方便的库函数,我们无需了解任何东西,只要知道调用这个函数即可。项目开发进度大大加快。下面配置FSMC初始化部分,采用的函数是FSMC_LCD_Init();,来看下它的实现吧!voidFSMC_LCD_Init(void){FSMC_NORSRAMInitTypeDefFSMC_NORSRAMInitStructure;FSMC_NORSRAMTimingInitTypeDefFSMC_TimingInitStructure;FSMC_TimingInitStructure.FSMC_AddressSetupTime=0x02;FSMC_TimingInitStructure.FSMC_AddressHoldTime=0x00;FSMC_TimingInitStructure.FSMC_DataSetupTime=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_NORSRAMInitStructure.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_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=&FSMC_TimingInitStructure;FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct=&FSMC_TimingInitStructure;FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);}上面的函数实现字体是小五,如果需要查看完整FSMC-TFT-LCD例程,请查看芯达STM32的光盘。此部分可作为一个模板,复制到您的项目文件中直接使用。实际上,控制LCD关键在于下面的初始化序列:LCD_WriteReg(0x00E3,0x3008);//Setu16ernaltimingLCD_WriteReg(0x00E7,0x0012);//Setu16ernaltimingLCD_WriteReg(0x00EF,0x1231);//Setu16ernaltimingLCD_WriteReg(0x0001,0x0100);//setSSandSMbitLCD_WriteReg(0x0002,0x0700);//set1lineinversionLCD_WriteReg(0x0003,0x1038);//setGRAMwritedirectionandBGR=1.LCD_WriteReg(0x0004,0x0000);//ResizeregisterLCD_WriteReg(0x0008,0x020E);//setthebackporchandfrontporchLCD_WriteReg(0x0009,0x0000);//setnon-displayarearefreshcycleISC[3:0]LCD_WriteReg(0x000A,0x0000);//FMARKfunctionLCD_WriteReg(0x000C,0x0000);//RGBu16erfacesettingLCD_WriteReg(0x000D,0x0000);//FramemarkerPositionLCD_WriteReg(0x000F,0x0000);/
本文标题:芯达STM32入门系列教程之十三《点亮LCD液晶屏》
链接地址:https://www.777doc.com/doc-2121003 .html