这里先简单介绍一下FSMC,详细的功能说明还请参照官方的使用说明及其它文章参考。
FSMC全称“静态存储器控制器”。
使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线。
说得简单一点,使用FSMC外设后,对于操作数据线与地址线的工作全与
STM32内部自行完成了,不再需要我们自己加一个延时来处理哪个引脚先高,哪个引脚再低的麻烦工作了。配置完成之后,我们仅需要将要发送的指令或是数据写到对应寄存器后,数据线与地址线的时序就会自动完成了。对于我们编写程序省了不少的时间与精力。
在硬件上,我们需要对目前的nucleo-f412进行修改,首先,需要焊掉SB5与SB6两个锡桥,因为PD8,PD9占用了FSMC的数据线。其实,PB14引脚驱动LD3灯也是与FSMC的D0位冲突的,但是其被不影响数据的输出,因此我们保留这个LED灯,只是在操作的时候会看到LD3红色小灯有时会闪一下。
接下来我们按照Cube提示的FSMC_D的数据线引脚,对液晶屏连接——直连方式。具体连接如下:
FSMC_D[16:0]->16bit地址总线
FSMC NEx:本次使用FSMC NE1,对应SRAM操作方式;
FSMC NOE:输出使能,连接LCD的RD脚
FSMC NWE:写使能,连接LCD的RW脚
FSMC_Ax:本次考虑引脚占用的问题,因此使用A6,即PF12引脚。对应的指令地址为0x60000080,算法就是A6左移 6 + 1位,具体原理请参照官方说明文档了。
本次使用了SSD1298液晶屏,其驱动为ili9325,现在将初始化参数列表分享出来:
const uint16_t InitCmd[57][2] = {
{0x00e7,0x0010},
{0x0000,0x0001},
{0x0001,0x0100},
{0x0002,0x0700},
{0x0003,0x1038},
{0x0004,0x0000},
{0x0008,0x0207},
{0x0009,0x0000},
{0x000a,0x0000},
{0x000c,0x0001},
{0x000d,0x0000},
{0x000f,0x0000},
{0x0010,0x0000},
{0x0011,0x0007},
{0x0012,0x0000},
{0x0013,0x0000},
{0x0010,0x1590},
{0x0011,0x0227},
{0x0012,0x009c},
{0x0013,0x1900},
{0x0029,0x0023},
{0x002b,0x000e},
{0x0020,0x0000},
{0x0021,0x013f},
{0x0030,0x0007},
{0x0031,0x0707},
{0x0032,0x0006},
{0x0035,0x0704},
{0x0036,0x1f04},
{0x0037,0x0004},
{0x0038,0x0000},
{0x0039,0x0706},
{0x003c,0x0701},
{0x003d,0x000f},
{0x0050,0x0000},
{0x0051,0x00ef},
{0x0052,0x0000},
{0x0053,0x013f},
{0x0060,0xa700},
{0x0061,0x0001},
{0x006a,0x0000},
{0x0080,0x0000},
{0x0081,0x0000},
{0x0082,0x0000},
{0x0083,0x0000},
{0x0084,0x0000},
{0x0085,0x0000},
{0x0090,0x0010},
{0x0092,0x0000},
{0x0093,0x0003},
{0x0095,0x0110},
{0x0097,0x0000},
{0x0098,0x0000},
{0x0007,0x0133},
{0x0020,0x0000},
{0x0021,0x013f},
{0x0007,0x0000},
};
const uint16_t cmd[8]= {0x00, 0x50, 0x51, 0x52,0x53, 0x20, 0x21, 0x22};
初始化的程序也是相当的简单,这里由于篇幅的原因不展示,大家可以下载我的源代码来参考。
主程序使用了蓝、红、绿两元色交替显示,效果如图所示:
下一步将移植图形库,便于我们显示。