中电网移动|移动中电网|高清图滚动区

《机智云Gokit3开发篇》4 RGB灯的介绍与驱动移植(HAL库)

物联网开发与STM32 嵌入式应用实践中,RGB 灯是实现可视化交互、状态指示的常用外设,而机智云 Gokit3 开发板作为物联网开发的经典硬件平台,其板载的 RGB 灯凭借 P9813 专用驱动芯片具备灵活的色彩控制能力。

 

本文聚焦Gokit3 开发板(MCU 模式,主控 STM32F103C8T6),以 HAL 库为开发基础,从 P9813 驱动芯片的工作原理入手,系统讲解 RGB 灯的硬件特性,并完整解析 RGB 灯 HAL 库驱动的移植过程,同时通过红绿蓝颜色轮询的功能实现,让开发者直观掌握 RGB 灯的驱动开发与实际应用,文末还将附上本文涉及的源码、原理图等全套资料链接,助力快速上手开发。

 

01RGB和P9813驱动芯片原理

 

在Gokit3 的原理图中,RGB 灯的驱动核心是P9813 芯片(图中 U3),它是一款单总线控制的 RGB 全彩 LED 驱动芯片,专门用于简化 RGB 灯的硬件控制 —— 仅需 2 根控制信号线,即可实现 RGB 颜色的精准调节。

 


23e5d0f2-fc3a-11f0-8ce9-92fbcf53809c.png

 

引脚介绍:

 

9脚(VCC)接VCC5V+R5(3.6Ω电阻)芯片电源输入(5V供电),R5是限流电阻,避免电源冲击

4脚(GND)接GND芯片接地引脚,保证电源回路

1脚(DIN)接“DIN”接口(对应STM32PB9)串行数据输入引脚:接收STM32发送的颜色控制数据(对应STM32中PB9)

2脚(CIN)接“TheKey”接口(对应STM32PB8)时钟输入引脚:接收STM32发送的同步时钟信号(对应STM32中PB8)

5脚(R)、6脚(G)、7脚(B)接RGB灯的红、绿、蓝通道直接驱动RGB灯的三个颜色通道,输出对应亮度的电流

14脚(COUT)、13脚(VOUT)悬空(未连接)级联输出引脚:用于多颗P9813串联控制(Gokit3仅用1颗,故未使用)

