news 2026/5/20 9:36:12

手把手教你用STM32CubeMX配置STM32F103的SPI驱动ST7735S屏幕

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手把手教你用STM32CubeMX配置STM32F103的SPI驱动ST7735S屏幕

STM32CubeMX实战:HAL库驱动ST7735S液晶屏全指南

在嵌入式开发领域,图形化界面正逐渐成为提升开发效率的关键工具。对于STM32开发者而言,ST7735S这款1.44寸TFT液晶屏因其性价比高、接口简单而广受欢迎,而STM32CubeMX则提供了从硬件配置到代码生成的一站式解决方案。本文将彻底改变你配置SPI外设的方式——告别繁琐的寄存器操作,拥抱图形化配置新时代。

1. 环境搭建与工程创建

在开始之前,我们需要准备以下硬件和软件环境:

硬件准备清单:

  • STM32F103C8T6最小系统板(或同系列开发板)
  • ST7735S 1.44寸TFT液晶屏模块
  • 杜邦线若干(建议使用优质线材减少干扰)
  • 3.3V稳压电源(确保供电稳定)

软件工具链:

  • STM32CubeMX 6.5.0或更高版本
  • Keil MDK-ARM 5.30+(或IAR Embedded Workbench)
  • STM32CubeF1 HAL库(通过CubeMX自动集成)

提示:建议使用最新版CubeMX,它包含了对HAL库的持续优化和bug修复。安装时勾选STM32F1系列支持包。

创建新工程的步骤往往决定了后续开发的顺畅程度。打开CubeMX后,选择"File > New Project",在芯片选择器中输入"STM32F103C8"并选中对应型号。在工程配置界面,建议立即设置以下关键参数:

/* 工程基本配置示例 */ Project Name: ST7735S_Demo Toolchain/IDE: MDK-ARM V5 Project Location: 选择你的工作目录 Application Structure: Advanced

2. SPI外设图形化配置

SPI接口是驱动ST7735S的核心,CubeMX的可视化配置大大简化了这一过程。在"Pinout & Configuration"标签页中,找到SPI1(或SPI2,根据硬件连接)并启用为"Full-Duplex Master"模式。

关键参数配置表格:

参数项推荐值说明
Prescaler8分频产生4.5MHz时钟(系统72MHz时)
Clock PolarityLow与ST7735S规格书一致
Clock Phase1 Edge数据在第一个边沿采样
Data Size8 bits标准8位传输
First BitMSB高位优先传输
NSS Signal TypeSoftware软件控制片选
CRC CalculationDisable不启用CRC校验

在"GPIO Settings"子标签中,CubeMX会自动分配SCK、MISO、MOSI引脚。我们需要额外配置三个关键GPIO:

  1. 复位引脚(RESET):输出模式,初始状态高电平
  2. 数据/命令选择(DC/RS):输出模式
  3. 背光控制(BLK):输出模式,初始状态高电平
// 典型引脚配置代码(自动生成) GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); /* SPI1 SCK Pin */ GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* DC Pin */ GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET);

3. HAL库与LCD驱动的无缝对接

CubeMX生成的代码虽然完整,但需要与LCD驱动函数有机结合。我们创建st7735.c/h文件来实现显示功能,同时保留CubeMX生成的SPI初始化代码。

驱动层关键函数实现:

// ST7735S命令发送函数 void ST7735_WriteCommand(uint8_t cmd) { HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_RESET); // 命令模式 HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // 片选使能 HAL_SPI_Transmit(&hspi1, &cmd, 1, HAL_MAX_DELAY); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // 片选禁用 } // ST7735S数据发送函数(优化版) void ST7735_WriteData(uint8_t* data, uint16_t length) { HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET); // 数据模式 HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, data, length, HAL_MAX_DELAY); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); }

显示初始化序列需要严格按照ST7735S规格书的时序要求。以下是一个经过验证的初始化流程:

  1. 硬件复位(拉低RESET引脚至少10ms)
  2. 发送退出睡眠模式命令(0x11)
  3. 延时120ms等待稳定
  4. 配置帧率控制(0xB1, 0xB2, 0xB3)
  5. 设置显示方向(0x36)
  6. 启用颜色格式(0x3A)
  7. 发送伽马校正参数
  8. 开启显示(0x29)
// 初始化序列示例 void ST7735_Init(void) { // 硬件复位 HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(RST_GPIO_Port, RST_Pin, GPIO_PIN_SET); HAL_Delay(120); // 软件初始化序列 ST7735_WriteCommand(0x11); // Sleep out HAL_Delay(120); ST7735_WriteCommand(0xB1); // FRMCTR1 uint8_t init_data1[] = {0x01, 0x2C, 0x2D}; ST7735_WriteData(init_data1, sizeof(init_data1)); // ...更多初始化命令 ST7735_WriteCommand(0x29); // Display on }

4. 高级功能实现与性能优化

基础显示功能实现后,我们可以进一步优化性能并添加实用功能。

4.1 DMA加速图像刷新

直接使用HAL_SPI_Transmit进行大数据量传输会阻塞CPU。启用DMA后,SPI传输与CPU运算可以并行进行:

// 在CubeMX中启用SPI TX DMA通道 // 修改WriteData函数支持DMA void ST7735_WriteData_DMA(uint8_t* data, uint16_t length) { HAL_GPIO_WritePin(DC_GPIO_Port, DC_Pin, GPIO_PIN_SET); HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); HAL_SPI_Transmit_DMA(&hspi1, data, length); // 注意:需要实现SPI传输完成回调函数 }

DMA配置要点:

  • 在CubeMX的"DMA Settings"标签添加SPI_TX通道
  • 模式选择"Normal"(非循环模式)
  • 优先级设为"High"
  • 内存地址递增,外设地址不变
  • 数据宽度均为Byte

4.2 双缓冲机制实现

对于动画显示,可以创建两个帧缓冲区,一个用于显示,一个用于绘制:

#define BUF_SIZE (128 * 160 * 2) // 16位色深 uint8_t frame_buffer[2][BUF_SIZE]; uint8_t current_buf = 0; void ST7735_SwapBuffer(void) { ST7735_SetAddressWindow(0, 0, 127, 159); ST7735_WriteData_DMA(frame_buffer[current_buf], BUF_SIZE); current_buf ^= 1; // 切换缓冲区 }

4.3 字体显示优化

使用位图字体时,预先处理字体数据可以大幅提升渲染速度:

typedef struct { uint8_t width; uint8_t height; const uint16_t *data; } FontDef; // 预存字模数据 static const uint16_t font_8x16_data[] = { // 每个字模的16位色值数组 }; void ST7735_DrawChar(uint16_t x, uint16_t y, char ch, FontDef font, uint16_t color) { uint32_t offset = (ch - ' ') * font.height * font.width; for (uint8_t i = 0; i < font.height; i++) { for (uint8_t j = 0; j < font.width; j++) { if (font.data[offset + i * font.width + j] != 0x0000) { ST7735_DrawPixel(x + j, y + i, color); } } } }

5. 调试技巧与常见问题解决

即使按照规范配置,实际开发中仍可能遇到各种问题。以下是几个典型问题的解决方案:

问题1:屏幕白屏或无显示

  • 检查背光控制引脚是否使能
  • 测量RESET引脚时序是否符合规格书要求
  • 用逻辑分析仪抓取SPI信号,确认时钟极性和相位设置正确

问题2:显示颜色异常

  • 确认颜色格式设置(0x3A命令)
  • 检查像素数据是否按照RGB565格式打包
  • 验证伽马校正参数是否合适

问题3:刷新率低

  • 提高SPI时钟频率(最高不要超过ST7735S的15MHz限制)
  • 启用DMA传输减少CPU开销
  • 优化区域更新机制,只刷新变化部分
// 性能测试代码片段 uint32_t start_time = HAL_GetTick(); ST7735_FillScreen(ST7735_RED); uint32_t end_time = HAL_GetTick(); printf("Fill screen time: %lu ms\n", end_time - start_time);

通过STM32CubeMX配置HAL库驱动ST7735S,我们不仅实现了传统寄存器操作的所有功能,还获得了更清晰的代码结构和更高的开发效率。实际项目中,将CubeMX生成的初始化代码与精心优化的显示驱动相结合,既能快速搭建原型,又能满足最终产品的性能要求。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/20 9:35:09

零基础入门Pulover‘s Macro Creator:免费电脑自动化工具终极指南

零基础入门Pulovers Macro Creator&#xff1a;免费电脑自动化工具终极指南 【免费下载链接】PuloversMacroCreator Automation Utility - Recorder & Script Generator 项目地址: https://gitcode.com/gh_mirrors/pu/PuloversMacroCreator 你是否曾经厌倦了每天重复…

作者头像 李华
网站建设 2026/5/20 9:33:52

观察Taotoken在不同网络环境下API调用的延迟表现差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken在不同网络环境下API调用的延迟表现差异 在开发基于大模型的应用时&#xff0c;API调用的响应延迟是影响开发者体验和…

作者头像 李华
网站建设 2026/5/20 9:30:43

在类内定义一个普通函数,并作为排序的规则

std::bind当我们更想要在类内定义一个普通函数&#xff0c;并作为排序的规则时应该怎么办&#xff1f;我们尝试写出如下代码&#xff0c;并成功获得一大堆编译错误。#include <algorithm> #include <climits> #include <vector>class Cmp { public:bool cmp(…

作者头像 李华
网站建设 2026/5/20 9:29:58

量子近似优化算法在车辆路径问题中的应用与实践

1. 量子近似优化算法&#xff08;QAOA&#xff09;与车辆路径问题的结合量子近似优化算法&#xff08;Quantum Approximate Optimization Algorithm, QAOA&#xff09;是一种专为组合优化问题设计的混合量子-经典算法。它通过交替应用问题哈密顿量和混合哈密顿量&#xff0c;在…

作者头像 李华
网站建设 2026/5/20 9:28:06

别再让WSL2的VHDX文件占满C盘!手把手教你用Diskpart无损收缩虚拟磁盘

WSL2虚拟磁盘瘦身实战&#xff1a;彻底解决C盘空间焦虑 你是否经历过这样的场景&#xff1a;刚打开资源管理器&#xff0c;刺眼的红色空间警告就跳出来提醒你C盘即将爆满&#xff1f;作为Windows开发者&#xff0c;WSL2带来的便利与C盘空间被VHDX文件吞噬的烦恼往往如影随形。本…

作者头像 李华