今天尝试修改LCD厂商自带的LCD标准库程序到HAL库中使用。
什么是FSMC
stm32的FSMC是其内部的一种接口,它可以映射外部的同步、异步存储器,存储卡,LCD模块等。它通过片选信号和外设进行通讯,所以同一时间只能和一种外设通讯。它拥有4个区(4*64MB),称为bank1-4,每个区内部又分成4个子区,每个区映射的外部器件不同,
使用FSMC和LCD进行连接的项目演练
首先得选择区域,外设选择LCD Interface,然后查看LCD的管脚图,找到它的片选引脚,填入LCD Register Select中,数据位设置为16bit,,设置允许读写,其他设置正常设置即可,这样就完成了初始化,生成代码。
具体配置如图所示:
图 1 LCD具体模式配置
注意:红色标注处为自己开发板设置的,可以查看自己开发板的原理图查看这一位。
图 2 FSMC参数设置
生成的代码并不能运行,需要将LCD厂提供的LCD驱动程序加入我们的代码中,主要是lcd.c,lcd.h和font.h,前两个主要是LCD的驱动程序,最后一个是字模代码,其中包括几种不同字号的ASCⅡ码。将厂商提供的文件复制到我们这个文件目录下,然后在keil中将这个文件中的lcd.c添加到函数中,将头文件声明。
大多数厂商提供的驱动程序是标准库的,我们需要对其进行改写,主要是一些定义的书写格式,更改就好,然后注释掉头文件中的SysYick.h和usart.h(这两个一个是延时函数,一个是串口输出函数),最后将延时函数改成HAL_Delay(),串口输出函数(printf)直接注释,这部分串口输出主要是用来测试LCD屏幕的,这部分对我们的LCD使用不影响,所以可以直接注释掉。然后LCD代码书写时大量应用了u8,u16等简写代码,这里可以将其一个一个改为正规的uint8_t等,或者可以在lcd.h文件中声明,减少我们的修改量:
#define u16 uint16_t
#define u8 uint8_t
#define u32 uint32_t
#define vu16 __IO uint16_t
#define vu8 __IO uint8_t
#define vu32 __IO uint32_t
再将LCD初始化中的和GPIO、FSMC有关的部分注释掉。这样就完成了整个代码的初始化。
在main.h中添加lcd.h,在lcd.h中也添加main.h。
然后再在主函数中调用LCD初始化函数:LCD_Init(),将代码烧录进开发板中,观察到背光亮起即可。然后可以简单使用厂商提供的函数在屏幕上书写字符串,数字等。或者自己根据这些函数写一些新的函数。