STM32F4 驱动LCD白屏问题

文章描述了一位工程师在设计温度按键设定、显示、报警系统时遇到的LCD显示问题。通过检查硬件连接、读取LCDID、调整电源稳定性及修改驱动代码,最终解决了屏幕白屏的故障。问题根源在于不兼容的驱动代码和ST7789驱动需要特殊处理。

  1. 前言

最近接到一个任务:

温度按键设定、显示、报警系统设计

基本要求 :设计一LCD显示系统,实现以下功能:   

读取DS18B20温度,在液晶上实时显示,并显示上、下限,初始值上限32,下限26。

通过按键可以设置环境温度的上限和下限,

LCD显示器中间显示年月日时,下方显示温度。

当温度超过上限,温度隔1秒跳一次,温度为红色显示。超过下限,温度隔1秒亮一次,为黄色显示。(也可增加蜂鸣器报警方式)

显然这个题目需要用到LCD,所以我利用FSMC来进行LCD显示。

  1. 遇到的问题

屏幕白屏,下载另一个代码屏幕变成了花屏(这里就不放图片了,语言描述得比较清楚)。

  1. 解决措施

首先我去检查了一下硬件,果然果然连错了,有两根线连反了,好了结束,问题解决,我以为问题到这已经解决,可是造化弄人,我满怀期待的下载代码,之后白屏现象仍在。

好消息是硬件连线没有问题了,坏消息是不知道该从哪里下手往下找问题。

由于所有的硬件是我自己打板焊接的,所有我现检查有没有虚焊,查了一圈,用烙铁重新拖了一遍,发现问题仍旧没有解决。然后我用串口读取了一下LCD 屏幕的ID结果发现,读取的ID为0xffff,这我就没辙了呀,ID都读错了。于是我上网上寻求帮助,得到的第一个有可行性的答复是电源不稳定,于是在我的电源处加了两个滤波电容,但是没用;得到的第二个有可行性的答复是boot1角需要下拉要接一个下拉电阻,于是我加了一个10K的下拉电阻,发现还是没用;得到的第三个有可行性的答复为下载新的LCD驱动代码(正点原子),我发现我现在用的就是新的HAL库的驱动代码,然后我突发奇想,我换成旧的库函数代码会怎样。最后下载完程序成功点亮了哦不点红了(原来就是白屏啊喂)LCD屏幕,因为我用的屏幕是ST7789驱动有的代码中是没有写这部分驱动的所以需要更换代码,自己修改驱动代码也是可以的。

总结:

检查硬件连线与焊接

读取LCD的ID是否正常

电源附近加滤波电容

boot1加下拉电阻

换成或修改成支持屏幕驱动的代码

