使用MM32F3270 FSMC驱动TFT-LCD

交互式界面被越来越多地集成于多种应用中,例如医疗设备、过程控制、手机和其它手持设备。这些界面主要基于使用彩色lcd的图形hmi(人机界面)。对tft-lcd的需求在全世界范围内极大增长。本文介绍了如何使用 mm32f3270的fsmc(灵活的静态存储控制器)来驱动8080接口的tft-lcd。
01、mm32f3270 fsmc的简要介绍
fsmc是flexible static memory controller(灵活的静态存储控制器)的简称,能够与异步存储器和 lcd等并行外设相连。mm32f3270 的 fsmc支持并行接口的sram、psram 、nor flash 和tft-lcd。
图1 fsmc的功能框图
02、fsmc 的功能特性
mm32的fsmc具有以下特性:
1) 可配置的静态存储器接口包括:
a) sram
b) psram
c) nor flash
2) 支持 intel 8080 协议
3) 支持 moto 6800 协议
4) 8位,16位,32位可配置的数据总线宽度,支持非复用与复用模式
5) bank1 分为 4 块子 bank,每块 64mbit 空间
6) 时序可编程以满足不同的需求
a) 等待周期可编程
b) 总线恢复周期可编程
c) 写,读控制周期可编程
7) 可将32位的ahb访问请求,转换为对外接设备连续的8位,16位的访问
mm32f3270的fsmc提供了对多个并行外设的控制与连接,具体配置取决于存储器类型,主要涉及如下寄存器设置。
01、smctlr 的 sm_data_width[2:0],定义了外部存储器的数据宽度,需根据实际数据宽度配置为8位,16位,32 位,此时需要保障实现数据传输的一致性。
02、smctlr的sm_data_width_set0/1/2 来设置存储器的数据宽度,有三种情况:ahb 操作的数据宽度与存储器数据宽度相同,无数据传输一致性的问题;ahb 操作的数据宽度大于存储器的数据宽度时,ahb 接口将对 hwdata[15:0],hwdatabit[31:16]进行连续写操作,以适应外部设备的数据宽度,读操作时,hrdata[31:0]的低 16 位是有效数据;ahb 操作的数据宽度小于存储器的数据宽度时,若存储设备没有高低字节片选,不允许进行写操作,若存储设备有高低字节选择,通过 bl 控制访问对应字节。可以进行读操作,但有效数据需要用户自己处理。
03、syscfg_cfgr1[30:29]:mode_sel来配置不同模式,默认值为 01
00:兼容 nor flash 接口
01:兼容 8080 协议接口
10:兼容 6800 协议接口
04、smskr0[10:8]用来选择三组不同的寄存器 register set0/set1/set2,以配置不同的时序
fmsc支持的外部接口
表1 fsmc控制器外部信号
03、fsmc 控制lcd的硬件设计
fsmc是如何控制tftlcd的呢?
我们可以把tftlcd当成 sram 设备使用:外部sram的控制一般有:地址线(如a0~a18)、数据线(如d0~d15)、写信号(we)、读信号(oe)、片选信号(cs)。tftlcd的信号我们包括:rs、d0~d15、wr、rd、cs、 rst和bl等,其中真正在操作lcd的时候需要用到的就只有:rs、d0~d15、wr、 rd 和 cs。其操作时序和 sram的控制完全类似,唯一不同就是 tft-lcd 有 rs 信号,但是没有地址信号。tft-lcd通过rs信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如mb039是把rs接在a18上面,那么当fsmc控制器写地址0的时候,会使得a18 变为0,对tft-lcd来说,就是写命令。而fsmc写地址1的时候,a0 将会变为1,对tft-lcd来说,就是写数据。这样,就把数据和命令区分开了,其实就是对应 sram 操作的两个连续地址。当然rs也可以接在其他地址线上,mb039是把rs连接在pd13上面的。mm32f3270的fsmc支持8/16/32位数据宽度,我们这里用到的lcd是16位宽度的,在设置的时候需要选择16位宽。
fsmc 控制lcd 的demo应用中,使用的开发板为mb-039,它支持外接mdm2802与mdm2803两种tft-lcd (320x240 2.8’ 液晶显示屏)。
图2 mb-039实物效果图
下图是mb-039的fsmc与tft-lcd的接口原理图部分,完整原理图可以通过mm32官网下载。
图3 tft-lcd接口原理图
各个信号作用对应如下:
表2 lcd信号对应的电源、复位与mcu接口的引脚说明
04、fsmc 控制lcd的软件设计
fmsc demo应用中,使在库函数样例工程中使用选用:
fsmc_ex8080tftlcd.uvprojx
实验展示如何初始化lcd接口与实现lcd并行驱动显示。
软件分为两个部分:
01)fsmc接口gpio与fsmc接口参数初始化
02)lcd显示初始化与lcd显示
fsmc接口gpio与fsmc接口参数初始化
void bsp_lcd_configure(){ initgpio_lcd(); initfsmc(); lcdc_init_reg(); lcdfillcolor(black); lcdblch();}  
① 在initgpio_lcd()中实现lcd对应io初始化
包括lcd对应nrst引脚,背光控制引脚,fsmc相关的片选,读写,数据/命令,数据d0~d15引脚的初始化。
② 在initfsmc()中实现fsmc功能配置初始化
a. 写操作周期
b. 单个bit数据写入保持时间
c. 写操作时,地址线的建立时间
d. 读操作周期长度设置
e. 存储器数据总线位宽
f. 式选择:8080模式
g. 外接设备的内存大小
void initfsmc(void){ fsmc_inittypedef fsmc_initstructure; fsmc_norsram_bank_inittypedef fsmc_bankinitstructure; rcc_ahb3periphclockcmd(rcc_ahb3enr_fsmc, enable); fsmc_bankinitstructure.fsmc_smreadpipe = 0; fsmc_bankinitstructure.fsmc_readymode = 0; fsmc_bankinitstructure.fsmc_writeperiod = 0x2; fsmc_bankinitstructure.fsmc_writeholdtime = 1; fsmc_bankinitstructure.fsmc_addrsettime = 3; fsmc_bankinitstructure.fsmc_readperiod = 0x1; fsmc_bankinitstructure.fsmc_datawidth = fsmc_datawidth_16bits; fsmc_norsram_bank_init( fsmc_bankinitstructure, fsmc_norsram_bank0); fsmc_initstructure.fsmc_mode = fsmc_mode_8080; fsmc_initstructure.fsmc_timingregselect = fsmc_timingregselect_0; fsmc_initstructure.fsmc_memsize = fsmc_memsize_64mb; fsmc_initstructure.fsmc_memtype = fsmc_memtype_norsram; fsmc_initstructure.fsmc_addrdatamode = fsmc_addrdatamux; fsmc_norsraminit( fsmc_initstructure);}  
lcd显示初始化
bank0地址为0x60000000,0x80000=(0x01 << 19)则是地址线a18的偏移量。首先完成写cmd和data驱动:
void lcdcmd(u8 cmd){ *(u16*)(0x60000000) = cmd;}////////////////////////////////////////////////////////////////////////////////void lcddata(u8 dat){ *(u16*)(0x60000000 | (0x01 << 19)) = dat;}////////////////////////////////////////////////////////////////////////////////void lcddata16(u16 dat){ *(u16*)(0x60000000 | (0x01< (dw - 2)) x = dw - w - 2; if ((y + h) > (dh - 2)) y = dh - h - 2; drawrec (x + dx + 1, y + dy + 1, w, h, getcolor(c)); } else { c = rand(); c = 0x0f; drawrec (dx + 1, dy + 1, dw - 2, dh - 2, getcolor(c)); }}  
将程序下载进入板子我们可以观察到,tftlcd上显示出了下列mindmotion logo:
图4 tft-lcd接口显示logo图
还可以观察到屏幕快速画出不同的颜色方框,表明实验成功。
来源:灵动mm32mcu


如何查看一个网站网址的安全性能是怎样的
高速模数转换器精度透视中的直流误差分析
被动元件大宗品流血竞争,大厂下一步?
数字电位器的内部电路原理图
ARM架构Parker系列将作为下一代无人驾驶汽车核心
使用MM32F3270 FSMC驱动TFT-LCD
医疗器械行业高值医用耗材市场发展概况
等离子电视的技术指标以及优点详解
一种最新改进嵌入Linux实时性的新型方案
MOS管选择注意事项
中国电信科技主任韦乐平:5G商业模式需要变革和创新
两轮电动车行业发展历程
超声波焊接机故障原因及解决办法
Go语言的默认机制
区块链是如何影响新闻业的
中科曙光科学计算云助力打造以油气勘探科研为基础的统一管理平台
一文读懂二极管的直流电阻和动态电阻
Grabity正在鼓励应用程序制造商将他们的应用移植到区块链上
Linux搭建Web服务
供应链上的物联网有怎样的挑战