本项目是一个基于 STM32F103C8 微控制器的 TFT 液晶屏幕驱动库,使用 HAL 库、SPI 通信和 DMA 传输(可选)。
- 支持驱动芯片:
- ST7735 1.8寸屏幕,像素128*160
- ST7789V3 1.69寸屏幕,像素240*320
- 其他驱动文件请在TFT_init中添加
- 多屏幕支持:
- 支持多个TFT屏幕同时显示不同内容
- 每个屏幕拥有独立的参数配置和缓冲区
- 可以指定不同的SPI接口和GPIO引脚
- 支持多种屏幕布局和显示模式
- 底层接口:
- SPI 通信,支持 DMA 传输以提高效率。
- 可配置的绘图缓冲区 (
TFT_BUFFER_SIZEinTFT_config.h)。 - GPIO 控制 (RES, DC, CS, BLK)。
- 支持RGB颜色转换功能 (
TFT_RGB可将RGB888格式转换为RGB565)。
- CAD绘图:
- 填充区域 (
TFT_Fill_Area) - 支持 DMA - 绘制点 (
TFT_Draw_Point) - 绘制多点 (
TFT_Draw_MultiPoint) - 绘制直线、水平线、垂直线 (
TFT_Draw_Line,TFT_Draw_Fast_HLine,TFT_Draw_Fast_VLine) - 绘制矩形 (
TFT_Draw_Rectangle) - 填充矩形 (
TFT_Fill_Rectangle) - 支持 DMA - 绘制圆 (
TFT_Draw_Circle) - 填充圆 (
TFT_Fill_Circle) - 绘制三角形 (
TFT_Draw_Triangle) - 填充三角形 (
TFT_Fill_Triangle) - 绘制圆角矩形 (
TFT_Draw_Rounded_Rectangle) - 填充圆角矩形 (
TFT_Fill_Rounded_Rectangle) - 绘制椭圆 (
TFT_Draw_Ellipse) - 填充椭圆 (
TFT_Fill_Ellipse) - 绘制二阶贝塞尔曲线 (
TFT_Draw_Bezier2) - 绘制多边形 (
TFT_Draw_Polygon) - 填充多边形 (
TFT_Fill_Polygon) - 绘制圆弧 (
TFT_Draw_Arc) - 绘制四分之一圆弧 (
TFT_Draw_Quarter_Circle) - 填充四分之一圆弧 (
TFT_Fill_Quarter_Circle)
- 填充区域 (
- 文本显示:
- 显示 ASCII 字符 (
TFT_Show_Char) - 显示 ASCII 字符串 (
TFT_Show_String) - 支持多种字号 (如 8x16, 16x32,具体见
font.h) - 支持背景透明/不透明模式
- (注意: 中文字符显示功能可能需要额外字体支持和函数实现,当前版本主要关注 ASCII)
- 显示 ASCII 字符 (
- 图片显示:
- (需要相应函数实现,如
TFT_Show_Picture,当前版本未包含)
- (需要相应函数实现,如
- MCU: STM32F103C8Tx (或其他兼容 HAL 库的 STM32 型号)
- 屏幕: 1.8寸 TFT 液晶屏 (或其他尺寸,只要驱动是 ST7735S/R)
- 接口: SPI (本项目默认使用 SPI1)
- 引脚连接: (请根据
Core/Inc/TFTh/TFT_config.h和 CubeMX 配置确认)- SPI SCK, MOSI
- TFT_RES (复位)
- TFT_DC (数据/命令)
- TFT_CS (片选)
- TFT_BLK (背光控制)
- 开发环境: STM32CubeIDE 或 STM32CubeMX 或 VScode直接打开
- 库: STM32 HAL 库
- 字体: 包含 ASCII 字模数据 (
Core/Src/TFTc/font.c,Core/Inc/TFTh/font.h)
- 需要移植的代码是TFTh和TFTc两个文件夹及内容
- 如果你使用的是STM32CubeIDE,把TFTh文件夹放到Inc里,把TFTc文件夹放到Src里,结构如下
Core/
├── Inc/
│ ├── TFTh/ # TFT 驱动头文件
│ │ ├── font.h
│ │ ├── TFT_CAD.h # 绘图和显示函数声明
│ │ ├── TFT_config.h # 配置 (引脚, 方向, 缓冲区, 颜色)
│ │ ├── TFT_init.h # 初始化函数声明
│ │ └── TFT_io.h # 底层 IO 函数声明 (SPI, GPIO)
│ ├── main.h
│ ├── gpio.h
│ ├── spi.h
│ ├── dma.h
│ └── ... # 其他 HAL 配置头文件
└── Src/
├── TFTc/ # TFT 驱动源文件
│ ├── font.c
│ ├── TFT_CAD.c # 绘图和显示函数实现
│ ├── TFT_init.c # 初始化函数实现
│ └── TFT_io.c # 底层 IO 函数实现
├── main.c # 主程序
├── gpio.c
├── spi.c
├── dma.c
└── ... # 其他 HAL 驱动和系统文件
Drivers/ # HAL 库和 CMSIS 文件
... # 其他项目文件 (构建输出, 配置等)
- SPI 配置:
- 启用你选择的 SPI 外设 (例如 SPI1)。
- 模式: 设置为
Full-Duplex Master。 - 硬件 NSS 信号: 设置为
Disable(我们将使用软件控制 CS 引脚)。 - 数据大小: 设置为
8 Bits。 - First Bit: 设置为
MSB First。 - 时钟极性 (CPOL): 设置为
Low。 - 时钟相位 (CPHA): 设置为
1 Edge(或根据你的屏幕数据手册调整,通常是Low和1 Edge或Low和2 Edge)。 - 波特率: 根据你的系统时钟和屏幕规格设置一个合适的值 (例如 18 MHz 或 36 MHz)。
- DMA 设置 (可选但推荐):
- 在
DMA Settings选项卡中,为 SPI 的TX添加一个 DMA 请求。 - 选择一个 DMA 通道。
- 模式: 设置为
Normal。 - 方向: 设置为
Memory to Peripheral。 - 优先级: 设置为
Medium或High。 - 数据宽度:
Increment Address应勾选Memory,不勾选Peripheral。数据宽度设置为Byte。
- 在
- GPIO 配置:
- SPI 引脚: CubeMX 会自动配置 SCK 和 MOSI 引脚为
Alternate Function Push Pull。 - 控制引脚:
- 配置
TFT_RES,TFT_DC,TFT_CS,TFT_BLK对应的 GPIO 引脚为GPIO_Output模式。 - 设置输出电平为
High(CS 和 BLK 通常初始为高电平)。 - 设置输出速度为
High或Very High。 - 用户标签: 强烈建议为这些引脚添加用户标签 (User Label),例如
TFT_RES,TFT_DC,TFT_CS,TFT_BLK。这将生成相应的宏定义在main.h中,方便代码引用。
- 配置
- SPI 引脚: CubeMX 会自动配置 SCK 和 MOSI 引脚为
- 时钟配置: 确保 SPI 外设的时钟已启用,并且系统时钟配置正确。
- 生成代码: 生成 CubeMX 项目代码。
打开 TFT_config.h 文件进行以下配置:
#define STM32HAL: 确保此行已定义,表示使用 STM32 HAL 库。TFT_BUFFER_SIZE: 定义绘图缓冲区的大小(字节)。推荐使用 1024 到 4096 之间的值,以优化 DMA 传输性能。例如4096。DISPLAY_DIRECTION: 非常重要。根据你的屏幕型号(ST7735S 红板或 ST7735R 黑板)和期望的显示方向(0°, 90°, 180°, 270°)选择合适的值。注释中有详细说明不同值的含义和对应的屏幕类型/颜色顺序 (BGR/RGB)。- 例如,对于 ST7735R 黑板,竖屏(0度)可能使用
4,横屏(90度)可能需要添加新的定义或调整现有定义。对于 ST7735S 红板,竖屏(0度)使用0。
- 例如,对于 ST7735R 黑板,竖屏(0度)可能使用
TFT_X_OFFSET,TFT_Y_OFFSET: 如果你的屏幕显示内容有偏移,调整这些值(像素单位)来校正。默认值通常适用于某些常见模块,但可能需要根据实际情况修改。- 颜色定义: 文件末尾预定义了一些常用颜色 (RGB565 格式),你可以根据需要添加更多颜色。
打开 TFT_io.h 文件,检查或修改以下宏定义,确保它们与你在 CubeMX 中设置的 GPIO 用户标签或引脚定义一致:
TFT_RES_GPIO_Port,TFT_RES_PinTFT_DC_GPIO_Port,TFT_DC_PinTFT_CS_GPIO_Port,TFT_CS_PinTFT_BLK_GPIO_Port,TFT_BLK_Pin
如果 CubeMX 生成的宏名称不同(例如,如果你没有使用用户标签),你需要将这里的宏定义修改为 CubeMX 生成的实际名称 (通常在 main.h 中可以找到)。
- 包含头文件:
#include "TFTh/TFT_init.h" // 包含初始化函数 #include "TFTh/TFT_CAD.h" // 包含绘图函数 #include "TFTh/TFT_text.h" // 包含文本显示函数
- 初始化: 在
main函数的/* USER CODE BEGIN 2 */部分,调用 TFT 初始化函数,并传入配置好的 SPI 句柄指针:// 假设你的 SPI 句柄是 hspi1 extern SPI_HandleTypeDef hspi1; TFT_Init_ST7735(&hspi1); // 初始化 ST7735 驱动
- 调用绘图/显示函数: 在需要的地方调用
TFT_CAD.h和TFT_text.h中声明的函数来操作屏幕。// 清屏为白色 TFT_Fill_Area(0, 0, TFT_WIDTH, TFT_HEIGHT, WHITE); // 在 (10, 10) 处显示红色 "Hello" (字体大小16, 不透明背景) TFT_Show_String(10, 10, (uint8_t*)"Hello", RED, WHITE, 16, 0); // 绘制一个蓝色圆心在 (64, 64),半径为 20 的圆 TFT_Draw_Circle(64, 64, 20, BLUE); // 使用 DMA 填充一个黄色矩形 TFT_Fill_Rectangle(20, 80, 100, 120, YELLOW);
-
声明多个TFT屏幕句柄:
TFT_HandleTypeDef htft1; // 第一个TFT屏幕 TFT_HandleTypeDef htft2; // 第二个TFT屏幕
-
初始化多个TFT屏幕:
// 初始化第一个TFT屏幕 TFT_Init_Instance(&htft1, &hspi1, TFT1_CS_GPIO_Port, TFT1_CS_Pin); TFT_Config_Pins(&htft1, TFT1_DC_GPIO_Port, TFT1_DC_Pin, TFT1_RES_GPIO_Port, TFT1_RES_Pin, TFT1_BL_GPIO_Port, TFT1_BL_Pin); TFT_Config_Display(&htft1, 2, 2, 1); // 设置方向、X/Y偏移 TFT_IO_Init(&htft1); // 初始化IO层 TFT_Init_ST7735S(&htft1); // ST7735S屏幕初始化 // 初始化第二个TFT屏幕 TFT_Init_Instance(&htft2, &hspi2, TFT2_CS_GPIO_Port, TFT2_CS_Pin); TFT_Config_Pins(&htft2, TFT2_DC_GPIO_Port, TFT2_DC_Pin, TFT2_RES_GPIO_Port, TFT2_RES_Pin, TFT2_BL_GPIO_Port, TFT2_BL_Pin); TFT_Config_Display(&htft2, 2, 2, 1); // 设置方向、X/Y偏移 TFT_IO_Init(&htft2); // 初始化IO层 TFT_Init_ST7735S(&htft2); // ST7735S屏幕初始化
-
操作多个屏幕:
// 操作第一个屏幕 TFT_Fill_Screen(&htft1, BLACK); TFT_Show_String(&htft1, 10, 10, (uint8_t *)"Screen 1", WHITE, BLACK, 16, 0); // 同时操作第二个屏幕 TFT_Fill_Screen(&htft2, BLUE); TFT_Show_String(&htft2, 10, 10, (uint8_t *)"Screen 2", WHITE, BLUE, 16, 0);
- 坐标系统: 所有坐标均从左上角 (0, 0) 开始。
- 颜色格式: 颜色使用 RGB565 格式 (16位)。
- DMA: 使用 DMA 可以显著提高大面积填充(如
TFT_Fill_Area,TFT_Fill_Rectangle)的效率。确保 CubeMX 中正确配置了 SPI TX DMA。 - 缓冲区:
TFT_BUFFER_SIZE影响 DMA 传输效率和内存占用。如果内存紧张,可以适当减小此值,但可能会降低 DMA 性能。 - 阻塞与非阻塞: 当前的 SPI 传输函数 (
TFT_Write_Data,TFT_Write_Cmd,TFT_Buffer_Write16) 可能是阻塞的(等待传输完成)。如果需要非阻塞操作,需要修改TFT_io.c中的 SPI/DMA 调用方式并处理完成中断。 - 多屏共享SPI: 如果多个屏幕共用一个SPI接口,需要确保操作不会产生冲突,驱动库会自动管理CS信号以确保正确的屏幕选择。
- 2025/4/21:
- 重构TFT驱动库,支持多屏同时显示功能
- 添加基于实例的TFT_HandleTypeDef结构体,每个屏幕可独立配置参数
- 实现设备注册和DMA中断智能处理机制
- 更新所有绘图函数支持多实例操作
- 优化内存管理,支持动态调整每个屏幕的缓冲区大小
- 2025/4/20:
- 更新 README,详细说明功能、使用方法、CubeMX 配置和
TFT_config.h设置。 - 完善硬件抽象层
- 添加高级CAD绘图功能,包括椭圆、贝塞尔曲线、多边形、圆弧等。
- 更新测试程序,验证新增功能。一个帧率测试程序和一个画图测试程序已经添加到Example文件夹中
- 更新 README,详细说明功能、使用方法、CubeMX 配置和
- 2025/4/19:
- 改进代码可读性:使用更清晰的变量名并添加中文注释 (TFT_CAD.c, TFT_io.c, TFT_CAD.h, TFT_io.h)。
- 增加 SPI 缓冲区 (
TFT_BUFFER_SIZE) 和 DMA 支持,大幅提升填充效率。 - 完善绘图算法,部分绘图函数应用 DMA。
- 2025/4/18:
- 开始重新整理工程。
- 优化注释风格。
- 将
u8/u16/u32类型替换为标准的uint8_t/uint16_t/uint32_t。 - 将函数名前缀从
LCD_修改为TFT_。 - 更新 README 文件。