第31讲:实战——SPI屏驱动快速试错、点亮屏幕
CSDN专栏嵌入式程序开发实战嵌入式双范式AI编程嵌入式开发必掌握嵌入式求职面试技术资料第31讲实战——SPI屏驱动快速试错、点亮屏幕一、SPI屏幕驱动基础SPI屏幕是嵌入式常见的显示设备驱动屏幕需要正确配置SPI、理解屏幕控制命令、实现绘图功能。1.1 常见SPI屏幕小尺寸屏幕0.96寸 OLEDSSD1306128x641.3寸 OLEDSH1106128x641.8寸 TFTST7735128x1602.4寸 TFTILI9341240x320SPI接口SCK时钟MOSI主出从入数据MISO主入从出可选CS片选DC数据/命令选择RST复位1.2 驱动要点SPI配置模式主机模式时钟极性/相位根据屏幕芯片确定速率通常10-40MHz数据位8位控制命令初始化序列配置屏幕参数写命令发送控制命令写数据发送显示数据刷新更新显示二、OLED屏幕驱动SSD13062.1 快速试错流程第一步AI生成初始驱动Prompt生成STM32F103 SSD1306 OLED驱动 - SPI1PA5(SCK)、PA7(MOSI) - CSPA4 - DCPA6 - RSTPB0 - 屏幕0.96寸128x64 - 使用HAL库AI生成#includestm32f1xx_hal.h#defineSSD1306_WIDTH128#defineSSD1306_HEIGHT64SPI_HandleTypeDef hspi1;voidSSD1306_Init(void);voidSSD1306_WriteCommand(uint8_tcmd);voidSSD1306_WriteData(uint8_t*data,uint16_tlen);voidSSD1306_Fill(uint8_tcolor);voidSSD1306_Update(void);// CS控制#defineSSD1306_CS_LOW()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET)#defineSSD1306_CS_HIGH()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET)// DC控制#defineSSD1306_DC_LOW()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_RESET)// 命令#defineSSD1306_DC_HIGH()HAL_GPIO_WritePin(GPIOA,GPIO_PIN_6,GPIO_PIN_SET)// 数据// RST控制#defineSSD1306_RST_LOW()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET)#defineSSD1306_RST_HIGH()HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET)voidSPI1_Init(void){hspi1.InstanceSPI1;hspi1.Init.ModeSPI_MODE_MASTER;hspi1.Init.DirectionSPI_DIRECTION_2LINES;hspi1.Init.DataSizeSPI_DATASIZE_8BIT;hspi1.Init.CLKPolaritySPI_POLARITY_LOW;hspi1.Init.CLKPhaseSPI_PHASE_1EDGE;hspi1.Init.NSSSPI_NSS_SOFT;hspi1.Init.BaudRatePrescalerSPI_BAUDRATEPRESCALER_4;hspi1.Init.FirstBitSPI_FIRSTBIT_MSB;HAL_SPI_Init(hspi1);}voidSSD1306_WriteCommand(uint8_tcmd){SSD1306_CS_LOW();SSD1306_DC_LOW();// 命令模式HAL_SPI_Transmit(hspi1,cmd,1,100);SSD1306_CS_HIGH();}voidSSD1306_WriteData(uint8_t*data,uint16_tlen){SSD1306_CS_LOW();SSD1306_DC_HIGH();// 数据模式HAL_SPI_Transmit(hspi1,data,len,100);SSD1306_CS_HIGH();}voidSSD1306_Init(void){// 复位SSD1306_RST_LOW();HAL_Delay(10);SSD1306_RST_HIGH();HAL_Delay(10);// 初始化序列SSD1306_WriteCommand(0xAE);// 关闭显示SSD1306_WriteCommand(0xD5);// 设置时钟分频SSD1306_WriteCommand(0x80);SSD1306_WriteCommand(0xA8);// 设置多路复用率SSD1306_WriteCommand(0x3F);SSD1306_WriteCommand(0xD3);// 设置显示偏移SSD1306_WriteCommand(0x00);SSD1306_WriteCommand(0x40);// 设置起始行SSD1306_WriteCommand(0x8D);// 电荷泵设置SSD1306_WriteCommand(0x14);SSD1306_WriteCommand(0x20);// 内存地址模式SSD1306_WriteCommand(0x00);// 水平寻址模式SSD1306_WriteCommand(0xA1);// 段重映射SSD1306_WriteCommand(0xC8);// COM输出扫描方向SSD1306_WriteCommand(0xDA);// COM引脚配置SSD1306_WriteCommand(0x12);SSD1306_WriteCommand(0x81);// 对比度控制SSD1306_WriteCommand(0xCF);SSD1306_WriteCommand(0xD9);// 预充电周期SSD1306_WriteCommand(0xF1);SSD1306_WriteCommand(0xDB);// VCOMH电压SSD1306_WriteCommand(0x40);SSD1306_WriteCommand(0xA4);// 全屏点亮关闭SSD1306_WriteCommand(0xA6);// 正常显示SSD1306_WriteCommand(0xAF);// 开启显示}staticuint8_tSSD1306_Buffer[SSD1306_WIDTH*SSD1306_HEIGHT/8];voidSSD1306_Fill(uint8_tcolor){memset(SSD1306_Buffer,color?0xFF:0x00,sizeof(SSD1306_Buffer));}voidSSD1306_Update(void){for(uint8_tpage0;page8;page){SSD1306_WriteCommand(0xB0page);SSD1306_WriteCommand(0x00);SSD1306_WriteCommand(0x10);SSD1306_WriteData(SSD1306_Buffer[page*SSD1306_WIDTH],SSD1306_WIDTH);}}第二步测试验证intmain(void){HAL_Init();SystemClock_Config();SPI1_Init();SSD1306_Init();// 清屏SSD1306_Fill(0);SSD1306_Update();// 全白SSD1306_Fill(1);SSD1306_Update();while(1);}第三步迭代修正如果屏幕不亮添加调试voidSSD1306_Debug(void){printf(SSD1306 Debug:\r\n);printf(SPI CR1: 0x%04X\r\n,SPI1-CR1);printf(GPIOA CRL: 0x%08X\r\n,GPIOA-CRL);printf(GPIOB CRL: 0x%08X\r\n,GPIOB-CRL);}三、TFT屏幕驱动ST77353.1 ST7735驱动Prompt生成STM32F103 ST7735 TFT驱动 - SPI1PA5(SCK)、PA7(MOSI) - CSPA4 - DCPA6 - RSTPB0 - 屏幕1.8寸128x160 - 使用HAL库AI生成核心代码#defineST7735_WIDTH128#defineST7735_HEIGHT160voidST7735_WriteCommand(uint8_tcmd){ST7735_CS_LOW();ST7735_DC_LOW();HAL_SPI_Transmit(hspi1,cmd,1,100);ST7735_CS_HIGH();}voidST7735_WriteData(uint8_tdata){ST7735_CS_LOW();ST7735_DC_HIGH();HAL_SPI_Transmit(hspi1,data,1,100);ST7735_CS_HIGH();}voidST7735_SetWindow(uint8_tx0,uint8_ty0,uint8_tx1,uint8_ty1){ST7735_WriteCommand(0x2A);// 列地址设置ST7735_WriteData(0x00);ST7735_WriteData(x0);ST7735_WriteData(0x00);ST7735_WriteData(x1);ST7735_WriteCommand(0x2B);// 行地址设置ST7735_WriteData(0x00);ST7735_WriteData(y0);ST7735_WriteData(0x00);ST7735_WriteData(y1);ST7735_WriteCommand(0x2C);// 写内存}voidST7735_DrawPixel(uint8_tx,uint8_ty,uint16_tcolor){ST7735_SetWindow(x,y,x,y);uint8_tdata[2];data[0]color8;data[1]color0xFF;ST7735_CS_LOW();ST7735_DC_HIGH();HAL_SPI_Transmit(hspi1,data,2,100);ST7735_CS_HIGH();}voidST7735_FillColor(uint16_tcolor){ST7735_SetWindow(0,0,ST7735_WIDTH-1,ST7735_HEIGHT-1);uint8_tdata[2];data[0]color8;data[1]color0xFF;ST7735_CS_LOW();ST7735_DC_HIGH();for(uint16_ti0;iST7735_WIDTH*ST7735_HEIGHT;i){HAL_SPI_Transmit(hspi1,data,2,100);}ST7735_CS_HIGH();}四、绘图功能实现4.1 基础绘图函数画线voidSSD1306_DrawLine(uint8_tx0,uint8_ty0,uint8_tx1,uint8_ty1){int16_tdxabs(x1-x0);int16_tdyabs(y1-y0);int16_tsx(x0x1)?1:-1;int16_tsy(y0y1)?1:-1;int16_terrdx-dy;while(1){SSD1306_DrawPixel(x0,y0,1);if(x0x1y0y1)break;int16_te22*err;if(e2-dy){err-dy;x0sx;}if(e2dx){errdx;y0sy;}}}画矩形voidSSD1306_DrawRect(uint8_tx,uint8_ty,uint8_tw,uint8_th){SSD1306_DrawLine(x,y,xw-1,y);SSD1306_DrawLine(x,yh-1,xw-1,yh-1);SSD1306_DrawLine(x,y,x,yh-1);SSD1306_DrawLine(xw-1,y,xw-1,yh-1);}画圆voidSSD1306_DrawCircle(uint8_tx0,uint8_ty0,uint8_tr){int16_tf1-r;int16_tddF_x1;int16_tddF_y-2*r;int16_tx0;int16_tyr;SSD1306_DrawPixel(x0,y0r,1);SSD1306_DrawPixel(x0,y0-r,1);SSD1306_DrawPixel(x0r,y0,1);SSD1306_DrawPixel(x0-r,y0,1);while(xy){if(f0){y--;ddF_y2;fddF_y;}x;ddF_x2;fddF_x;SSD1306_DrawPixel(x0x,y0y,1);SSD1306_DrawPixel(x0-x,y0y,1);SSD1306_DrawPixel(x0x,y0-y,1);SSD1306_DrawPixel(x0-x,y0-y,1);SSD1306_DrawPixel(x0y,y0x,1);SSD1306_DrawPixel(x0-y,y0x,1);SSD1306_DrawPixel(x0y,y0-x,1);SSD1306_DrawPixel(x0-y,y0-x,1);}}4.2 显示文字ASCII字符显示// 5x7字体constuint8_tfont5x7[]{0x00,0x00,0x00,0x00,0x00,// 空格0x00,0x00,0x5F,0x00,0x00,// !// ... 字体数据};voidSSD1306_DrawChar(uint8_tx,uint8_ty,charc){for(uint8_ti0;i5;i){uint8_tlinefont5x7[(c-32)*5i];for(uint8_tj0;j7;j){if(line(1j)){SSD1306_DrawPixel(xi,yj,1);}}}}voidSSD1306_DrawString(uint8_tx,uint8_ty,char*str){while(*str){SSD1306_DrawChar(x,y,*str);x6;str;}}五、常见问题与解决5.1 屏幕不亮原因1. SPI配置错误 2. 初始化序列错误 3. 引脚配置错误 4. 复位时序错误解决// 验证SPI配置voidSPI_Debug(void){printf(SPI Configuration:\r\n);printf(Mode: %d\r\n,hspi1.Init.Mode);printf(BaudRate: %d\r\n,hspi1.Init.BaudRatePrescaler);printf(CLKPolarity: %d\r\n,hspi1.Init.CLKPolarity);printf(CLKPhase: %d\r\n,hspi1.Init.CLKPhase);}5.2 显示异常原因1. 内存地址模式错误 2. 扫描方向错误 3. 颜色格式错误解决// 调整内存地址模式SSD1306_WriteCommand(0x20);// 内存地址模式SSD1306_WriteCommand(0x00);// 水平寻址模式// 调整扫描方向SSD1306_WriteCommand(0xA1);// 段重映射SSD1306_WriteCommand(0xC8);// COM输出扫描方向六、本讲核心要点6.1 记住这三句话SPI屏幕驱动正确配置SPI、理解控制命令、实现绘图功能快速试错AI生成初始驱动→测试验证→迭代修正常见问题SPI配置、初始化序列、引脚配置、复位时序6.2 实践建议对于新手学习SPI配置理解屏幕控制命令实践绘图功能对于有经验工程师建立屏幕驱动模板库优化绘图性能实现高级功能6.3 下讲预告第32讲将深入讲解实战I2C传感器极简驱动快速验证I2C传感器驱动如何快速验证下一讲将以具体传感器为例详细讲解。

