目录
【声明&致谢】
本TFT驱动库来源/改进自Gitee开源项目:https://gitee.com/greatxiaochuang/stm32_-hal_-lcd_-st7735_-dirver.git
特此向原项目作者表示感谢。
鉴于诸多科创项目的开发过程都面临彩色显示的需求,并考虑到当前CubeMX及HAL库的成熟开发生态,本作者对原项目进行了针对性的完善和修改,主要内容包括:
- 代码注释更完善,明确指出源代码中可根据开发实际情况修改的部分;
- 去除与低版本Keil不兼容的部分字库,并对图片库的格式作了修改完善;
- 考虑了部分彩屏为BGR565而非RGB565的情况;
- 配套开发了基于MATLAB的图片取模和汉字取模软件;
本文将系统梳理和总结基于CubeMX+Keil的全套开发流程和库文件使用方法。
完整库文件及取模软件请通过以下链接获取:
一、使用TFT/LCD屏幕时的stm32硬件配置
对于使用st7735芯片驱动的彩色屏幕,通常采用SPI方式与主机进行通讯,同时一般会引出8根引脚,分别为:电源线(VCC/VDD)、地线(GND)、时钟线(SCL)、通信线(SDA/MOSI)、复位线(RES/RST)、片选线(CS)、数据指令线(DC)、背光控制线(BKL)。以上8根线中,只有SCL、SDA/MOSI需配置为SPI端口,其余4根(RES/RST、CS、DC、BKL)均配置为GPIO输出口,电源线(VCC/VDD)与地线(GND)分别与电源(一般是3.3V,也有可能需要5V,参见具体型号的数据手册)和地相连。
本项目提供的源码默认采用以下引脚配置(启用SPI1和GPIOA、GPIOB):
| 屏幕引脚 | STM32接口 |
| SCL | PA5 |
| SDA/MOSI | PA7 |
| CS | PA4 |
| RES | PB0 |
| DC | PB1 |
| BLK | PB10 |
以上配置借助CubeMX可以很方便地完成,此处不再赘述。在使用CubeMX配置时,各引脚推荐遵循以下参数:
- SPI (PA5, PA7)
| SPI模式 | Mater (Half-Duplex Master) |
| Hardware NSS | Disable (Software) |
| Data Size | 8 bit |
| First Bit | MSB First |
| Prescaler | 8 |
| CPOL | Low |
| CPHA | 1 Edge |
| CRC Calculation | Disabled |
【特别注意】若DMA资源充足,建议开启SPI的DMA模式!如果不开启DMA,一定要在源代码中更改相应的#define宏定义(参见后续章节)。
- GPIO输出 (PA4, PB0, PB1, PB10)
| GPIO模式 | Output Push-Pull |
| Pull 模式 | No pull-up/down |
| Level | Low |
| Speed | High |
由于不同项目的硬件资源分配不同,屏幕的连线方式实际上可以视场景需求而定,只需按后续章节所述的流程更改相应的#define宏定义即可。
二、库文件导入方法
下载压缩包并解压后,打开“LCD_st7735_Driver”文件夹,可以看到其中包含“Inc”和“Src”两个文件夹,分别存有.h头文件和.c源文件。
打开由CubeMX导出的开发工程,找到并打开其中的“Core”文件夹,可以看到其中也有“Inc”和“Src”文件夹。将之前“LCD_st7735_Driver”文件夹下Inc中的.h文件复制到这里的Inc中,Src中的.c文件复制到这里的Src中。
回到第一级文件夹,打开“MDK-ARM”文件夹继续打开Keil工程文件。进入工程后,在界面左侧“Application/User/Core”文件夹处右键选择“Add Existing Files to...”,找到刚才的Src文件夹(在由CubeMX导出的Core文件夹内,不是本项目下载和解压的文件夹),将粘贴好的五个.c文件一并导入(按住Ctrl逐个选中后点击“Add”)。
之后可以看到这5个.c文件都出现在了左侧。此时,分别选中这5个新文件,右键并点击“Options for Group...”,再选择“C/C++”选项,在“IncludePath”文本框里粘贴上:
..\Core\Inc
或手动点击选择相应的路径(点击3个点-New(Insert)-3个点-选择Core文件夹内的Inc文件夹)。最后点击OK。注意要为每一个新导入的.c文件都进行该操作。
至此就完成了库文件的导入操作。
【特别注意】某些版本的Keil,在用户修改CubeMX配置文件(即.ioc文件)后,“”路径会从IncludePath框内移动至MiscControl框内,此时手动进行剪切-粘贴即可。
三、库文件使用方法和可修改部分
使用库函数时,主要需要注意以下几个要点:
- 务必引入以下两个头文件(在/* USER CODE BEGIN Includes */注释对中)
/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ #include "lcd_init.h" #include "lcd.h" /* USER CODE END Includes */ -
务必进行初始化(紧跟系统初始化函数之后,在 /* USER CODE BEGIN 2 */注释对中)
/* USER CODE BEGIN 2 */ LCD_Init(); /* USER CODE END 2 */ -
可在lcd.c文件中查看各函数的注释,以获取其具体使用方法。
-
如需使用延迟函数,不建议使用HAL_delay(),请使用pbdata.h中的delay(), delay_ms(), delay_us()函数。
对于本驱动库,可修改的文件只有:lcd_init.h、image.h、image.c三个,请勿随意更改其他文件中的内容。其中image.h、image.c主要用于导入图片和汉字(在下一章节详细说明)。在硬件环境有改动时,更改的是lcd_init.h:(参考注释进行修改即可)
/******************可修改部分--Begin******************/
/***设置横屏或者竖屏显示***/
//0或1为竖屏
//2或3为横屏
#define USE_HORIZONTAL 3
/*************硬件模式选择*************/
//如果使用硬件SPI则选择0,使用软件SPI则选择1
//硬件支持SPI DMA传输则选择1,不支持则选择0
//如果使用软件SPI,则SCL和SDA引脚应配置为GPIO口
#define SPI_HARDWARE_SOFTWARE 0 //0:hardware SPI 1:software SPI
/*************硬件是否支持DMA*************/
#define HARDWARE_SPI_DMA 1 //0:Unable 1:Enable
/*************颜色格式*************/
//部分TFT屏幕为BGR565格式,则应选择1
//若为RGB565格式,则应选择0
#define BGR565 1 //RGB565:0
/***********依据屏幕尺寸更改***********/
#if USE_HORIZONTAL==0 || USE_HORIZONTAL==1
#define LCD_W 128
#define LCD_H 160
#else
#define LCD_H 128
#define LCD_W 160
#endif
/***********依据引脚配置更改***********/
//--------配置为GPIO--------
#define LCD_BLK_Pin GPIO_PIN_10
#define LCD_BLK_GPIO_Port GPIOB
#define LCD_CS_Pin GPIO_PIN_4
#define LCD_CS_GPIO_Port GPIOA
#define LCD_DC_Pin GPIO_PIN_1
#define LCD_DC_GPIO_Port GPIOB
#define LCD_RES_Pin GPIO_PIN_0
#define LCD_RES_GPIO_Port GPIOB
//--------配置为SPI(Half-Duplex Master)--------
// 前提是硬件支持SPI,否则也配置为GPIO
#define LCD_SDA_Pin GPIO_PIN_7
#define LCD_SDA_GPIO_Port GPIOA
#define LCD_SCL_Pin GPIO_PIN_5
#define LCD_SCL_GPIO_Port GPIOA
/******************可修改部分--End******************/
四、取模软件的使用及图片/文字的导入
在原开源库中,汉字的显示采用数组字库的方式进行存储。但经过测试发现,对于Keil(特别是低版本)而言该方式稳定性较差,十分容易受编译环境等因素的影响而造成编译失败。因此,在找到合适的解决办法之前,不妨将图片和文字视作同一类对象,配合相应的取模软件,使用同样的函数(即LCD_ShowPicture())进行显示。
首先安装(在MATLAB中)并打开取模软件(基于MATLAB环境开发,如果先前没有安装MATLAB可能需要额外占用一定空间),在“图片取模”中点击“浏览”导入需要显示的图片,并按自己的需要来进行各参数的设置,之后点击“转换并预览”查看结果。
可设置的项分别为:
| 图片名称 | 该图片在编程使用时的变量名 |
| 数据类型 | 图片以什么样的数据类型存储,可选u8, uint8_t, char (本质上都是8bit数据,用以适配不同的库) |
| 颜色格式 | 根据所用硬件选择RGB或BGR |
| 宽度 | 转换后的图片宽度,以像素为单位(不能超过屏幕支持的最大值) |
| 高度 | 转换后的图片高度,以像素为单位(不能超过屏幕支持的最大值) |
| 处理算法 | 对图片进行压缩处理的方式 |
确认无误后,点击“保存代码”,可以将生成的图片代码保存为.c文件,再用任意的IDE(如VS Code甚至记事本)打开后全部复制到image.c文件中,同时在image.h中加入extern声明即可,例如:
extern u8 image_x[160 * 128 * 2];
(image.c程序中带有的aTestPic是示例,可以直接删除。)
这样,就可以调用LCD_ImageShow()函数在屏幕上显示图片了。
显示文字的方法其实和图片一样,只需提前做好所需文字的图片。将文字转换为像素图片并生成代码的过程同样可以借助配套的取模完成。将转换出的代码保存并复制到image.c文件中,同样在image.h中加入extern声明即可。
以上就是本驱动库的简要说明,如有不清楚的地方欢迎评论区留言讨论!
- 敬请期待 -
鉴于STM32F1系列存储空间十分有限,想要存储多张图片或大量字库信息是难以实现的。因此,更合适且简便的方法是外加存储模块,如FLASH。为此,计划后续还将采用同样的CubeMX+HAL库开发环境,推出针对W25Qxx系列存储器的驱动库。该库与本文内容一脉相承、彼此兼容。敬请期待!
4480

被折叠的 条评论
为什么被折叠?



