微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32学习笔记(6.1):LCD的显示

STM32学习笔记(6.1):LCD的显示

时间:11-24 来源:互联网 点击:
电路设计
1. 信号线的连接
STM32F10x FSMC有4个不同的banks,每一个64MB,可支持NOR以及其他类似的存储器。这些外部设备的地址线、数据线和控制线是共享的。每个设备的访问时通过片选信号来决定的,而每次只能访问一个设备。我们的LCM就是连接在NOR的bank上面。
FSMC_D[15:0]:16bit的数据总线,连接ILI9325的数据线;
FSMC_NEx:分配给NOR的256MB的地址空间还可以分为4个banks,每一个区用来分配一个外设,这4个外设分别就是NE1-NE4;
FSMC_NOE:输出使能,连接ILI9325的nRD引脚;
FSMC_NWE:写使能,连接ILI9325的nWR引脚;
FSMC_Ax:用在LCD显示RAM和寄存器之间进行选择的地址线,这个和ILI9325的RS引脚相连。该线可用任意一根地址线,范围是FSMC_A[25:0]。当RS=0时,表示读写寄存器,RS=1时,表示读写数据RAM。
其实关于RS的表述也并不完全准确,应该这么理解,RS=0的时候,向这个地址写的数表示了选择什么寄存器进行操作,然而要对寄存器进行什么操作,则要看当RS=1时,送入的数据了。
关于地址的计算,如果我们选择NOR的第一个存储区,并且使用FSMC_A16来控制ILI9325的RS引脚,则如果要访问寄存器地址(RS=0),那么地址是0x6000 0000(起始地址),如果要访问数据区(RS=1),那么基地址应该是0x6002 0000。
有人会问,为什么不是0x6001 0000呢?因为FSMC_A16=1。因为在前文中已经说过,若外部设备的地址宽度是16位的,则是HADDR[25:1]与STM32的CPU引脚FSMC_A[24:0]一一对应。也就是说,内部产生的地址应该要左移一位,FSMC_A16=1,代表着第17位为1,而不是第16位为1。如果外部设备的地址宽度是8位的话,则不会出现这个问题。
再举一个例子,如果选择NOR的第4个存储区,使用FSMC_A0来控制RS引脚,则访问数据区的地址为0x6000 0002,访问LCD寄存器的地址为:0x6000 0000。
2. 时序问题
一般使用模式2来做LCD的接口控制,不使用外扩模式。并且读写操作的时序一样。此种情况下,我们需要使用3个参数:ADDSET、DATAST、ADDHOLD。时序的计算需要根据NOR闪存存储器的特性和STM32F10x的时钟HCLK来计算这些参数。
写或读访问时序是存储器片选信号的下降沿与上升沿之间的时间,这个时间可以由FSMC时序参数的函数计算得到:
写/读访问时间 = ((ADDSET + 1) + (DATAST + 1)) × HCLK
在写操作中,DATAST用于衡量写信号的下降沿与上升沿之间的时间参数:
写使能信号从低变高的时间 = t WP = DATAST × HCLK
为了得到正确的FSMC时序配置,下列时序应予以考虑:
最大的读/写访问时间、不同的FSMC内部延迟、不同的存储器内部延迟
因此得到:
((ADDSET + 1) + (DATAST + 1)) × HCLK = max (t WC , t RC )
DATAST × HCLK = tWP
DATAST必须满足:
DATAST = (tAVQV+ tsu(Data_NE) + tv(A_NE) )/HCLK – ADDSET – 4
由于我没有找到ILI9325的这些时序的参数,所以就参考了一些以前别人写的程序里面的时序配置:
当 HCLK 的频率是 72MHZ,使用模式 B,则有如下时序:
地址建立时间:0x1
地址保持时间:0x0
数据建立时间:0x5

6. 程序编写步骤
对于程序的编写,一般步骤是:
1. 初始化RCC;
2. 初始化GPIO;
3. 初始化FSMC;
4. 初始化LCD;
5. 往GRAM里面写入显示数据。
其中RCC、GPIO、FSMC的初始化函数在STM32的固件库中已经有相应的函数,在此就不一一赘述了,如果有不懂的,可以参考以前我写的学习笔记。FSMC的初始化参数很多,而且基本上可以通用,因此在此也不对每一个参数具体有什么用进行解释了,一般来说,用通用参数就足够普通的开发了。
而对LCD的初始化,则需要自己编写相应的代码。基本原则是,首先向寄存器地址写入需要操作的寄存器地址(代码),然后再根据Datasheet,向数据区地址写入相应的数据,以实现某些操作。具体的操作在ILI9325的Datasheet 第8节Register Descriptions中,有详细的解释。而LCD的初始化只要按照Datasheet里面的,把每一个寄存器都给配置好了,就没有问题了。而这些寄存器的配置,大部分都是通用的,只是有一些屏幕方向选择,坐标系等会略有差别。
LCD配置好之后,就可以往GRAM里面写入图像数据了,在这里推荐一个软件“Image2LCD”,这个软件能读取图像,然后生成C代码的数据,只要将这些生成的代码直接写入GRAM中,就可以显示出图像了。不过要记住,在图像转换的时候,输出数据类型选择“C语言数组”,扫描模式选择“水平扫描”,输出灰度“16位真彩色”,最大宽度和高度“320”“240”勾选“高位在前(MSB First)”。这些配置都是和ILI9325的寄存器配置相对应的,如果说ILI9325的配置和本文中的不一样,则需要相应的选择其他的选项。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top