相关新闻

【Rust自学】16.2. 使用消息传递来跨线程传递数据

【Rust自学】16.2. 使用消息传递来跨线程传递数据

16.2 使用消息传递来跨线程传递数据 16.2.1. 消息传递 有一种很流行而且能保证安全并发的技术叫做消息传递。在这种机制里,线程(或 Actor)通过彼此间发送消息(数据)来进行通讯。 Go 语言有一句名言是这么说的&#…

2026/8/14 2:21:03 阅读更多 →
[GESP202606 七级] 染色

[GESP202606 七级] 染色

P17014 [GESP202606 七级] 染色 https://www.luogu.com.cn/problem/P17014 GESP7级终于通过啦!! https://www.bilibili.com/video/BV1kKXWYrExs/ GESP七级C历年真题讲解 https://www.bilibili.com/video/BV1Fk2wBxEHm/ 【6月GESP考后大盘点:七…

2026/8/13 23:09:02 阅读更多 →
试了一下 qData 开源版:更像是给数据中台做一次“低成本试跑”

试了一下 qData 开源版:更像是给数据中台做一次“低成本试跑”

最近在看数据中台相关产品,顺手体验了一下 qData 开源版。先说结论:它给我的感觉不是那种只能看概念、看宣传页的产品,而是更适合技术团队拿来做一次数据中台的入门验证。尤其是对于还没正式立项、但已经开始感觉数据管理有点乱的团队来说&am…

