STM32L475潘多拉开发板RT Thread实验2_RGB_LED

一、头文件的讲述:

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

本次实验的代码中用到的头文件主要有这三个:

(1)rtthread.h

文件主要是定义一些RT Thread里常用的一些函数如线程的初始化、线程的定义、延时函数等,如图所示:

 (2)rtdevice.h

头文件主要的作用是打开一些设备,在这个实验中,我们用到的设备主要是引脚,如图:

 因为我们要使用引脚pin,所以我们会先定义一下RT_USING_PIN,表示我们打开这个设备,那么,我们要定义这个PIN就要在rtconfig.h文件里面定义,如图:

 在这个config.h中我们定义了这些设备用于本次实验。

如果我们需要使用其他设备,那么我们的步骤也是一样的,先在config.h中定义一下一些设备的名称,然后将rtdevice.h加入到main.c函数中我们就可以直接使用这些引脚的定义了。

(3)board.h

头文件主要定义的一些重要部分:

- `HARDWARE_VERSION`:硬件版本号的宏定义。

- `#include <stm32l4xx.h>:包含了 STM32L4 系列芯片的头文件。

- `#include "drv_gpio.h"` 和 `#include "drv_clock.h"`:包含了驱动 GPIO 和时钟的头文件。

- `STM32_SRAM_END`:定义了 STM32 芯片的 SRAM 的结束地址。

- `HEAP_BEGIN` 和 `HEAP_END`:定义了堆内存的起始地址和结束地址。

- `STM32_SRAM2_BEGIN` 和 `STM32_SRAM2_END`:定义了第二块 SRAM 的起始地址和结束地址。

- `STM32_SRAM2_HEAP_SIZE`:定义了第二块 SRAM 的堆内存大小。

- `rt_hw_board_init`:硬件初始化函数的声明。

- `Error_Handler`:错误处理函数的声明。

- `rt_get_cpu_id`:获取 CPU ID 的函数声明。

这个头文件用于定义硬件相关的常量和函数,以及一些与硬件操作相关的宏定义。

所以board.h主要用于配置开发板的一些内在功能定义。

(4)rtdbg.h

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>

 在这一段代码中, `DBG_TAG`:定义了一个名为 "main" 的调试标签。这个标签通常用于调试输出,可以帮助在调试输出中标识出所属的模块或文件。`DBG_LVL`:定义了一个名为 `DBG_LOG` 的调试级别。调试级别用于控制调试输出的详细程度,不同的级别可以定义不同的调试信息输出。

在rtdbg.h头文件中,主要的功能是

1. 调试输出:通过定义不同的调试级别 (`DBG_LVL`) 和调试标签 (`DBG_TAG`),可以在代码中使用 `RT_ASSERT`、`RT_DEBUG`、`RT_ERROR` 等宏来输出调试信息。这些宏可以根据调试级别和标签来控制是否输出以及输出的详细程度,从而方便调试程序。

2. 内存调试:提供了一些用于内存调试的宏,如 `RT_ASSERT` 和 `RT_DEBUG_ASSERT`,用于检查内存分配和释放时的错误情况,以避免内存泄漏和悬挂指针等问题。

3. 调试信息收集:通过定义 `RT_USING_OVERFLOW_CHECK` 和 `RT_USING_MEMTRACE` 宏,可以开启溢出检测和内存追踪功能,用于收集和分析程序运行时的数据,帮助定位问题。

4. 调试钩子函数:提供了一些钩子函数,如 `rt_debug_init_hook` 和 `rt_debug_assert_hook`,可以在特定的调试事件发生时进行回调,以实现自定义的调试处理逻辑。

二、主函数

(1)主函数使用前的一些定义:

/* 因为在开发板中,RGB是共阳极,
只有当RGB灯的引脚定义为低电平时,
对应的RGB灯才会有电势差而发光 */

/* 定义 LED 亮灭电平 */
#define LED_ON  (0)
#define LED_OFF (1)

/* 定义一个二维数组表,
_blink_tab[][3]表示定义一个元素为维数为3维的二维数组,
_blink_tab[2][2]表示第三个元素中第3个维数的值,
即LED_ON */

/* 定义 8 组 LED 闪灯表,其顺序为 R G B ,该数组为二维数组 */
static const rt_uint8_t _blink_tab[][3] =
{
    {LED_ON, LED_ON, LED_ON},    // RGB三灯全亮,此时显示白色
    {LED_OFF, LED_ON, LED_ON},    // GB灯亮,此时显示青色
    {LED_ON, LED_OFF, LED_ON},    // RB灯亮,此时显示紫色
    {LED_ON, LED_ON, LED_OFF},    // RG灯亮,此时显示黄色
    {LED_OFF, LED_OFF, LED_ON},    // B灯亮,此时显示蓝色
    {LED_ON, LED_OFF, LED_OFF},    // R灯亮,此时显示红色
    {LED_OFF, LED_ON, LED_OFF},    // G灯亮,此时显示绿色
    {LED_OFF, LED_OFF, LED_OFF},    // RGB灯全暗
};

关于一些混色的显示,我是在数字图像处理第六章彩色图像中学到的,主要的混色如图所示:

 例如,图像中R色加G色的二次色显示的是黄色,RGB三色混合的是显示白色。

(2)主函数:

int main(void)
{
    unsigned int count = 1;
    unsigned int group_num = sizeof(_blink_tab)/sizeof(_blink_tab[0]);	// 求得二维元素数组得元素个数 8 。
    unsigned int group_current;	// 定义当前元素组的索引值。

    /* 设置 RGB 灯引脚为输出模式 */
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
    rt_pin_mode(PIN_LED_G, PIN_MODE_OUTPUT);
    rt_pin_mode(PIN_LED_B, PIN_MODE_OUTPUT);

    while (count > 0)
    {
        /* 获得组编号 */
        group_current = count % group_num;	// 定义当前元素

        /* 控制 RGB 灯,分别给 R G B 三灯赋当前元素的第一、二、三维的值	*/
        rt_pin_write(PIN_LED_R, _blink_tab[group_current][0]);
        rt_pin_write(PIN_LED_G, _blink_tab[group_current][1]);
        rt_pin_write(PIN_LED_B, _blink_tab[group_current][2]);

        /* 输出 LOG 信息 */
        LOG_D("group: %d | red led [%-3.3s] | green led [%-3.3s] | blue led [%-3.3s]",
            group_current,
            _blink_tab[group_current][0] == LED_ON ? "ON" : "OFF",
            _blink_tab[group_current][1] == LED_ON ? "ON" : "OFF",
            _blink_tab[group_current][2] == LED_ON ? "ON" : "OFF");

        /* 延时一段时间 */
        rt_thread_mdelay(500);
        count++;
    }
    return 0;
}

可以看出,当前主函数的使用方式是利用 count % group_num 的到的余数作为当前元素组的索引值。然后将该索引值对应的元素值的三个维度值赋给 R G B 三引脚,使得对应的引脚的值或高或低,从而 R G B 三灯分别点亮。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值