当前位置: 首页 > article >正文

手把手教你用STM32F103ZET6的SPI点亮2.4寸TFT屏(附ILI9341初始化代码避坑指南)

STM32F103ZET6 SPI驱动ILI9341 TFT屏实战全解析第一次拿到2.4寸TFT屏时看着五颜六色的排线我完全不知道从何下手。屏幕背面印着ILI9341的型号标识网上搜到的资料又零散不全。经过三天调试当屏幕终于显示出清晰的图像时那种成就感至今难忘。本文将分享从硬件连接到软件调试的全过程经验特别是那些容易踩坑的细节。1. 硬件连接与SPI配置1.1 引脚定义与物理连接ILI9341驱动的2.4寸TFT屏通常采用20pin排线接口关键信号线包括屏引脚STM32F103ZET6连接备注VCC3.3V电源正极GNDGND电源地CSPB11片选信号RESETPB12复位信号DC/RSPB10数据/命令选择SDAPB15(MOSI)SPI数据线SCLPB13(SCK)SPI时钟线LEDPB9背光控制常见接线错误将MOSI和MISO接反TFT屏通常不需要MISO忘记连接复位线导致屏幕无法初始化背光LED直接接3.3V导致无法关闭背光1.2 SPI外设初始化STM32F103的SPI2外设位于PB13~PB15引脚初始化配置如下void SPI2_Init(void) { SPI_InitTypeDef SPI_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // 配置SPI引脚 GPIO_InitStructure.GPIO_Pin GPIO_Pin_13 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOB, GPIO_InitStructure); // SPI参数配置 SPI_InitStructure.SPI_Direction SPI_Direction_1Line_Tx; // 单线发送模式 SPI_InitStructure.SPI_Mode SPI_Mode_Master; // 主机模式 SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; // 8位数据 SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; // 时钟极性 SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 时钟相位 SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // 软件控制NSS SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4; // 18MHz SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB;// 高位在前 SPI_Init(SPI2, SPI_InitStructure); SPI_Cmd(SPI2, ENABLE); }注意SPI时钟不宜过高初期调试建议设置为系统时钟的1/418MHz稳定后可逐步提高。2. ILI9341初始化序列详解2.1 关键寄存器配置ILI9341有数十个配置寄存器以下几个最为关键0x36 - 内存访问控制控制显示方向、颜色顺序等典型值0x48竖屏BGR顺序0x3A - 像素格式设置16位0x55或18位0x66颜色模式TFT屏通常使用16位RGB565格式0xB1 - 帧率控制设置刷新率影响显示流畅度典型值0x00, 0x1B约70Hz0xC0/C1 - 电源控制配置内部电压调节器需要严格按照数据手册顺序设置2.2 初始化代码优化原始初始化序列往往包含大量冗余设置经测试可简化为void LCD_Init(void) { LCD_Reset(); // 硬件复位 // 精简后的初始化序列 LCD_WR_REG(0xCF); LCD_WR_DATA(0x00); LCD_WR_DATA(0xC1); LCD_WR_DATA(0X30); LCD_WR_REG(0xED); LCD_WR_DATA(0x64); LCD_WR_DATA(0x03); LCD_WR_DATA(0X12); LCD_WR_DATA(0X81); LCD_WR_REG(0xE8); LCD_WR_DATA(0x85); LCD_WR_DATA(0x00); LCD_WR_DATA(0x78); LCD_WR_REG(0xCB); LCD_WR_DATA(0x39); LCD_WR_DATA(0x2C); LCD_WR_DATA(0x00); LCD_WR_DATA(0x34); LCD_WR_DATA(0x02); LCD_WR_REG(0xF7); LCD_WR_DATA(0x20); LCD_WR_REG(0xEA); LCD_WR_DATA(0x00); LCD_WR_DATA(0x00); // 电源控制 LCD_WR_REG(0xC0); LCD_WR_DATA(0x1B); // VRH LCD_WR_REG(0xC1); LCD_WR_DATA(0x12); // SAP LCD_WR_REG(0xC5); LCD_WR_DATA(0x32); // VCM控制 LCD_WR_REG(0xC7); LCD_WR_DATA(0XC0); // 对比度 // 内存访问控制 LCD_WR_REG(0x36); LCD_WR_DATA(0x48); // 竖屏模式 LCD_WR_REG(0x3A); LCD_WR_DATA(0x55); // 16位像素 // 显示控制 LCD_WR_REG(0xB1); LCD_WR_DATA(0x00); LCD_WR_DATA(0x1B); // 帧率 LCD_WR_REG(0xB6); LCD_WR_DATA(0x0A); LCD_WR_DATA(0xA2); // 显示功能 // Gamma校正 static const u8 Gamma_Sequence[] { /* 省略具体数值 */ }; LCD_WR_REG(0xE0); for(u8 i0; i15; i) LCD_WR_DATA(Gamma_Sequence[i]); LCD_WR_REG(0xE1); for(u8 i0; i15; i) LCD_WR_DATA(Gamma_Sequence[i15]); LCD_WR_REG(0x11); // 退出睡眠 delay_ms(120); LCD_WR_REG(0x29); // 开启显示 }调试技巧如果屏幕出现花屏可尝试调整0x36寄存器的值特别是MY/MX/MV这三个方向控制位。3. 显示优化技巧3.1 双缓冲机制实现直接刷屏会导致明显的闪烁采用双缓冲可大幅改善// 定义显存 u16 frame_buffer[2][320*240]; u8 current_buffer 0; // 切换显示缓冲区 void LCD_SwitchBuffer(void) { LCD_SetWindows(0, 0, 239, 319); LCD_CS_CLR; LCD_RS_SET; for(u32 i0; i320*240; i) { SPI_WriteByte(SPI2, frame_buffer[current_buffer][i]8); SPI_WriteByte(SPI2, frame_buffer[current_buffer][i]0xFF); } LCD_CS_SET; current_buffer ^ 1; // 切换缓冲区 }3.2 局部刷新优化全屏刷新耗时长针对动态区域可局部更新void LCD_UpdateRegion(u16 x1, u16 y1, u16 x2, u16 y2) { LCD_SetWindows(x1, y1, x2, y2); LCD_CS_CLR; LCD_RS_SET; u16 width x2 - x1 1; u16 height y2 - y1 1; for(u16 y0; yheight; y) { for(u16 x0; xwidth; x) { u16 color frame_buffer[current_buffer][(y1y)*320 (x1x)]; SPI_WriteByte(SPI2, color8); SPI_WriteByte(SPI2, color0xFF); } } LCD_CS_SET; }3.3 字体显示优化嵌入式系统常用点阵字体存储和渲染需特别处理// 字体结构定义 typedef struct { u8 width; // 字体宽度 u8 height; // 字体高度 u8 first_char;// 起始ASCII码 u8 char_num; // 字符数量 const u16 *data; // 字体数据 } FontType; // 显示一个字符 void LCD_ShowChar(u16 x, u16 y, u8 chr, FontType font, u16 color, u16 bgcolor) { u8 i,j; u8 temp; u16 x0 x; chr - font.first_char; const u16 *p font.data[chr * font.height]; for(i0; ifont.height; i) { temp *(pi); for(j0; jfont.width; j) { if(temp (1(font.width-1-j))) { LCD_DrawPoint(xj, yi, color); } else if(bgcolor ! color) { LCD_DrawPoint(xj, yi, bgcolor); } } } }4. 常见问题排查指南4.1 白屏问题分析当屏幕只亮背光无显示时按以下步骤排查检查电源测量VCC电压是否为3.3V确认GND连接可靠验证复位时序复位信号需保持低电平至少10ms复位后需延迟100ms再初始化SPI信号测试用逻辑分析仪抓取SPI波形确认CS、DC信号变化正常初始化序列确保发送了0x11(退出睡眠)和0x29(开启显示)检查0x36寄存器设置是否正确4.2 颜色异常处理颜色显示不正常时重点关注像素格式设置确认0x3A寄存器设置为0x55(16位接口)检查SPI数据是否为RGB565顺序内存访问控制0x36寄存器的BGR位决定颜色顺序典型设置0x48(竖屏BGR)Gamma校正不正确的Gamma值会导致颜色失真建议使用厂商提供的标准Gamma序列4.3 性能优化建议SPI时钟优化初期使用较低时钟(如18MHz)稳定后可逐步提高至36MHzDMA传输使用DMA可释放CPU资源配置示例void SPI2_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); DMA_DeInit(DMA1_Channel5); DMA_InitStructure.DMA_PeripheralBaseAddr (u32)SPI2-DR; DMA_InitStructure.DMA_MemoryBaseAddr (u32)frame_buffer; DMA_InitStructure.DMA_DIR DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize 320*240; DMA_InitStructure.DMA_PeripheralInc DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mode DMA_Mode_Normal; DMA_InitStructure.DMA_Priority DMA_Priority_High; DMA_InitStructure.DMA_M2M DMA_M2M_Disable; DMA_Init(DMA1_Channel5, DMA_InitStructure); SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE); }屏幕旋转优化修改0x36寄存器实现硬件旋转避免软件旋转带来的性能损耗调试ILI9341最耗时的部分是反复修改初始化参数。建议将初始化代码模块化通过宏定义快速切换不同配置。实际项目中我会先确保基本显示正常再逐步添加高级功能。

相关文章:

手把手教你用STM32F103ZET6的SPI点亮2.4寸TFT屏(附ILI9341初始化代码避坑指南)

STM32F103ZET6 SPI驱动ILI9341 TFT屏实战全解析 第一次拿到2.4寸TFT屏时,看着五颜六色的排线,我完全不知道从何下手。屏幕背面印着"ILI9341"的型号标识,网上搜到的资料又零散不全。经过三天调试,当屏幕终于显示出清晰的…...

ChatGPT Anywhere:零成本集成ChatGPT的浏览器扩展开发框架

1. 项目概述与核心价值 最近在折腾浏览器扩展,发现一个挺有意思的开源项目,叫 ChatGPT Anywhere。简单来说,它提供了一个“骨架”,让你能直接在浏览器扩展里调用 ChatGPT,而且最关键的是,它不走 OpenAI 的官…...

MAA明日方舟助手:5分钟彻底告别重复刷图,全自动智能基建管理

MAA明日方舟助手:5分钟彻底告别重复刷图,全自动智能基建管理 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目…...

XLSX I/O:如何在C语言项目中高效处理Excel文件?

XLSX I/O:如何在C语言项目中高效处理Excel文件? 【免费下载链接】xlsxio XLSX I/O - C library for reading and writing .xlsx files 项目地址: https://gitcode.com/gh_mirrors/xl/xlsxio XLSX I/O是一个专为C语言开发者设计的轻量级Excel文件读…...

收藏!后端转AI应用开发必看:2026年机会与避坑指南

作者分享从8年Java后端转型AI应用开发的经历,指出2026年AI应用开发前景广阔,但需要复合型人才。文章强调后端工程能力在大模型应用开发中的重要性,建议后端开发者通过学习LangChain、RAG等技术转型,并提供详细的学习路径和面试技巧…...

LaTeX排版进阶:理解浮动体算法,让你的[htbp!]参数真正生效

LaTeX浮动体排版原理深度解析:从算法到实战调优 第一次用LaTeX排学术论文时,我被那些"不听话"的图表折磨得够呛——明明写了[h]参数,图片却总跑到下一页;精心设计的表格在PDF里突然"消失",翻了几页…...

Calibre中文路径插件:彻底解决电子书中文路径被拉丁化问题

Calibre中文路径插件:彻底解决电子书中文路径被拉丁化问题 【免费下载链接】calibre-do-not-translate-my-path Switch my calibre library from ascii path to plain Unicode path. 将我的书库从拼音目录切换至非纯英文(中文)命名 项目地址…...

Ryujinx:在PC上畅玩Switch游戏的终极模拟器解决方案

Ryujinx:在PC上畅玩Switch游戏的终极模拟器解决方案 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款用C#编写的开源Nintendo Switch模拟器,让你无…...

通用资源管理库resourcelib:统一抽象与声明式配置实践

1. 项目概述:一个被低估的通用资源管理库如果你在开发中经常需要处理各种“资源”——无论是本地的配置文件、远程的API密钥、数据库连接池,还是更抽象的线程池、内存缓存块——并且为它们的加载、验证、生命周期管理和统一访问而头疼,那么re…...

采购成本总是说不清?怎么打造让老板一眼看透的采购成本地图?

每100元营收中,就有超过60元经由采购之手花出去。 然而,辛辛苦苦一年,到了年底,采购最常听到的却是…… “钱到底花哪了?” “还能再降降吗?” 只有采购人员知道,各项费用成本明细分散在纸质合同…...

MAA:明日方舟终极自动化助手,一键解放你的双手![特殊字符]

MAA:明日方舟终极自动化助手,一键解放你的双手!🚀 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all cli…...

终极QQ空间历史说说备份指南:GetQzonehistory完整使用教程

终极QQ空间历史说说备份指南:GetQzonehistory完整使用教程 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 你是否担心QQ空间里那些珍贵的青春记忆会随着时间流逝而消失&…...

BEAST 2:如何用贝叶斯MCMC方法构建精确的进化树?

BEAST 2:如何用贝叶斯MCMC方法构建精确的进化树? 【免费下载链接】beast2 Bayesian Evolutionary Analysis by Sampling Trees 项目地址: https://gitcode.com/gh_mirrors/be/beast2 BEAST 2(Bayesian Evolutionary Analysis by Sampl…...

如何选择合适的防水卷材以应对不同项目需求?

在选择合适的防水卷材时,了解不同类型的材料及其特点十分重要。单面自粘和双面自粘防水卷材在使用上各有优劣,前者方便快捷,适合一般的施工需求,后者则提供更强的密封性,适用于更复杂的场所。车库顶板这种特殊区域则需…...

特朗普家族涉足AI,WorldRouter平台能否打破AI模型使用价格壁垒?

5月5日,与特朗普及其家族密切相关的加密货币公司WLFI,联合WorldClaw推出AI模型路由平台WorldRouter,可用加密货币结算模型token,还提供优惠。这会是一门好生意吗?平台亮点:功能丰富且价格诱人WorldRouter酷…...

【AISMM模型落地实战指南】:20年专家亲授技术生态建设的5大关键跃迁与避坑清单

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与技术生态建设的底层逻辑 AISMM(Artificial Intelligence System Maturity Model)并非孤立的评估框架,而是以系统性、可演进性与协同性为内核的技术治理范…...

别再死记硬背了!用CAPL脚本在CANoe里实现这5个自动化测试场景,效率翻倍

别再死记硬背了!用CAPL脚本在CANoe里实现这5个自动化测试场景,效率翻倍 刚接触Vector工具链的工程师常陷入一个误区:把大量时间花在记忆CAPL函数语法上,却不知道如何将这些知识转化为实际测试能力。我曾见过团队成员反复查阅手册却…...

BitBake编译lighttpd时遇到‘Reconnecting to server’卡住?一个命令快速解决

BitBake编译lighttpd卡在"Reconnecting to server"的深度解析与系统化解决方案 在嵌入式开发领域,Yocto项目因其强大的定制能力和跨平台支持而广受欢迎。然而,当你在SDX62平台上使用BitBake编译lighttpd时,突然遇到"NOTE: Rec…...

告别裸机点阵:用LVGL V8.2给你的STM32 SPI屏做个炫酷Demo

从零打造STM32炫酷UI:LVGL V8.2在SPI屏幕上的实战指南 当你在STM32上成功驱动了那块SPI接口的LCD屏幕,看着它亮起并显示简单的图形时,兴奋之余是否也感到一丝不满足?裸机编程的点阵绘制方式,要做出一个滑动流畅的菜单或…...

VCS NLP低功耗仿真避坑指南:从UPF文件加载到Verdi Debug的完整实战

VCS NLP低功耗仿真避坑指南:从UPF文件加载到Verdi Debug的完整实战 在数字IC验证领域,低功耗仿真已成为不可或缺的一环。随着工艺节点不断演进,芯片功耗问题日益凸显,动态功耗管理变得至关重要。VCS NLP(Native Low Po…...

从“冒烟”实验到选型指南:搞懂电阻额定功率与二极管最大电流的实战意义

从“冒烟”实验到选型指南:搞懂电阻额定功率与二极管最大电流的实战意义 当一块电阻突然冒出白烟,或是二极管在电路中无声无息地失效,这背后往往隐藏着对元器件极限参数的误解。在嵌入式开发和硬件设计中,这些看似基础却致命的细节…...

WarcraftHelper:魔兽争霸3引擎现代化改造与帧率优化技术方案

WarcraftHelper:魔兽争霸3引擎现代化改造与帧率优化技术方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 魔兽争霸3作为一款经典的即时…...

WordPress搬家换域名,后台进不去、样式全乱?宝塔面板下保姆级修复指南

WordPress域名更换全流程:宝塔面板下的零故障迁移方案 当你决定为WordPress站点更换域名时,可能没想到这个看似简单的操作会引发一系列连锁反应——后台突然无法登录、前端样式彻底崩溃、图片集体失踪。这不是技术故障,而是典型的域名迁移后遗…...

TranslucentTB完整教程:三步打造Windows任务栏个性化终极方案

TranslucentTB完整教程:三步打造Windows任务栏个性化终极方案 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB TranslucentTB是…...

终极键盘控制鼠标指南:用Mouseable彻底解放你的双手

终极键盘控制鼠标指南:用Mouseable彻底解放你的双手 【免费下载链接】mouseable Mouseable is intended to replace a mouse or trackpad. 项目地址: https://gitcode.com/gh_mirrors/mo/mouseable 你是否厌倦了在键盘和鼠标之间频繁切换?是否因长…...

AI不是泡沫,但让机器人去当和尚是闹剧

AI不是泡沫,但让机器人去当和尚是闹剧 2026年5月6日,首尔曹溪寺。 一台身高130cm、身着灰褐色僧袍的人形机器人,站在韩国最大佛教宗派的方丈面前,宣誓皈依佛陀、佛法与僧团。它有一个法名:Gabi。现场视频迅速传遍社交媒…...

终极Steam经济增强工具:如何一键管理库存与市场交易

终极Steam经济增强工具:如何一键管理库存与市场交易 【免费下载链接】Steam-Economy-Enhancer 中文版:Enhances the Steam Inventory and Steam Market. 项目地址: https://gitcode.com/gh_mirrors/ste/Steam-Economy-Enhancer Steam Economy Enh…...

网盘直链解析工具终极指南:一键解锁主流网盘下载限制

网盘直链解析工具终极指南:一键解锁主流网盘下载限制 【免费下载链接】netdisk-fast-download 聚合多种主流网盘的直链解析下载服务, 一键解析下载,已支持夸克网盘/uc网盘/蓝奏云/蓝奏优享/小飞机盘/123云盘等. 支持文件夹分享解析. 体验地址: https://l…...

AISMM标准制定背后的博弈:IEEE、NIST、TC28三大机构技术路线分歧全曝光(含3份内部会议纪要节选)

更多请点击: https://intelliparadigm.com 第一章:2026奇点智能技术大会:AISMM与标准制定 AISMM框架的核心定位 AISMM(Artificial Intelligence System Maturity Model)是2026奇点智能技术大会正式发布的首个跨厂商A…...

生成阶段优化:Prompt 模板与上下文窗口管理

系列导读 你现在看到的是《RAG 检索增强生成系统设计:从原理到生产级部署的完整实践》的第 6/10 篇,当前这篇会重点解决:教会读者如何让 LLM 在生成阶段精准利用检索到的信息,避免生成偏离事实。 上一篇回顾:第 5 篇《检索策略进阶:混合检索与重排序(HyDE + Reranker)…...