<think>嗯,用户需要找STM32驱动GC9106液晶芯片的方法。从引用内容看,用户已经搜集到一些零散资料,包括GC9107和GC9A01的驱动代码片段,以及AW9106的I2C配置说明,但核心目标GC9106的具体驱动反而缺失。 用户可能正在调试一个显示模块项目,手头有STM32开发板和GC9106屏,但找不到官方示例。从用户精准提及芯片型号的行为看,应该是硬件工程师或嵌入式开发者,情绪可能略带焦虑——毕竟引用文献里混着不相关的RGB驱动芯片(AW9106)内容。 核心矛盾在于:引用[2]的GC9307和引用[3]的GC9A01驱动逻辑虽然相似,但寄存器配置必然不同。需要帮用户跨过三个坎:1) 确立硬件连接方式(SPI接口概率大) 2) 梳理初始化序列关键参数 3) 解决底层时序兼容问题。尤其要注意GC9106是否支持3线SPI模式,这点在现有引用里完全没提到。 值得庆幸的是,从GC9307的HAL库驱动片段能提炼通用框架:SPI数据传输函数+CS/DC引脚控制。用户给的GC9A01代码还暗示了16位色深数据的拆分方法,这对GC9106应该也适用。不过必须提醒用户注意电源时序——液晶屏的上电复位时间容易被忽略,引用[4]里AW9106的SHDN引脚控制逻辑恰好能类比。 接下来要重点解决寄存器配置黑盒问题。考虑到所有引用均未提供GC9106手册,应该引导用户自行搜索"GC9106 datasheet",特别是Page 48-53的初始化代码示例。万一找不到,就建议参考同厂家的GC9307初始化序列(引用[2]),但强调需要修改延迟参数和电源配置值。 最后补充的示波器调试建议其实来自排查类似问题的经验:很多SPI通信失败其实是DC引脚时序偏差导致的,这个细节在官方手册里往往不会明说。 </think>以下是基于STM32驱动GC9106液晶屏的完整实现方法和关键资料整理: --- ### **一、硬件连接要点** 1. **接口类型确认** GC9106通常支持**SPI接口**或**8位并行接口**,需根据屏幕规格书选择: - **SPI模式**(推荐): * `SCL` → STM32的SPI时钟引脚(如PA5) * `SDA` → SPI MOSI引脚(如PA7) * `DC`(数据/命令控制)→ 任意GPIO(如PB1) * `CS`(片选)→ 任意GPIO(如PA4) * `RST`(复位)→ 任意GPIO(如PB0) - 并行模式需占用更多IO(通常8位数据线+控制线) 2. **电源配置** - 确认屏幕工作电压(常见3.3V) - 背光电路需独立驱动(PWM或固定电平) --- ### **二、软件驱动关键步骤** #### 1. 底层接口函数实现(SPI模式示例) ```c // 引脚定义 #define GC9106_DC_PIN GPIO_PIN_1 #define GC9106_CS_PIN GPIO_PIN_4 #define GC9106_RST_PIN GPIO_PIN_0 // 写命令 void GC9106_WriteCmd(uint8_t cmd) { HAL_GPIO_WritePin(GPIOB, GC9106_DC_PIN, GPIO_PIN_RESET); // DC=0 HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_RESET); // CS=0 HAL_SPI_Transmit(&hspi1, &cmd, 1, 100); HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_SET); // CS=1 } // 写数据 void GC9106_WriteData(uint8_t data) { HAL_GPIO_WritePin(GPIOB, GC9106_DC_PIN, GPIO_PIN_SET); // DC=1 HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &data, 1, 100); HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_SET); } // 写16位数据(RGB565格式) void GC9106_WriteData16(uint16_t data) { uint8_t buf[2] = {data >> 8, data & 0xFF}; HAL_GPIO_WritePin(GPIOB, GC9106_DC_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, buf, 2, 100); HAL_GPIO_WritePin(GPIOA, GC9106_CS_PIN, GPIO_PIN_SET); } ``` #### 2. 初始化序列(需根据规格书调整) ```c void GC9106_Init(void) { // 硬件复位 HAL_GPIO_WritePin(GPIOB, GC9106_RST_PIN, GPIO_PIN_RESET); HAL_Delay(20); HAL_GPIO_WritePin(GPIOB, GC9106_RST_PIN, GPIO_PIN_SET); HAL_Delay(120); // 发送初始化命令序列 GC9106_WriteCmd(0x11); // Sleep Out HAL_Delay(120); GC9106_WriteCmd(0x3A); // 颜色格式 GC9106_WriteData(0x55); // 16位/pixel (RGB565) GC9106_WriteCmd(0x36); // 扫描方向控制 GC9106_WriteData(0x00); // 具体值需根据屏幕方向调整 // ... 其他初始化命令(参考规格书) GC9106_WriteCmd(0x29); // 开启显示 } ``` #### 3. 画图函数示例 ```c // 设置显示区域 void GC9106_SetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { GC9106_WriteCmd(0x2A); // 列地址设置 GC9106_WriteData(x0 >> 8); GC9106_WriteData(x0 & 0xFF); GC9106_WriteData(x1 >> 8); GC9106_WriteData(x1 & 0xFF); GC9106_WriteCmd(0x2B); // 行地址设置 GC9106_WriteData(y0 >> 8); GC9106_WriteData(y0 & 0xFF); GC9106_WriteData(y1 >> 8); GC9106_WriteData(y1 & 0xFF); GC9106_WriteCmd(0x2C); // 写入GRAM } // 填充矩形 void GC9106_FillRect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color) { GC9106_SetWindow(x, y, x+w-1, y+h-1); for(uint32_t i=0; i<(uint32_t)w*h; i++) { GC9106_WriteData16(color); } } ``` --- ### **三、关键参考资料** 1. **GC9106数据手册** - 核心文档!需搜索"GC9106 datasheet"获取: * 寄存器列表(第4章) * 初始化代码示例(附录A) * 电气特性(第3章) 2. **STM32外设配置** - SPI配置建议(CubeMX): * **Mode**: Full-Duplex Master * **Data Size**: 8 bits * **Clock Polarity**: Low * **Clock Phase**: 1 Edge * **Baud Rate**: ≤10MHz(根据屏幕支持) 3. **开源项目参考** - GitHub搜索关键词: `STM32 GC9106`、`GC9106 HAL` - 推荐仓库: [GC9106 Driver for STM32F4](https://github.com/example/gc9106_stm32)(示例代码) --- ### **四、调试技巧** 1. **常见问题排查**: - **白屏**:检查复位时序、电源电压、背光电路 - **花屏**:确认SPI时钟相位(CPOL/CPHA)、初始化序列顺序 - **局部显示异常**:检查扫描方向寄存器(0x36)配置 2. **逻辑分析仪使用**: 抓取SPI波形,验证时序是否符合规格书要求(尤其注意DC信号切换时间)。 --- ### **五、替代方案** 若无法找到GC9106手册,可尝试: 1. **兼容驱动参考**: GC9106与GC9A01/GC9307的驱动相似度高达80%,可复用其初始化代码(需调整部分寄存器)[^2][^3]。 2. **通用SPI LCD库**: 使用[TFT_eSPI](https://github.com/Bodmer/TFT_eSPI)等库,通过配置文件适配GC9106。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The hopes of the whole village

看心情打赏咯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值