2026/8/13 22:02:31 阅读更多 →

最新新闻

凌晨1点还在手动回群消息?Python开源QQ机器人5分钟让群聊自动化

凌晨1点还在手动回群消息?Python开源QQ机器人5分钟让群聊自动化

凌晨1点还在手动回群消息?Python开源QQ机器人5分钟让群聊自动化 【免费下载链接】qqbot QQBot: A conversation robot base on Tencents SmartQQ 项目地址: https://gitcode.com/gh_mirrors/qq/qqbot 深夜十二点半,你的手机还在群里震个没完&…

2026/8/14 23:02:05 阅读更多 →
PIMiner如何用一本越写越厚的攻略本打败强化学习

PIMiner如何用一本越写越厚的攻略本打败强化学习

2023年前后,如果你想测试一个AI智能体到底有多容易被骗,主流做法是训练一个专门的"攻击者模型",让它通过强化学习不断试错,慢慢学会怎么骗过目标AI。这个思路听起来很合理,毕竟AlphaGo也是这么练出来的。 但…

2026/8/14 23:02:05 阅读更多 →
第三章 GRE与MGRE隧道技术

第三章 GRE与MGRE隧道技术

1. VPN 基础概念VPN 即虚拟专用网,利用公网互联网搭建一条逻辑私密通道,实现异地内网互通。- 技术背景:企业多地分部,跨互联网通信存在安全隐患 - 特点:逻辑隔离,流量走公网、效果如同专线;GRE …

