sunsili 发表于 2021-11-28 23:03:01

【AB32VG1开发】基于RT-Thread AB32VG点亮RGB

【AB32VG1开发】基于RT-Thread AB32VG点亮RGB


[*]原理图分析
开发板上板载一个三色 RGB 彩灯


开发板引脚连接如下图,引脚 PA1(注意手册上写的PA2, 官方例程也是PA2,可以是因为V1.0板是PA2, 我拿到板是V2.0) 对应蓝灯,引脚 PE1 对应红灯,引脚 PE4 对应绿灯,RGB 为共阳极,当引脚拉低时,对应的 led 点亮

详情参阅:中科蓝讯AB32VG1开发板介绍电路原理图分析接口说明 ...
[*]创建RTT代码工程
按上节方法创建工程AB32VG1_RGB
详情参阅: 基于RT-Thread的AB32VG1开发环境搭建
[*]配置工程
打开工程RT-Thread Setting

设置要加载驱动Pin(默认是打开的如果要加载其他驱动须勾选上)

关闭RT-Thread Setting,配置好的驱动或软件包会自动添加到工程,添加过程要等待片刻
然后,更新软件包
[*]编辑源码
新建源码文件:rgb_led.c, 编辑
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date         Author       Notes
* 2021-10-01   LOJAM       the first version
*/

//#include "rgb.h"
#include <rtthread.h>
#include "board.h"

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

static RGB_Led_t Led;
/*
* 编写初始化驱动程序,调用 rt_pin_get 获取 led 句柄,通过句柄设置对应引脚模式为输
出模式
*/
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.1");
    // 设置引脚为输出方式
    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 口电平高低,点亮红灯即
拉低红灯引脚,拉高其他两个颜色灯的引脚
传入参数 on=1:对应亮, on=0:对应灭
红灯驱动
*/
void RGB_Red(rt_bool_t on)
{
    rt_pin_write(Led.LED_G, PIN_HIGH);
    rt_pin_write(Led.LED_B, PIN_HIGH);
    if (on) {
      rt_pin_write(Led.LED_R, PIN_LOW);
    }else {
      rt_pin_write(Led.LED_R, PIN_HIGH);
    }
}

//蓝灯驱动
void RGB_Blue(rt_bool_t on)
{
    rt_pin_write(Led.LED_G, PIN_HIGH);
    rt_pin_write(Led.LED_R, PIN_HIGH);
    if (on) {
      rt_pin_write(Led.LED_B, PIN_LOW);
    }else {
      rt_pin_write(Led.LED_B, PIN_HIGH);
    }
}

//绿灯驱动
void RGB_Green(rt_bool_t on)
{
    rt_pin_write(Led.LED_R, PIN_HIGH);
    rt_pin_write(Led.LED_B, PIN_HIGH);
    if (on) {
      rt_pin_write(Led.LED_G, PIN_LOW);
    }else {
      rt_pin_write(Led.LED_G, PIN_HIGH);
    }
}

//白灯驱动 全亮
void RGB_White(rt_bool_t on)
{
    if (on) {
      rt_pin_write(Led.LED_G, PIN_LOW);
      rt_pin_write(Led.LED_R, PIN_LOW);
      rt_pin_write(Led.LED_B, PIN_LOW);
    }else {
      rt_pin_write(Led.LED_R, PIN_HIGH);
      rt_pin_write(Led.LED_B, PIN_HIGH);
      rt_pin_write(Led.LED_G, PIN_HIGH);
    }
}

//2.3 编写主程序文件
//编写 rgb 彩灯运行线程,三种颜色依次切换,中间延时 1s
static void rgb_thread_entry(void* p)
{
    RGB_Init();
    while(1)
    {
      RGB_Blue(1);
      rt_thread_mdelay(1000);
      RGB_Green(1);
      rt_thread_mdelay(1000);
      RGB_Red(1);
      rt_thread_mdelay(1000);
      RGB_White(1);
      rt_thread_mdelay(1000);
    }
}

//创建线程启动函数,用于启动上一步编写的线程主体
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);
}

/*添加将线程初始化添加入系统初始化中*/
INIT_APP_EXPORT(Thread_RGB);
保存
[*]编译工程
Ctrl+B, 编译程序,无报错进行下一步,有错找错改错,再编译
上章节说明很详细,详情参阅: 基于RT-Thread的AB32VG1开发环境搭建
[*]下载工程
打开 Downloaded 下载器,通过 download 下载生成的.dcf 文件(第一次
使用前需要先安装串口驱动)
扫描串口,点击开始后,按一下板子上复位按键下载程序
上章节说明很详细,详情参阅: 基于RT-Thread的AB32VG1开发环境搭建
[*]运行程序
因为例程是添加将线程初始化添加入系统初始化中,所以下载后自动运行,依次 会亮起:蓝-绿-红-白,切换间隔1s

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


页: [1]
查看完整版本: 【AB32VG1开发】基于RT-Thread AB32VG点亮RGB