[TOC]

RT-Thread Studio配置GPIO

1. 前言说明

1.1 本章内容

本章通过RT-Thread Studio配置AB32VG1片上外设GPIO的引脚,控制RGB彩灯进行简单的颜色变换

1.2 模块介绍

开发板上板载一个三色RGB彩灯

image-20210311201348618.png

RGB彩灯原理图如下

image-20210311201406610.png

开发板引脚连接如下图,引脚PA2对应蓝灯,引脚PE1对应红灯,引脚PE4对应绿灯,RGB为共阳极,当引脚拉低时,对应的led点亮

image-20210311201222781.png

1.3 开发软件

20210318172331.png

编译平台:RT-Thread Studio: 安装链接

下载平台:Downloader: 安装链接

2. 步骤说明

2.1 新建工程

点击 文件-> 新建-> RT-Thread项目控件

20210209213346.png

选择基于开发板的项目,填写工程名字,选择我们使用到的开发板(AB32VG1),调试器我们随便选,下载方式不是通过此处下载

20210318180626.png

注意:如果第一次使用RISC-V芯片需要安装工具链,在SDK管理器中下载工具链

20210318193859.png

然右击项目名称,进入属性

20210318194757.png

找到MCU->RISC-V ToolchainsPat ,配置Tool的环境,在软件安装位置下面的路径中

1
软件安装位置\RT-ThreadStudio\repo\Extract\ToolChain_Support_Packages\RISC-V\RISC-V-GCC\10.1.0\bin

20210318195006-1616068381724.png

工程新建后左边的项目资源管理器会显示我们的工程,我们把他展开,编译一下,编译结果如下

20210318195444.png

编译无报错,新建工程完成了!

2.2 编写RGB驱动程序文件

新建程序文件:在applications文件夹下新建立一个rgb.c和.h文件,建立后如下

20210526175354

rgb.c内写入如下程序

添加头文件,定义一个RGB结构体,并声明LED

1
2
3
4
5
6
7
8
9
10
11
12
#include "rgb.h"
#include <rtthread.h>
#include "board.h"

struct Led_s
{
uint8_t LED_R;
uint8_t LED_B;
uint8_t LED_G;
}; // 定义一个RGB结构体

struct Led_s Led;

编写初始化驱动程序,调用rt_pin_get获取led句柄,通过句柄设置对应引脚模式为输出模式

1
2
3
4
5
6
7
8
9
10
11
void RGB_Init(void)
{
// 获得led
Led.LED_R = rt_pin_get("PE.1");
Led.LED_G = rt_pin_get("PE.4");
Led.LED_B = rt_pin_get("PA.2");
// 设置引脚为输出方式
rt_pin_mode(Led.LED_R, PIN_MODE_OUTPUT);
rt_pin_mode(Led.LED_G, PIN_MODE_OUTPUT);
rt_pin_mode(Led.LED_B, PIN_MODE_OUTPUT);
}

编写rgb不同颜色点灯驱动,通过rt_pin_write来控制gpio口电平高低,点亮红灯即拉低红灯引脚,拉高其他两个颜色灯的引脚

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//传入参数 on=1:对应亮,on=0:对应灭
//红灯驱动
void RGB_Red(rt_bool_t on)
{
if (on) {
rt_pin_write(Led.LED_R, PIN_LOW);
}else {
rt_pin_write(Led.LED_R, PIN_HIGH);
}
rt_pin_write(Led.LED_G, PIN_HIGH);
rt_pin_write(Led.LED_B, PIN_HIGH);
}
//蓝灯驱动
void RGB_Blue(rt_bool_t on){
if (on) {
rt_pin_write(Led.LED_B, PIN_LOW);
}else {
rt_pin_write(Led.LED_B, PIN_HIGH);
}
rt_pin_write(Led.LED_G, PIN_HIGH);
rt_pin_write(Led.LED_R, PIN_HIGH);
}
//绿灯驱动
void RGB_Green(rt_bool_t on)
{
if (on) {
rt_pin_write(Led.LED_G, PIN_LOW);
}else {
rt_pin_write(Led.LED_G, PIN_HIGH);
}
rt_pin_write(Led.LED_R, PIN_HIGH);
rt_pin_write(Led.LED_B, PIN_HIGH);
}

2.3 编写主程序文件

编写rgb彩灯运行线程,三种颜色依次切换,中间延时1s

1
2
3
4
5
6
7
8
9
10
11
12
13
static void rgb_thread_entry(void* p)
{
RGB_Init();
while(1)
{
rt_thread_mdelay(1000);
RGB_Blue(1);
rt_thread_mdelay(1000);
RGB_Green(1);
rt_thread_mdelay(1000);
RGB_Red(1);
}
}

创建线程启动函数,用于启动上一步编写的线程主体

1
2
3
4
5
6
7
8
9
10
11
static int Thread_RGB(void)
{
rt_thread_t thread = RT_NULL;
thread = rt_thread_create("rgb", rgb_thread_entry, RT_NULL, 512, 10, 10);
if(thread == RT_NULL)
{
rt_kprintf("Thread_GRB Init ERROR");
return RT_ERROR;
}
rt_thread_startup(thread);
}

添加将线程初始化添加入系统初始化中

1
INIT_APP_EXPORT(Thread_RGB);

3. 代码验证

编译程序,可以看到无报错

20210526181957

编译完成,打开Downloaded下载器,通过download下载生成的.dcf文件(第一次使用前需要先安装串口驱动)

20210324092249.png

扫描串口,点击开始后,按一下板子上复位按键下载程序

20210324103700.png

程序现象

rgb

4. 章节总结

本章节我们学会了如何在RT-Thread上配置GPIO口,总的来说GPIO的使用步骤很简单,第一步获取对应GPIO句柄,第二步配置GPIO模式,之后就可以调用rtt函数对GPIO进行读写操作了!

wechat