讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ 怎么通过 SPI 驱动 ST7789 液晶屏并使用 DMA 加速屏幕刷新率

风磊吖_8330

风磊吖_8330

发布时间:2026-10-26 12:22:42

|

227人浏览过

|

来源于php中文网

原创

ST7789初始化必须禁用SPI 3线模式,DC引脚需CPU手动控制,SPI配置为Mode 3(CPOL=0, CPHA=0),使用双缓冲+半传输中断并配合DCache清理,发送像素前须发0x2C指令及dummy字节。

c++ 怎么通过 spi 驱动 st7789 液晶屏并使用 dma 加速屏幕刷新率

ST7789 初始化必须禁用 SPI 3 线模式,否则 DMA 传输会卡死

ST7789 默认上电是 4 线 SPI(SCL/SDA/DC/CS/RES),但很多移植者误用 3 线(SCL/SDA/CS)并依赖 DC 引脚电平切换命令/数据——这会导致 HAL_SPI_Transmit_DMA() 在发送多段数据时无法同步 DC 状态,DMA 中断里没法动态切 DC,最终屏幕显示错乱或完全无响应。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 初始化前拉低 RES 至少 10ms,再拉高并延时 120ms,确保芯片退出复位状态
  • DC 引脚必须接 GPIO,且全程由 CPU 控制(不能交给 SPI 外设模拟),每次发命令前手动置低,发数据前手动置高
  • SPI 配置中关闭 HAL_SPI_Init() 的 CPOL=1 和 CPHA=1(ST7789 要求 Mode 3),波特率建议 ≤ 20MHz(STM32H7 可到 36MHz,但需验证信号完整性)
  • 避免使用 HAL_SPI_TransmitReceive_DMA() ——它隐含全双工读写,而 ST7789 是单向写设备,MISO 悬空易引入噪声干扰 DMA 流程

DMA 刷新帧缓冲区要用双缓冲 + 半传输中断,否则屏幕撕裂明显

单缓冲直接刷 frame_buffer 会导致 DMA 正在传第 n 行时,CPU 已开始改写第 n+1 行,画面出现横向错位。ST7789 不支持硬件 VSYNC,只能靠软件同步。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 分配两块大小一致的帧缓冲区:frame_buffer_a 和 frame_buffer_b,用指针 current_fb 切换
  • 启动 DMA 时调用 HAL_SPI_Transmit_DMA(&hspi1, current_fb, sizeof(frame_buffer_a)),同时开启 HAL_SPI_RegisterCallback(&hspi1, HAL_SPI_TX_HALF_COMPLETE_CB_ID, ...)
  • 在半传输回调里翻转 current_fb 指针,并把新图像数据写入另一块缓冲区(此时 DMA 正在传前半部分,后半部分可安全更新)
  • 注意:sizeof 必须是 2 的整数次幂(如 240×320×2 = 153600 字节 → 扩展到 153600 对齐到 153600?不,要对齐 DMA 传输单元,实际建议用 153600 或补零至 153600+16,但更稳妥是直接用 __ALIGN_BEGIN uint16_t frame_buffer_a[240*320] __ALIGN_END 配合 SCB_CleanInvalidateDCache_by_Addr() 刷缓存

发送像素数据前必须先发内存写入指令 0x2C,且不能省略 dummy byte

很多驱动代码在 set_window() 后直接调用 HAL_SPI_Transmit_DMA() 发送 RGB565 数据,但 ST7789 要求在收到 0x2C 后,SPI 总线上第一个字节是 dummy(值任意,常为 0x00),否则后续像素被丢弃或错位。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 封装一个函数:st7789_write_pixels(uint16_t *data, size_t len),内部先拉低 DC,发 0x2C;再拉高 DC,发一个 0x00(dummy),再发 data 数组
  • dummy byte 必须作为 DMA 传输首字节 —— 把它和像素数据拼成临时缓冲区,或用 HAL_SPI_Transmit_DMA() 分两次调用(不推荐,增加中断开销)
  • 若使用 HAL_DMAEx_MultiBufferStart(),需确保 dummy byte 在主缓冲区头部,且两个缓冲区结构完全一致(包括 dummy 位置)
  • 检查示波器上 SCL/SDA 时序:0x2C 后至少等待 1 个 SPI 周期再拉高 DC,否则部分批次 ST7789 会忽略后续数据

STM32H7 上启用 D-Cache 后必须手动清理,否则 DMA 看到的是脏数据

这是最隐蔽的坑:CPU 写完 frame_buffer,以为数据已落内存,但实际还在 L1 D-Cache 里;DMA 控制器直连 AXI 总线,取的是物理内存旧值,导致屏幕显示上一帧内容或花屏。

实操建议:

立即学习“C++免费学习笔记(深入)”;

  • 定义帧缓冲区时加属性:uint16_t frame_buffer_a[240*320] __attribute__((section(".fb_a"), aligned(32))),并在链接脚本里将其放在非 cacheable 区域(如 DTCM 或 AXI SRAM),或
  • 保留 cacheable 属性,但在每次更新缓冲区后、启动 DMA 前调用:SCB_CleanDCache_by_Addr((uint32_t*)frame_buffer_a, sizeof(frame_buffer_a))(注意地址需 32 字节对齐)
  • 不要用 __DSB() 替代缓存清理 —— 它只保证指令顺序,不刷新 cache line
  • 如果用 HAL_DMAEx_MultiBufferStart() 切换双缓冲,每个缓冲区都必须单独 clean,不能只 clean 当前指针指向的那块

DMA 刷新率瓶颈往往不在 SPI 速度,而在 CPU 缓存管理和帧缓冲区拷贝路径。没做 cache clean 的代码,在仿真器下可能“看起来正常”,一拔调试器就出问题。

相关文章

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2268

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

1039

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

447

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

327

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

426

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

600

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1429

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1237

2024.03.22

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
linux嵌入式开发+驱动开发视频教程
linux嵌入式开发+驱动开发视频教程

共39课时 | 9.5万人学习

JavaScript OOP调试技巧视频教程
JavaScript OOP调试技巧视频教程

共5课时 | 1.1万人学习

C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn