实验内容:通过FSMC总线来操作LCD屏的显示
实验目的:掌握FSMC总线的操作使用方法,为下一步操作触摸屏提前做好准备。
关于FSMC总线的介绍前面已经略有介绍,在此不作赘述。只是简单说一下其配置过程既需要注意的几点问题:
一、 FSMC内部结构和映射地址空间
FSMC包含AHB接口、NOR Flash和PSRAM控制器、NANDflash和PC卡控制器、外部设备接口4个主要模块。在ST吗内部,FSMC的一端通过内部高速总线AHB连接内核,另一端则是面向扩展存储器的外部总线。内核对外部存储器的访问信号发送到AHB总线后,经过FSMC转换为符合外部存储器规约的信号,送到外部存储器响应的管脚,视线内河鱼 数据交换。FSMC起到了桥梁的作用,既能够进行信号类型的转换,有能够进行信号宽度和时序的调整,屏蔽掉不同存储器之间的差异。
FSMC内部包含NOR Flash和NAND /PC Card两个控制器,可以分别支持两种截然不同的存储器访问方式,本实验选用的是前者。
FSMC管理1GB的映射地址空间。该空间氛围4个大小256k d的bank ,每个bank又分为4个大小为64K的子bank 。这个问题牵扯到缩扩展的外部存储器的地址问题,务必要注意仔细选择。各bank相互独立,均拥有独立的片选线和控制器。
二、FSMC总线配置步骤
(1)确定映射地址空间:本例程选用的是bank1 的第四个子bank ,前面也提到过,选择的BANK不同则外设对应的地址不同:我们选择的是BANK1,NE4对应的两个地址为:LCD_REG寄存器地址:0x6C00 0000 ;LCD_Data数据地址:0x6C00 0000 | (1《《(n+1))。
将AFIO的A0接至LCD的C/D(Command/data)脚 就自动切换了命令和数据。如果RS接到地址线的A0上,当RS为0时对应寄存器地址0x6C00 0000;当RS为1时,对应数据地址0x6C00 0002;若选择的的是bank1的NE1,则寄存器地址0x6000 0000;数据地址:0x6000 0002.
(2)确定扩展使用的映射地址空间后进而:
1、确定硬件电路中用于选中该存储器的片选线FSMC_NEx,
2、FSMC配置中用于配置该外部存储器的特殊功能寄存器号,
(3) 配置存储器基本特征
根据选用的存储器芯片确定需要配置的存储器特征:
1确定存储器类型(SRAM)
2确定存储器芯片的数据和地址引脚是否复用,
3确定存储器芯片的数据线宽度,
4对于NOR Flash,确定是否采用同步突发访问方式,
5对于NOR Flash,NWIT信号的特性说明,
6对于该存储器芯片的读写操作,确定是否采用相同的时许参数来确定时序关系。
(4) 配置存储器时序参数
FSMC通过使用可编程的存储器时序参数寄存器,拓展了可选用的外部存储器的速度范围,fsmc 的NOR Flash控制器支持同步和异步突发两种访问方式,本例选用的后者,主要设置3个时间参数:地址建立时间;数据建立时间;地址保持时间。具体参数见选扩展的存储器芯片手册。
三、在此只将主函数分析如下:(其他文件见工程文件)
#include "main.h"
#include "led1.h"
#include "eepw.h" //图像数组
int main(void)
{
LCD_GPIO_Config(); //LCD 用到的GPIO初始化
LCD_FSMCConfig(); //FSMC总线初始化
Delay(100); // FSMC重置后必须加延迟才能访问总线设备
STM3210E_LCD_Init(); //LCD初始化
Pant(0x0000); //背景颜色RGB 565
Address_set(0,0,239,319); //坐标设置
// LOGO 写图片/字模数据
for(int i=0;i<76800;i++)
{
lcd_write_color(gImage_eepw[i*2+1],gImage_eepw[i*2]); //发送颜色数据为提高速度高8位低8位分别传递
}
while(1)
{
LedBlink(1); //LED1闪烁
}
}
四、补充说明
FSMC在进行读写的时候只需要关注要读写的数据命令,无需修改读写命令(写寄存器还是写数据?)控制寄存器参数,FSMC会自动的予以识别,并自动进行操作参数的转变。
另外LCD屏的初始化函数也需要密切的关注,一般情况下会给出相应的初始化代码,若没有就需要自己参考手册来进行设置。
实验效果图:
工程文件:
lcd_test.zip