恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

STM32硬件SPI+DMA驱动0.99寸TFT圆屏刷新实战

  • 首页
  • 资讯中心
  • /
  • STM32硬件SPI+DMA驱动0.99寸TFT圆屏刷新实战

相关资讯

STM32驱动0.99寸圆屏:硬件SPI+DMA显示完整实现 2026/10/14 18:04:18
KUKA码垛机器人程序包解析:从归档导入到码垛循环调试 2026/10/14 18:04:18
RTD2660HD显示主控固件开发实战:从屏参修改到EDID与ISP烧录 2026/10/14 18:04:18

最新资讯

MTK平台关机充电卡第一帧:充电链路与显示初始化的联合排查
apksigner签名全解:v1/v2/v3三重签名原理与实战
西安80到CGCS2000转换:七参数求解与ArcGIS实操指南
thClaws如何压缩超长对话?Compaction上下文管理机制全解析
用Math.NET做连续系统仿真:替代手写循环的数值库实践
kubectl 命令实战指南:从查询到排障的完整运维手册

今日推荐

IBM Verify Identity Access 修复 22 个漏洞:两个 9.8 严重 RCE 无需认证
小区物业管理系统
小型超市仓库管理系统

本周热门

UE动画修改实战:从资产编辑到重定向与蒙太奇驱动
统计随机数生成器攻击下的KLJN安全密钥交换协议Matlab仿真
政务API安全治理:资产测绘、低代码编排与行标对标实践

本月精选

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证
2026 大模型集体涨价:用 Python 做企业 Token 成本测算与选型避坑(附配置)

STM32硬件SPI+DMA驱动0.99寸TFT圆屏刷新实战