12脚(MODE)接C18(100nF电容)→GND模式选择引脚:通过电容下拉至GND,配置为“单线模式”(Gokit3用的单总线通信

11脚(CLKSEL)接C18(100nF电容)→GND时钟模式选择引脚:电容下拉配置为“外部时钟模式”(时钟由STM32的PB8提供)

3脚(JEN)接R13(10KΩ电阻)→GND使能引脚:下拉至GND表示“使能芯片工作”(默认处于工作状态)

10脚(VOUT)悬空(未连接)级联电源输出(同VCC,级联时给下一颗芯片供电)

 

1、单总线通信,仅需2根线(时钟SCL+数据SDA)即可控制,无需复杂硬件(如SPI/I2C)PB8=SCL、PB9=SDA,无外设初始化

2、24位颜色控制,红(R)、绿(G)、蓝(B)各分配8位数据,亮度范围0~255R_MAX/G_MAX/B_MAX=255

3、内置反码校验,颜色数据高2位需传输反码,

4、帧格式固定通信必须以“起始帧+数据帧+重复帧”完成

5、5V电压兼容适配Gokit3的5V供电,无需额外电平转换源码无电平转换逻辑

 

02Gokit3 板载的RGB 灯

 

1.Gokit3 板载 RGB 灯由 P9813 驱动芯片全彩 LED 驱动芯片控制,核心特性:

通信:仅需(原理图上的SCL连PB8)+ (原理图上的SDA连PB9)2 根线即可控制颜色

颜色编码:24 位颜色数据(R/G/B 各 8 位,亮度范围 0~255)

通信规则:

先发送32 个 0 作为起始帧,再发送 32 位颜色数据(含标志位 + 反码 + RGB 值),最后重复发送颜色数据确保生效

 

03原理图及实物图

 


23fd727a-fc3a-11f0-8ce9-92fbcf53809c.png



241b9782-fc3a-11f0-8ce9-92fbcf53809c.png

 

 

2、GPIO硬件配置(MCU 模式)

PA0:RGB 灯总开关,高电平使能(源码中ledRgbControl函数首行置高 PA0)

PB8/PB9:推挽输出模式,通过高低电平模拟 P9813 通信时序,无需硬件 SPI/I2C

 

04Gokit3的RGB灯源码移植

 

本次使用的驱动文件为hal_rgb_led.h和hal_rgb_led.c这两个RGB的驱动文件

头文件:hal_rgb_led.h(宏定义 + 函数声明)

源文件:hal_rgb_led.c(核心功能实现)

(1)PA0 初始化函数:rgbKeyGpioInit

void rgbKeyGpioInit(void)


244b1d04-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:实现PA0 推挽输出配置,为了兼容2.2

 

(2)延时函数:ledDelay


2471588e-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:给P9813 通信时序延时作用

 

(3)时钟生成函数:clkProduce


249151a2-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:P9813 核心时序函数,通过拉低 / 拉高 PB8 生成时钟信号,延时 40 个空循环保证时序满足 P9813 要求。

 

(4)起始帧发送函数:send32Zero


24b7fcf8-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:P9813 通信必须以 32 个 0 作为起始帧,此函数通过循环生成 32 个时钟,且 SDA 始终为低,完成起始帧发送。

 

(5)反码处理函数:takeAntiCode


24de7f4a-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:P9813 协议要求颜色数据高 2 位需传输反码,此函数提取 R/G/B 值的高 2 位并取反,是官方驱动的核心协议适配逻辑。

 

(6)32 位数据发送函数:datSend


250362c4-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:按P9813 ,逐位发送 32 位颜色数据,每发送 1 位生成 1 个时钟信号,是数据传输的核心函数。

 

(7)数据处理函数:dataDealWithAndSend


252876ea-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:将R/G/B 值组装为 P9813 要求的 32 位数据格式(标志位 + 反码 + 颜色数据),再调用datSend发送。

 

(8)RGB 初始化函数:rgbLedInit


254b4bd4-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:初始化PB8/PB9 为推挽输出,发送起始帧并将 RGB 灯初始化为灭灯状态,是驱动使用前必须调用的初始化函数。

 

(9)颜色控制函数:ledRgbControl


25778a00-fc3a-11f0-8ce9-92fbcf53809c.png

 

解析:对外提供的核心调用函数,参数为R/G/B 亮度值(0~255),调用:如果向亮什么颜色的灯就可以调用这个函数实现RGB亮灯,一个颜色的灯有255种亮度,三个颜色的灯组合起来可以实现任何颜色的亮灯。

 

05实现RGB几个颜色灯轮转效果(驱动移植)

 

整体过程:添加两个RGB驱动文件---- 工程配置好---- 调用RGB初始化函数----调用亮灯控制函数实现亮灯----- 使用delay实现简单几个颜色轮转。

 

1、驱动文件添加

将hal_rgb_led.h放入工程Inc文件夹,hal_rgb_led.c放入Src文件夹;

Keil 中添加hal_rgb_led.c到工程,并配置头文件路径(确保#include"hal_rgb_led.h"不报错)。

 

2、初始化调用

调用:rgbLedInit();实现初始化


2597aa06-fc3a-11f0-8ce9-92fbcf53809c.png

 

 

3、调用RGB亮灯函数,实现任何颜色的亮灯(需要颜色组合)

以下各种颜色为例,实现亮灯循环。


25c17d04-fc3a-11f0-8ce9-92fbcf53809c.png

 

编译烧录,观察现象,可以看到RGB灯成功驱动起来了。

 


25e7e14c-fc3a-11f0-8ce9-92fbcf53809c.png

 

 


2615a938-fc3a-11f0-8ce9-92fbcf53809c.png

 

 

本文从RGB灯的应用场景与硬件基础出发,深入剖析了板载P9813驱动芯片的工作原理,完整呈现了HAL库驱动的移植流程,并通过红绿蓝颜色轮询的实例实现,为开发者提供了从理论到实践的全流程指导,助力大家快速掌握物联网开发中RGB灯这一常用外设的驱动开发与应用技巧。

猜你喜欢
中电网移动|移动中电网|频道导航区