这里先简单介绍一下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}; 初始化的程序也是相当的简单,这里由于篇幅的原因不展示,大家可以下载我的源代码来参考。 主程序使用了蓝、红、绿两元色交替显示,效果如图所示: |