发布时间:2026/10/14 18:04:18
STM32硬件SPI+DMA驱动0.99寸TFT圆屏刷新实战 简介一套基于STM32F103RCT6驱动0.99寸TFT圆屏的完整工程资源适合有单片机基础、想提升屏幕刷新性能或学习硬件SPI与DMA协同工作的开发者。该方案采用硬件SPIDMA传输解决了软件模拟SPI刷新慢、动态图片易卡顿的问题实测动态显示流畅符合日常交互需求。资源包共218个文件总大小5.66MB以40个C源文件、41个头文件为核心附带Keil工程配置文件、编译中间文件o/crf/axf/hex以及链接脚本和批处理工具可直接打开工程编译烧录。目前已有547人学习下载。通过阅读驱动源码和DMA配置可以掌握圆屏显示初始化流程、SPI时序控制及内存与性能的平衡技巧文件中的脚本和备份文件还能辅助调试与工程清理。由于主控RAM有限该资源适用于图片数量较少的动态显示场景也可为移植到更高容量芯片提供参考。1. 先把屏幕点亮再说STM32F103RCT6 配 0.99 寸 TFT 圆屏用硬件 SPI 加 DMA 刷新听起来就是把一块 240×240 的小屏点亮但真正卡住人的从来不是“点不亮”而是点亮之后怎么刷得像样。用软件模拟 SPI 确实能出画面可一旦要显示动态数据、菜单切换或者简单动画CPU 被刷屏循环占死系统其他任务全部停摆。这个方案解决的就是刷新通路问题让硬件 SPI 负责时钟和移位DMA 负责搬运像素字节主控只在一行刷完时填下一行数据。适合已经调过 GPIO、UART对中断和定时器不陌生想把手里的 RCT6 真正用起来的开发者。0.99 寸圆屏看着小参数上却是 240×240 分辨率RGB565 全屏一帧就是 115200 字节RCT6 的 48KB SRAM 根本放不下全帧缓冲。于是行缓冲、分块刷新、DMA 的 Normal 模式反复重装这些才是中级项目真正要练的东西。下面从原理讲到代码再讲到五个高频翻车点最后用局部窗口刷新把帧率再压榨一档。2. 硬件 SPI 和 DMA 是天生一对为什么中级项目绕不开这一关2.1 同样是刷屏软件 SPI 和硬件 SPI 差了一个数量级先看软件 SPI 在刷屏时会干什么。屏幕的 SPI 接口要求 MOSI 数据在 SCK 上升沿被采样软件模拟就是先把 GPIO 拉低再把数据位写到 MOSI再拉高 SCK循环 8 次发完一个字节。240×240 的 RGB565 画面有 57600 个像素每个像素 2 字节总共 115200 字节等于 921600 次 GPIO 置位加 921600 次时钟翻转这只是发送部分还没算像素填充逻辑。主频 72MHz 的 F103 在这种模式下刷新一帧耗时能到数百毫秒期间任何中断都会在波形上留下毛刺花屏和闪屏几乎是必然。硬件 SPI 把 SCK 的时钟产生和 MOSI 的移位输出全部交给外设完成。主控只写一次 SPI1_DR 寄存器一个字节就交给移位寄存器剩下的时钟翻转由 SPI 外设自动跑完。关键区别在于 CPU 的介入从“每个比特都要管”降到“每个字节写一次”而 DMA 又把这个“每字节写一次”接走了。SPI 移位寄存器每发送完一个字节TXE 标志置位DMA 控制器响应 SPI 的 DMA 请求自动把内存里的下一个字节搬到 SPI1_DR。整条数据通路从内存到屏幕没有 CPU 逐字节干预这就是它能刷得快的原因。对比下来并不复杂软件 SPI 适合没有硬件 SPI 引脚或者对速度完全无感的场景比如调一块 12864 或者 OLED 单色屏而 0.99 寸彩色圆屏这种数据量软件模拟属于能亮但不好用。RCT6 的 SPI1 挂在 APB2 总线上外设时钟 72MHz比 SPI2 的 36MHz 上限高一倍所以第一选择永远是 SPI1。把 SPI1 预分频设为 4得到 18MHz 的 SPI 时钟对常见圆屏模组来说是既稳定又相对快的档位后续想降速排查问题也很方便。2.2 DMA 省下来的时间到底花哪去了很多人以为 DMA 是灵丹妙药加上之后 CPU 就完全不干活了这是误解。DMA 只负责“内存到 SPI 数据寄存器”的搬运CPU 依然要准备数据、控制流程、响应中断。真正的收益是搬运动作不再打断 CPU。软件 SPI 刷一帧CPU 被 921600 次位翻转绑死加了 DMA 之后CPU 在每次启动 DMA 传输时一次性把一整行像素交给 DMA然后可以干别的事等一行传完再来填下一行。一帧 240 行CPU 被打扰的次数从百万次级别降到两百多次。实际开发中这个差距体现在两个地方。第一是定时器中断的抖动变小了。软 SPI 刷屏期间中断服务程序每次执行到一半都会被 SPI 的位翻转挤占时序乱了PWM 输出和按键扫描都会受影响DMA 方案里每行传输完成才产生一次中断中断处理只有几微秒对系统其他任务的影响小得多。第二是帧率上限不同。软 SPI 刷一帧要 300 到 500 毫秒DMA 方案把主要耗时压在 SPI 时钟传输上18MHz 下全屏理论传输时间约 6.4 毫秒算上填行缓冲和指令开销整帧刷新可压缩到 20 毫秒上下也就是 50 帧的量级。对一块 0.99 寸的小屏这个水平足够做很流畅的仪表盘和动态菜单。还要注意 DMA 不是越快越好。DMA 传输快意味着显存侧的读写压力大如果行缓冲的填充逻辑写得粗糙DMA 反而会等 CPU 填数据速度又回到 CPU 瓶颈上。中级项目的常见做法是 DMA 用 Normal 模式每次只搬一行CPU 在等待 TC 标志的同时完成下一行填充两者天然形成流水线。后面代码部分我会按这个思路展开。2.3 先把硬件配置定下来引脚复用与时钟分配F103 的 SPI1 引脚是固定的这一点先搞清楚省得后面反复查。下面这张表是 SPI1 的默认复用映射在做硬件连接时可以直接对照。信号引脚作用SPI1_SCKPA5SPI 时钟由主机输出SPI1_MISOPA6主机输入圆屏只写不用可不接SPI1_MOSIPA7主机输出接屏的 SDASPI1_NSSPA4片选这里用普通 GPIO 手动控制DC 引脚任意 GPIO命令/数据选择线RST 引脚任意 GPIO屏幕复位常见 0.99 寸圆屏模组是 240×240 分辨率驱动 IC 多为 GC9106部分批次兼容 ST7789V2两者的指令集在基本命令上一致。屏上的接口一般是四个信号脚加电源CS、DC也叫 RS、SDA、SCK以及 VCC 和 GND。部分模组还引出 BLK 背光脚可以直接接 3.3V 强制点亮或者用一个 GPIO 控制亮度。时钟分配上SPI1 挂 APB272MHz 输入。预分频寄存器可选 2、4、8、16 等选 4 就是 18MHz。对 0.99 寸这种 SPI 屏18MHz 在大部分模组手册允许范围内但有些劣质模组在长排线下会出问题。排查时可以降到 9MHz预分频 8稳定后再逐步提上去。DMA 通道方面SPI1_TX 固定对应 DMA1_Channel3外设地址直接写 SPI1_DR 寄存器地址内存地址是行缓冲区首地址方向和宽度后面代码里细说。3. 用代码把 0.99 寸圆屏点亮硬件 SPIDMA 最小骨架3.1 GPIO 复用函数初始化四线 SPI 的引脚到底怎么配先做 GPIO 和 SPI 外设的基础初始化。以下代码基于标准外设库RCT6 老工程大多用这套寄存器更透明DMA 配置也一目了然。void TFT_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; // 使能 GPIOA、GPIOB、SPI1 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // PA5-SCK、PA7-MOSI 复用推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // CS、DC、RST 用普通推挽输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // CSPA4 GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_2MHz; GPIO_Init(GPIOA, GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin GPIO_Pin_1 | GPIO_Pin_2; // DC、RST用 PB1 PB2 GPIO_Init(GPIOB, GPIO_InitStructure); // 初始化电平 GPIO_SetBits(GPIOA, GPIO_Pin_4); // CS 高电平未选中 GPIO_SetBits(GPIOB, GPIO_Pin_2); // RST 高电平 }SCK 和 MOSI 必须配成复用推挽 GPIO_Mode_AF_PP速度选 50MHz这样 SPI 外设才能控制引脚输出。CS、DC、RST 是普通控制脚推挽输出 2MHz 足够没必要拉到 50MHz 增加噪声。CS 默认拉高避免上电时误选中屏幕RST 先拉高等初始化序列里再执行复位时序。3.2 SPI 和 DMA 初始化主模式、字节宽度、Normal 模式SPI 配置的核心是模式 0 和字节宽度DMA 配置的核心是宽度一致和 Normal 模式这段代码基本可以直接复用。void TFT_SPI_DMA_Init(void) { SPI_InitTypeDef SPI_InitStructure; DMA_InitTypeDef DMA_InitStructure; // SPI1 主机模式8 位模式 0 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; SPI_InitStructure.SPI_NSS SPI_NSS_Soft; SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4; SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; SPI_InitStructure.SPI_CRCPolynomial 0; SPI_Init(SPI1, SPI_InitStructure); // 使能 SPI1 的 TX DMA 请求 SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE); // DMA1_Channel3 对应 SPI1_TX DMA_DeInit(DMA1_Channel3); DMA_InitStructure.DMA_PeripheralBaseAddr (uint32_t)(SPI1-DR); DMA_InitStructure.DMA_MemoryBaseAddr (uint32_t)line_buf; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize TFT_WIDTH * 2; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode DMA_Mode_Normal; DMA_InitStructure.DMA_Priority DMA_Priority_Medium; DMA_InitStructure.DMA_M2M DMA_M2M_Disable; DMA_Init(DMA1_Channel3, DMA_InitStructure); }SPI_BaudRatePrescaler_4 把 72MHz APB2 时钟分到 18MHz这是大多数 0.99 寸彩屏的稳定上限。如果电路板排线较长或者屏幕初始化后花屏先改成 SPI_BaudRatePrescaler_8 降到 9MHz 再做排查。DMA 外设地址固定指向 SPI1_DR内存地址是 line_buf方向是内存到外设。数据宽度两边都选 Byte因为在 8 位 SPI 模式下SPI1_DR 每次接收一个字节如果用半字宽度反而会把两个字节拼成一个 16 位数据错位发送。Mode 用 Normal每行传输完成自动停止方便重新装载下一行不要用 Circular否则数据地址绕回后没法逐行填入新像素。3.3 屏初始化和刷屏函数为什么 240×240 要用行缓冲下面先给底层命令发送函数。DC 引脚拉低写命令拉高写数据这是所有 SPI 彩屏通用的约定。static void TFT_Send_Cmd(uint8_t cmd) { TFT_CS_LOW(); TFT_DC_LOW(); // 命令模式 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) RESET); SPI_I2S_SendData(SPI1, cmd); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) SET); TFT_CS_HIGH(); } static void TFT_Send_Data(uint8_t data) { TFT_CS_LOW(); TFT_DC_HIGH(); // 数据模式 while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) RESET); SPI_I2S_SendData(SPI1, data); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) SET); TFT_CS_HIGH(); }每次发送前等待 TXE 标志发送后等待 BSY 清零再拉高 CS这两个等待是保证传输完整的关键。命令发送和状态查询都用查询方式因为初始化阶段和数据传输阶段对速度要求不同命令阶段慢一点换来的是可靠。然后是初始化序列。0.99 寸圆屏不同模组指令细节有差异但下面这组基础命令在 GC9106 和 ST7789V2 上都能识别够把屏幕点亮。void TFT_Init(void) { TFT_GPIO_Init(); TFT_SPI_DMA_Init(); // 硬件复位 TFT_RST_LOW(); Delay_ms(20); TFT_RST_HIGH(); Delay_ms(120); TFT_Send_Cmd(0x01); // Soft Reset Delay_ms(120); TFT_Send_Cmd(0x11); // Sleep Out Delay_ms(120); TFT_Send_Cmd(0x3A); TFT_Send_Data(0x05); // RGB565 16 位 TFT_Send_Cmd(0x36); TFT_Send_Data(0x00); // RGB 顺序不翻转 TFT_SetWindow(0, 0, 239, 239); // 全屏窗口 TFT_Send_Cmd(0x29); // Display On }0x11 Sleep Out 之后要等 120 毫秒再继续这是芯片内部升压电路稳定的时间。0x3A 配成 0x05 表示每像素 16 位 RGB565。0x36 的 0x00 是常见默认方向如果显示内容上下颠倒或者左右镜像改这个寄存器的值就行。RCT6 的颜色输出顺序是 R 高 5 位、G 中 6 位、B 低 5 位和这个配置是对应的。真正刷屏时不能一次把 115200 字节全部丢给 DMARCT6 的 SRAM 只有 48KB全帧缓冲放不下。所以用行缓冲一行的像素临时存在数组里逐行启动 DMA。#define TFT_WIDTH 240 #define TFT_HEIGHT 240 static uint8_t line_buf[TFT_WIDTH * 2]; // 一行像素每像素 2 字节 void TFT_FillRect(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { uint16_t h y1 - y0 1; uint16_t w x1 - x0 1; uint16_t i; // 把 color 拆成高低字节按 SPI 先高后低填入行缓冲 uint8_t hi color 8; uint8_t lo color 0xFF; for (i 0; i w; i) { line_buf[i * 2] hi; line_buf[i * 2 1] lo; } TFT_SetWindow(x0, y0, x1, y1); for (i 0; i h; i) { DMA_Cmd(DMA1_Channel3, DISABLE); DMA_SetCurrDataCounter(DMA1_Channel3, w * 2); DMA_Cmd(DMA1_Channel3, ENABLE); while (DMA_GetFlagStatus(DMA1_FLAG_TC3) RESET); // 等待一行传完 DMA_ClearFlag(DMA1_FLAG_TC3); } }TFT_SetWindow 里已经发送了 0x2A、0x2B、0x2C 三条指令后续 DMA 传出的数据会按窗口自动填入显存。每次启动 DMA 前要先 DISABLE再重设传输字节数再 ENABLE这是 DMA 在 Normal 模式下的固定套路少一步都会出问题。line_buf 用 uint8_t 而不是 uint16_t是因为 F103 是小端uint16_t 数组在内存中低地址存低字节直接丢给 DMA 会把 RGB565 的低字节先发出去颜色必然错位。这里手动拆成 hi 和 lo再按先高后低写入缓冲区就绕开了大小端问题。全屏刷新就是调用 TFT_FillRect(0, 0, 239, 239, 任意颜色)内部循环 240 行每行传输 480 字节。DMA 完成中断打开后还可以把等待 TC 标志改成中断里填下一行进一步提升 CPU 利用率但查询方式已经能把一帧刷到几十毫秒量级作为中级项目足够先跑起来。4. 硬件 SPIDMA 显示避坑指南5 个看得见的翻车现场4.1 一上电满屏雪花SPI 的极性和相位不是玄学现象屏幕能亮背光正常但画面全是噪点像老电视雪花有时还伴随闪烁。原因最常见的是 SPI_CPOL 和 SPI_CPHA 配置错了。0.99 寸圆屏的驱动 IC 一般要求模式 0也就是 CPOL 低电平、CPHA 第一个边沿采样。如果配成模式 3时钟空闲时是高点平数据采样沿差了一位主控发出的字节和屏幕采到的字节全部错开。另一个容易被忽略的坑是时钟线悬空SCK 在初始化前没有被 SPI 外设接管处于浮空状态外部干扰会让屏幕误判数据传输开始。解决先把模式改成 SPI_CPOL_Low 加 SPI_CPHA_1Edge。如果还是花把预分频降到 SPI_BaudRatePrescaler_8看是否排线太长导致信号劣化。还可以用示波器抓 SCK 和 MOSI 波形对照屏幕手册确认空闲电平和采样沿。这类问题属于“看着难查起来就三分钟”但每次都有人卡住。4.2 只刷了上半屏或底部全是残影DMA 传输大小没对齐像素行现象全屏填充时上半屏正常下半屏颜色乱或者保持上一次的内容。刷新两次后画面错位更明显。原因DMA_BufferSize 设置成了 240 而不是 480。line_buf 每像素 2 字节一行 240 个像素一共 480 字节如果只传 240 字节DMA 传完一行数据屏幕窗口地址只走了半行余下半行停留在上次内容。下一行又被当成从中间开始写整个画面逐行错位。解决确认 DMA_BufferSize 等于 当前行像素数乘以 2。注意如果 line_buf 声明成 uint16_t 数组sizeof(line_buf) 是 480 还是 240 取决于书写方式容易自己把自己绕进去。建议统一用 uint8_t 数组缓冲大小直接写 TFT_WIDTH * 2含义一眼可知。4.3 画面一顿一顿在错误的位置等 DMA 完成现象刷新一帧要几百毫秒甚至能看到一行一行慢慢往下推DMA 似乎完全没起作用。原因代码里在每次启动 DMA 后立刻等待 TC 标志并且在主循环里频繁查询。如果查询循环没有让出 CPU填充逻辑也被堵住DMA 传输完一行后CPU 还在原地打转下一行的数据迟迟没有准备好。更严重的是在等待过程中如果发生中断中断里又调用了刷屏相关函数会导致 DMA 重装数据计数器出错。解决把等待放到行与行之间也就是先把下一行像素填好再启动下一行 DMA。查询 TC 标志之前确保这一行的窗口地址已经设置正确。进阶做法是打开 DMA1 通道 3 的传输完成中断在中断里填下一行、启动下一次传输CPU 在大部分时间内都是空闲的。查询方式的帧率已经满足中级项目需要但不要在等待期间调用延时函数。4.4 颜色对不上、红蓝互换高低字节顺序被小端坑了现象显示红色变成了蓝色绿色正常整个画面的色调像被反相过。填充单一颜色时最容易发现。原因F103 是小端模式一个 uint16_t 的 0xF800红色在内存里低地址存 0x00高地址存 0xF8。DMA 配置成 8 位宽度时会先把低地址的 0x00 发出去屏幕收到 0x00 0xF8解析成 0x00F8也就是蓝色。这类错误在模拟 SPI 下不会出现因为模拟 SPI 代码通常是手动按高字节先发而 DMA 不管大小端只按内存地址顺序搬运。解决line_buf 用 uint8_t 数组填充时显式拆分颜色值先把高位字节写入偶数下标再把低位字节写入奇数下标。还有一种思路是把 DMA 数据宽度和外设宽度都改成半字但 SPI 的 DR 寄存器是 8 位有效半字模式会把两个字节拼成 16 位打包屏幕照样读错。手动拆字节虽然多一条赋值语句但这是最直观、最好排查的做法。4.5 圆屏边缘一圈异常地址窗和模组的显示区没对齐现象画面的主体能显示但圆屏边缘有一圈白边、彩条或者内容偏向一边圆形玻璃内有部分区域始终显示异常。原因0.99 寸圆屏的可视区域并不是整个 240×240 矩形模组厂家会在驱动 IC 里写入显示区偏移。不同批次的圆屏偏移量可能不同甚至 0x36 的默认方向都不一样。直接照搬方形屏的初始化窗口地址从 (0,0) 到 (239,239)内容和玻璃边缘就对不上。圆屏的“圆形”是由玻璃裁切决定的驱动 IC 并不知道屏是圆的它只按矩形窗口写入所以偏移配置必须匹配模组。解决先确认手里的模组驱动 IC 型号向卖家要初始化序列。重点对比 0x36 地址模式和 0x2A/0x2B 窗口起止值。如果只有方屏的初始化代码可以先把全屏填成纯色观察显示区域在矩形中的位置再通过调整 0x36 的翻转位和列地址偏移把有效区搬到正中。GC9106 和 ST7789V2 都支持这些基础命令差别主要在 Gamma 和电源寄存器颜色深度异常时再补。5. 进阶验证用局部窗口刷新把帧率再压榨一档全屏刷新在 0.99 寸圆屏上已经能跑到几十毫秒但实际界面里大部分时候只有局部区域在变化。比如一个圆形仪表盘只有数字和指针在动背景是静止的这时候每次全量刷新就是把 115200 字节全部送一遍纯属浪费。利用 0x2A/0x2B 窗口命令可以把刷新范围限制在变化区域。TFT_FillRect 里已经实现了任意矩形窗口局部刷新只是在调用时传入更小的坐标范围。DMA_BufferSize 随着窗口宽度变化TFT_SetWindow 会重新设置列和页地址。下面的代码展示一个 40×40 矩形区域的刷新只传 3200 字节// 假设时钟数字区域在左下角只刷新这一块 TFT_FillRect(20, 180, 59, 219, 0xFFFF); // 白色填充这一行命令实际做的事是设置窗口为 (20,180) 到 (59,219)循环 40 行每行 DMA 传输 80 字节。相比全屏 240 行乘 480 字节数据量降了一个数量级。动态界面的帧率瓶颈从“传完 115200 字节要多久”变成“填完这一个区域要多久”而填充 40×40 的纯色块在 72MHz 主频下几乎一瞬间完成。验证这个方案的改进效果不需要复杂的工具在刷屏函数里对一个空闲 GPIO 引脚做翻转用逻辑分析仪或者示波器测高电平宽度就能算出实际帧周期。我自己常用的习惯是测试不同区域的刷新耗时记成一张表后续做界面布局时先看数据量再决定刷新策略刷新内容窗口尺寸传输字节数18MHz 理论耗时全屏纯色240×2401152006.4ms半屏区域120×240576003.2ms数字控件40×4032000.18ms单行更新240×14800.03ms实测中还要加上指令开销和填充耗时但趋势很清楚越小窗口越接近“瞬时刷新”。做动态界面时先把静态背景画一次之后只更新变化区域帧率提升是肉眼可见的。我现在接手这类显示工程时第一件事就是把所有绘制函数改成带坐标参数的版本拒绝写死全屏的 API后续接 GUI 或者做脏矩形标记都会省很多事。这算是这块圆屏教会我的一个习惯也希望对你有帮助。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号