学习资料:(RM0090) STM32F4x5,4x7,4x9 Reference Manual
常见的有些LCD模块是8080并行数据接口的,在8位MCU时代一般都用GPIO模拟时序来操作。现在最流行的 ARM Cortex-mx 系列,因为引脚都比较多,用老办法GPIO模拟不是问题。不过 STM32 某些型号是具有 FMC 或者 FSMC 硬件的,可以产生LCD模块需要的数据和读、写控制信号。在引脚分配允许的情况下,用 FMC (FSMC) 来访问可以使程序更简捷。还有一个优势是可以把 LCD 模块当作内存设备,用 DMA 进行内存到内存传输,提高程序的效率。
在最早的 STM32F103Vxx 高级型号中,就有了 FSMC (Flexible Static Memory Controller) 硬件,可以外扩8080总线接 NOR Flash、SRAM来用,接并行总线的LCD模块也不是问题。后来更强大的STM32系列中的 FMC (Flexible Memory Controller) 除了包含 FSMC 的功能外,还是支持 SDRAM 的,出现在最高频率 180MHz 以上的 F4xx 型号,以及 F7xx 等型号。我还见到过某个文档里面把 FSMC (不带SDRAM支持)也称作了 FMC 的。
我DIY过一块 STM32F427VIT6 的实验板,把 FMC 的 8080 总线信号引了出来。F427的FMC功能比较多,LQFP100的版本因为引脚不够不能支持SDRAM. 我读了手册发现,FMC的配置寄存器是按功能分组的。
使用 SRAM 或者是 LCD 模块,用到的是 Bank 1. 有四个独立的片选信号NE1,...,NE4可用,可以挂四片 SRAM 呢。
因为现在没有数据/地址线复用,访问按照模式1来就可以了,NBL信号也是不需要的。
按照手册的提示,这样用 NOR/PSRAM 需要设置的寄存器就两个:
具体地,手册给出了如何设置:
BCR是控制寄存器,把数据总线位宽设成16-bit (按我的LCD模块需要),把写操作允许,再使能这个bank即可。其它数据位都按默认。
BTR是跟访问时间相关的,缺省值是最慢的,所以我把它们写成比较小的值。
好,编写初始化 FMC 的代码:
除了将 FMC 硬件使能,仅仅需要设置两个寄存器就够了(前提:GPIO的功能要事先配置成FMC的功能引脚), 竟然如此简单!
向 LCD 写数据也很简单了,定义两个指针访问,将FMC地址线 A16 连到 LCD 的 D/C 脚(区分数据还是命令,在F427Vx上没有A0~A15脚可用)
volatile uint16_t *pcmd=0x60000000;
volatile uint16_t *pdata=0x60020000;
这样,对 *pcmd 操作就是以 D/C=0 读或者写,对 *pdata 操作就是以 D/C=1 读或者写。
测试工作效果:
|