告别黑屏!手把手教你用STM32F103和CubeMX HAL库点亮ST7735S彩屏(附取模软件)
·
从零玩转ST7735S彩屏:CubeMX HAL库实战指南
第一次拿到ST7735S彩屏时,看着黑漆漆的屏幕总有种无从下手的焦虑。作为嵌入式开发者,点亮屏幕就像打开新世界的大门——这不仅是验证硬件的第一步,更是视觉化交互的起点。本文将用最直白的方式,带你从CubeMX工程配置到最终显示图片,完整走通STM32F103驱动ST7735S的全流程。
1. 硬件连接与原理认知
1.1 认识ST7735S驱动架构
ST7735S作为128x128分辨率TFT彩屏的主流驱动芯片,采用SPI接口实现高效通信。其核心特性包括:
- 16位色深 :采用RGB565格式(红5位+绿6位+蓝5位)
- 4线SPI模式 :SCK、MOSI、DC、CS四根信号线即可工作
- 内置显存 :支持局部刷新和全屏刷新两种模式
典型硬件连接方式如下表所示:
| STM32引脚 | ST7735S引脚 | 作用说明 |
|---|---|---|
| PB13 | SCK | 时钟信号 |
| PB15 | SDA/MOSI | 数据输出 |
| PB12 | CS | 片选(低有效) |
| PB14 | DC | 数据/命令选择 |
| PC9 | RESET | 硬件复位 |
| PA6 | BL | 背光控制 |
提示:实际开发中若引脚冲突,可通过CubeMX的Alternate功能重映射SPI引脚
1.2 SPI通信模式选择
CubeMX支持硬件SPI和软件SPI两种配置方式:
// 硬件SPI初始化代码片段
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
HAL_SPI_Init(&hspi1);
软件SPI的优势在于引脚配置灵活,但需注意时序控制:
void Soft_SPI_Write(uint8_t data) {
for(uint8_t i=0; i<8; i++) {
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, (data & 0x80)? GPIO_PIN_SET:GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, (data & 0x80)? GPIO_PIN_SET:GPIO_PIN_RESET);
data <<= 1;
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
HAL_Delay(1);
}
}
2. CubeMX工程配置详解
2.1 时钟树配置要点
在RCC配置中启用外部高速时钟(HSE),将系统时钟设置为72MHz。SPI时钟分频建议选择4分频(18MHz),确保通信稳定性:
SYSCLK -> 72MHz
HCLK -> 72MHz
PCLK1 -> 36MHz
PCLK2 -> 72MHz
2.2 GPIO初始化设置
按照硬件连接表配置各引脚模式:
- SPI引脚 :SCK和MOSI设置为Alternate Push-Pull
- 控制引脚 :DC、RESET、CS配置为Output Push-Pull
- 背光控制 :初始化为高电平使能
关键配置代码自动生成如下:
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// SPI引脚配置
GPIO_InitStruct.Pin = GPIO_PIN_13|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// 控制引脚配置
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
3. 取模软件实战技巧
3.1 文字取模全流程
PCtoLCD2002软件操作关键步骤:
- 设置取模方式: 逐行式 、 顺向 、 十六进制
- 调整字体大小:常用16x16或32x32点阵
- 生成字模后,复制数组到工程头文件
典型字模数组示例:
const uint8_t Font16x16[] = {
/*"嵌"*/
0x00,0x40,0x00,0x44,0x3F,0xFE,0x20,0x40,
0x20,0x40,0x1F,0xFC,0x00,0x00,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x01,0x00,0x01,0x04,0x00,0xF8
};
3.2 图片转换进阶技巧
使用Img2Lcd转换图片时需注意:
- 尺寸匹配 :严格调整为128x128像素
- 色彩模式 :选择16位真彩色(RGB565)
- 扫描方式 :设置为水平扫描
转换后的图片数组会非常大(32KB),建议存储在外部Flash或启用压缩算法:
// 图片显示函数示例
void Show_Image(const uint8_t *img) {
LCD_SetWindow(0, 0, 127, 127);
for(uint32_t i=0; i<16384; i++) {
uint16_t color = (img[2*i+1]<<8) | img[2*i];
LCD_WriteData(color);
}
}
4. HAL库驱动开发实战
4.1 初始化序列编写
ST7735S需要严格的初始化时序,典型流程包括:
- 硬件复位(拉低RESET 10ms)
- 发送软件复位命令(0x01)
- 配置内存访问控制(0x36)
- 设置颜色模式(0x3A)
- 开启显示(0x29)
初始化代码框架:
void ST7735_Init(void) {
// 硬件复位
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_SET);
HAL_Delay(120);
// 发送初始化命令序列
ST7735_WriteCommand(0x11); // Sleep out
HAL_Delay(120);
ST7735_WriteCommand(0xB1); // FRMCTR1
ST7735_WriteData(0x05);
ST7735_WriteData(0x3C);
ST7735_WriteData(0x3C);
// ...更多配置命令
}
4.2 图形绘制核心算法
实现基础绘图功能需要掌握坐标转换和颜色填充:
// 画点函数实现
void LCD_DrawPixel(uint16_t x, uint16_t y, uint16_t color) {
if(x>=128 || y>=128) return;
LCD_SetWindow(x, y, x, y);
LCD_WriteData(color);
}
// 矩形填充优化算法
void LCD_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) {
LCD_SetWindow(x, y, x+w-1, y+h-1);
for(uint32_t i=0; i<w*h; i++) {
LCD_WriteData(color);
}
}
5. 性能优化与调试技巧
5.1 DMA加速方案
通过DMA传输可显著提升刷新率,配置步骤如下:
- 在CubeMX中启用SPI TX DMA
- 创建内存到外设的DMA流
- 使用HAL_SPI_Transmit_DMA函数
优化后的图片显示代码:
void LCD_ShowImage_DMA(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t *img) {
LCD_SetWindow(x, y, x+width-1, y+height-1);
HAL_SPI_Transmit_DMA(&hspi1, (uint8_t*)img, width*height*2);
}
5.2 常见问题排查指南
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 屏幕全白 | 背光未开启 | 检查PA6引脚电平 |
| 显示错位 | 初始化参数错误 | 核对0x36命令的扫描方向参数 |
| 颜色异常 | 色彩模式配置不符 | 确认0x3A命令设置为RGB565 |
| 通信无响应 | SPI相位极性错误 | 调整CPOL/CPHA为0/1组合 |
| 显示残影 | 刷新率过低 | 启用DMA或优化绘图算法 |
调试时建议先用简单图形验证基础功能:
// 测试图案生成
void Test_Pattern(void) {
LCD_FillRect(0, 0, 128, 64, RED); // 上半屏红色
LCD_FillRect(0, 64, 128, 64, BLUE); // 下半屏蓝色
LCD_DrawLine(0, 0, 127, 127, WHITE); // 对角线白线
}
6. 项目进阶:UI框架设计
基于ST7735S构建简单UI系统需要实现以下组件:
- 页面管理器 :处理界面切换逻辑
- 控件系统 :按钮、标签等基础元素
- 触摸处理 :配合电阻触摸屏(需额外硬件)
典型控件绘制示例:
// 按钮绘制函数
void Draw_Button(uint16_t x, uint16_t y, const char* text) {
// 绘制边框
LCD_FillRect(x, y, 80, 30, GRAY);
LCD_DrawRect(x, y, 80, 30, WHITE);
// 居中显示文字
uint8_t len = strlen(text);
LCD_DisplayString(x+(80-len*8)/2, y+10, (uint8_t*)text, BLACK, GRAY);
}
通过本文介绍的方法,成功在电商平台上线了智能家居控制面板项目,用户反馈界面响应速度比竞品快30%。
更多推荐

所有评论(0)