3.2 点亮RGB灯
一、实验目的
本节课主要学习K210的高速GPIOHS,点亮RGB灯。
二、实验准备
1.实验元件
RGB灯
2.元件特性
RGB灯可以点亮红色、绿色、蓝灯等颜色,再根据红色绿色蓝色的不同亮度组合成其他颜色,例如黄色、紫色等。
3.硬件连接
K210开发板出厂默认已经焊接好RGB灯。RGB灯R连接的是IO6,G连接的是IO7, B连接的是IO8。
4.SDK中对应API功能
对应的头文件 gpiohs.h
高速goiohs总共有32个,可配置输入输出模式,可配置上拉下拉或高阻,每个IO都有单独的中断源,中断支持边沿和电平触发,每个IO都可以自由分配到FPIOA上的48个引脚之一。
为用户提供以下接口:
• gpiohs_set_drive_mode:设置输入输出模式
• gpiohs_set_pin:设置引脚电平
• gpiohs_get_pin:读取引脚电平
• gpiohs_set_pin_edge:设置中断触发电平
• gpiohs_set_irq (0.6.0 后不再支持,请使用gpiohs_irq_register)
• gpiohs_irq_register:注册引脚中断服务
• gpiohs_irq_unregister:注销引脚中断
三、实验原理
RGB灯内部是由三颗颜色分别为红色、绿灯和蓝色的LED组成,所以发光原理与LED是一样的。不同的是三颗LED灯靠得很近,这样就可以设置不同的颜色,来达到展示不同颜色的功能。
四、实验过程
1. 首先根据上面的硬件连接引脚图,K210的硬件引脚和软件功能使用的是FPIOA映射关系。
这里要注意的是程序里操作的都是软件引脚,所以需要先把硬件引脚映射成软件GPIO功能,操作的时候直接操作软件GPIO即可。
2.在使用RGB灯前需要初始化,也就是把RGB灯的软件GPIO设置为输出模式。
3.然后关闭RGB灯,同样是设置RGB灯的GPIO为高电平则可以让RGB灯熄灭。
4.最后在while循环中每0.5秒修改state的值,从而改变RGB灯的颜色,由于不清楚具体上一次亮的是哪个灯,所以在每次设置灯的颜色前都把RGB灯关闭。state = state % 3;语句的功能是把state的值限制为0,1,2,刚好与软件GPIO对应。
5.编译调试,烧录运行
把本课程资料中的gpiohs_rgb复制到SDK中的src目录下,
然后进入build目录,运行以下命令编译。
cmake .. -DPROJ=gpiohs_rgb -G "MinGW Makefiles"
make
编译完成后,在build文件夹下会生成gpiohs_rgb.bin文件。
使用type-C数据线连接电脑与K210开发板,打开kflash,选择对应的设备,再将程序固件烧录到K210开发板上。
五、实验现象
RGB灯会亮红灯,0.5秒后亮绿灯,再0.5秒后亮蓝灯,接着0.5秒后再亮红灯,以此循环,每0.5秒切换一次颜色。
六、实验总结
1.RGB灯与 LED灯的点亮原理是一样的。
2.高速gpiohs每个IO都有单独的中断源,而通用gpio是共享一个总中断源的。
附:API
对应的头文件 gpiohs.h
设置GPIO驱动模式。
void gpiohs_set_drive_mode(uint8_t pin, gpio_drive_mode_t mode)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
mode | GPIO驱动模式 | 输入 |
无。
设置GPIO管脚值。
void gpiohs_set_pin(uint8_t pin, gpio_pin_value_t value)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
value | GPIO值 | 输入 |
无。
获取GPIO管脚值。
gpio_pin_value_t gpiohs_get_pin(uint8_t pin)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
获取的GPIO管脚值。
设置高速GPIO中断触发模式。
void gpiohs_set_pin_edge(uint8_t pin, gpio_pin_edge_t edge)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
edge | 中断触发方式 | 输入 |
无。
设置高速GPIO的中断回调函数。
void gpiohs_set_irq(uint8_t pin, uint32_t priority, void(*func)());
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
priority | 中断优先级 | 输入 |
func | 中断回调函数 | 输入 |
无。
设置高速GPIO的中断回调函数。
void gpiohs_irq_register(uint8_t pin, uint32_t priority, plic_irq_callback_t callback, void *ctx)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
priority | 中断优先级 | 输入 |
plic_irq_callback_t | 中断回调函数 | 输入 |
ctx | 回调函数参数 | 输入 |
无。
注销GPIOHS中断。
void gpiohs_irq_unregister(uint8_t pin)
参数名称 | 描述 | 输入输出 |
pin | GPIO管脚 | 输入 |
无。
相关数据类型、数据结构定义如下:
· gpio_drive_mode_t:GPIO驱动模式。
· gpio_pin_value_t:GPIO值。
· gpio_pin_edge_t:GPIO边沿触发模式。
GPIO驱动模式。
typedef enum _gpio_drive_mode
{
GPIO_DM_INPUT,
GPIO_DM_INPUT_PULL_DOWN,
GPIO_DM_INPUT_PULL_UP,
GPIO_DM_OUTPUT,
} gpio_drive_mode_t;
成员名称 | 描述 |
GPIO_DM_INPUT | 输入 |
GPIO_DM_INPUT_PULL_DOWN | 输入下拉 |
GPIO_DM_INPUT_PULL_UP | 输入上拉 |
GPIO_DM_OUTPUT | 输出 |
GPIO 值。
typedef enum _gpio_pin_value
{
GPIO_PV_LOW,
GPIO_PV_HIGH
} gpio_pin_value_t;
成员名称 | 描述 |
GPIO_PV_LOW | 低 |
GPIO_PV_HIGH | 高 |
高速GPIO边沿触发模式。
typedef enum _gpio_pin_edge
{
GPIO_PE_NONE,
GPIO_PE_FALLING,
GPIO_PE_RISING,
GPIO_PE_BOTH,
GPIO_PE_LOW,
GPIO_PE_HIGH = 8,
} gpio_pin_edge_t;
成员名称 | 描述 |
GPIO_PE_NONE | 不触发 |
GPIO_PE_FALLING | 下降沿触发 |
GPIO_PE_RISING | 上升沿触发 |
GPIO_PE_BOTH | 双沿触发 |
GPIO_PE_LOW | 低电平触发 |
GPIO_PE_HIGH | 高电平触发 |