本次使用原子stm32f103zet6+4.3寸mcu屏,学了原子的例程发现虽然是hal库开发但是并没有使用stm32cubemx开发而是纯库函数,我之前的工程都是基于cubemx所以我想进行适配,现在把移植过程罗列如下,有问题可以评论区问我,stm32f4和stm32f1虽然一个fmc一个fsmc但是要移植都是一样的,只是引脚不同
首先打开cubemx创建工程,这个我就不演示了网上大把教程,然后我们开始配置时钟,按照图中修改即可
然后是fsmc配置:
1、fsmc一共四个块,本次驱动lcd屏选择bank1,也只能选bank1,一共块中又分为4个区,一个区64M,这里只是相当于一个片选信号,理论上选哪个都没问题,但是开发板上为PG12刚好对应了FSMC_NE4所以选这个;
2、内存类型选择LCD接口
3、LCD Register Select这个为RS引脚,理论上也是0-25随便选一个,开发板上已经定死了为PG12刚好对应A10
4、数据格式为16位因为这块屏位RGB565格式,刚好16位
然后是fsmc的寄存器配置:
1、内存类型位LCD接口类型
2、Bank前面说了为第一个块
3、Write operation是写使能肯定要使能
4、Extended mode为拓展模式,也就是下面要配置的读写时间参数是不复用的,如果选择disable那他们就共用一套时间参数,为了适配不同的屏选择Enable
5、Address setup time in HCLK clock cycles:地址建立时间,地址信号稳定后,到读信号(OE)拉低的等待时间。必须大于外部芯片要求的地址建立时间t_AVV,否则地址没稳定就读取,会导致数据错误
6、Data setup time:数据建立时间,读信号拉低后,到读取数据的等待时间。必须大于外部芯片的读取访问时间t_ACC,否则芯片还没把数据放到总线上,单片机就读取了,数据会是错误的
7、Bus turn around time:总线周转时间,读操作结束后,到下一次写操作开始的等待时间,用来避免总线冲突。比如读和写之间,让总线电平有足够时间恢复稳定。这个参数不是很重要直接为0即可
8、Access mode:访问模式,控制地址 / 数据信号的同步方式,有 A/B/C/D 四种模式,对应不同的信号有效时机(比如地址和控制信号是同时有效,还是地址先有效),要和外部芯片的时序图匹配。目前是选择A模式
9、Address setup time in HCLK clock cycles:地址建立时间,写操作时,地址信号稳定后,到写信号(WE)拉低的等待时间。匹配芯片写操作的地址建立要求。
10、Data setup time:数据建立时间,写信号拉低后,数据信号需要保持稳定的时间。必须大于外部芯片的写脉冲宽度t_WP,否则数据还没被芯片锁存,写操作就结束了,会导致写失败。
11、Bus turn around time:总线周转时间,写操作结束后,到下一次读 / 写操作的总线恢复时间,避免总线电平冲突。
12、Access mode:访问模式,写操作的地址 / 数据同步模式,可与读模式不同,匹配芯片写操作的时序要求。
在前面的配置之后系统会自动配置好对应的引脚,如果跟着教程一步一步到这的引脚是可以和原子的开发板对应上的,最后还要配置一个最重要的LCD_BL背光引脚,其实不配置也许但是为了保证初始化都是在cubemx中进行所以在这里进行配置,将PB0配置为推挽输出默认低电平即可,高电平点亮
时钟配置如下
生成工程
然后我们把原子的代码进行复制,注意图中红框为我自定义的.h原来是没有的,实现如下直接新建后复制即可
#ifndef LCD_EX_H #define LCD_EX_H void lcd_ex_ili9341_reginit(void); void lcd_ex_ili9806_reginit(void); void lcd_ex_nt35310_reginit(void); void lcd_ex_nt35510_reginit(void); void lcd_ex_ssd1963_reginit(void); void lcd_ex_st7789_reginit(void); void lcd_ex_st7796_reginit(void); #endif我们新建文件夹BSP放在core同级目录,在BSP内新建LCD文件夹后把刚刚几个文件全部放入即可
然后把文件进行导入工程即可,很基础的操作了我就不赘述了
然后是设置新增的文件的路径,跟着图片一步一步点击即可
现在开始修改文件,lcd.c最上面部分改的跟我图中一样即可,主要是新增main.h,和#include "LCD/lcd_ex.c"改为#include "LCD/lcd_ex.h",其他不动
然后找到void lcd_init(void)函数,把fsmc部分代码进行注释,因为已经才cubemx进行注释,背光的也要注释了
lcd.h新增main.h头文件
然后ctrl+H找到delay_ms直接进行替换为HAL_Delay,因为可以直接使用hal库自带的延时函数
然后然后ctrl+f找到delay_us函数,我们对每一个us延时都手动替换为HAL_Delay(1);也可以自己使用定时器进行us延时函数实现
最后是main函数直接添加上lcd.h头文件
然后添加上lcd的初始化代码和显示函数后直接进行烧录即可
最后也是成功完成驱动了