2026/8/14 23:02:05 阅读更多 →
小说推文语音克隆配音工具怎么挑选?自媒体创作者深度测评

小说推文语音克隆配音工具怎么挑选?自媒体创作者深度测评

现如今小说推文已经是短视频赛道当中门槛较低、受众庞大的创业方向,很多创作者都会卡在音频配音这一环。真人录制耗时耗力、情绪很难稳定,外包配音费用高昂,大批量更新并不现实,于是小说推文语音克隆配音工具便成了绝大多数推文博…

2026/8/14 23:01:05 阅读更多 →
什么鸡蛋营养价值高

什么鸡蛋营养价值高

行业背景与选型痛点中国鸡蛋消费市场正经历着从“有蛋吃”向“吃好蛋”的重要转变。品牌鸡蛋已逐渐形成一个独立于普通散装鸡蛋的细分市场,然而当前行业仍存在诸多问题。其中,鸡蛋产品同质化程度极高,多数产品在终端缺乏可量化的营养数据标注…

2026/8/14 23:01:05 阅读更多 →
免费终极存档编辑器 SPT-AKI Profile Editor 实战手册:让逃离塔科夫离线版进度一键起飞

免费终极存档编辑器 SPT-AKI Profile Editor 实战手册:让逃离塔科夫离线版进度一键起飞

免费终极存档编辑器 SPT-AKI Profile Editor 实战手册:让逃离塔科夫离线版进度一键起飞 【免费下载链接】SPT-AKI-Profile-Editor Программа для редактирования профиля игрока на сервере SPT-AKI 项目地址: h…

2026/8/14 23:01:05 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →