RT-Thread对GPIO操作两种方式的区别:1)通过设备操作接口2)直接通过通用GPIO设备驱动

在学习RT-Thread设备驱动框架时,看到潘多拉开发板的RT-Thread例程资料中的文档《AN0002-RT-Thread-通用 GPIO 设备应用笔记》有如下描述,因此产生使用文档中未使用的方式1)通过设备操作接口 方法实现GPIO操作的想法!

使用潘多拉开发板进行两种不同的对GPIO操作方式的实现,打开潘多拉开发板自带例程的例程03_basic_key,可以发现例程是使用方式2即直接通过通用GPIO设备驱动实现对GPIO的操作,因此我们需要实现方式1通过设备操作接口对GPIO的操作。

如下图所示,左边箭头为方式1,右边的箭头为方式2:

例程03_basic_key的main函数使用方式2)直接通过通用GPIO设备驱动 的代码如下:

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-08-23     balanceTWK   first implementation
 */

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

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

int main(void)
{
    unsigned int count = 1;

    /* 设置 RGB 红灯引脚的模式为输出模式 */
    rt_pin_mode(PIN_LED_R, PIN_MODE_OUTPUT);
    /* 设置 KEY0 引脚的模式为输入模式 */
    rt_pin_mode(PIN_KEY0, PIN_MODE_INPUT);

    while (count > 0)
    {
        /* 读取按键 KEY0 的引脚状态 */
        if (rt_pin_read(PIN_KEY0) == PIN_LOW)
        {
            rt_thread_mdelay(50);
            if (rt_pin_read(PIN_KEY0) == PIN_LOW)
            {
                /* 按键已被按下,输出 log,点亮 LED 灯 */
                LOG_D("KEY0 pressed!");
                rt_pin_write(PIN_LED_R, PIN_LOW);
            }
        }
        else
        {
            /* 按键没被按下,熄灭 LED 灯 */
            rt_pin_write(PIN_LED_R, PIN_HIGH);
        }
        rt_thread_mdelay(10);
        count++;
    }
    return 0;
}

现在我们使用方式1)通过设备操作接口 实现潘多拉板载绿色LED的闪烁:

/*
 * Copyright (c) 2006-2018, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2018-08-23     balanceTWK   first implementation
 */

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

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

#define PIN_DEVICE_NAME		"pin"		/* 查找的pin设备的名称 */
static rt_device_t pin_dev;				/* pin设备句柄 */

int main(void)
{
	rt_err_t res = RT_EOK;
	struct rt_device_pin_status pin_status;	/* 如果是在结构体定义时进行初始化,一定要注意元素顺序!!! */
	struct rt_device_pin_mode pin_mode;
	
	pin_status.pin = PIN_LED_G;
	pin_status.status = PIN_HIGH;
	
	pin_mode.pin = PIN_LED_G;
	pin_mode.mode = PIN_MODE_OUTPUT;
	
	/* 根据设备名称查找pin设备,获取设备句柄 */
	pin_dev = rt_device_find(PIN_DEVICE_NAME);
	if (!pin_dev)
	{
		rt_kprintf("find %s failed!\n", PIN_DEVICE_NAME);
		return RT_ERROR;
	}
	
	/* 打开设备会将ref_count的值加1,只有ref_count不为0才能对设备进行读写操作 */
	res = rt_device_open(pin_dev, RT_DEVICE_OFLAG_RDWR);
	if (res != RT_EOK)
	{
			rt_kprintf("open %s failed!\n", PIN_DEVICE_NAME);
			return RT_ERROR;
	}
	
	/* 设置pin模式 */
	res = rt_device_control(pin_dev, 0, &pin_mode);
	if (res != RT_EOK)
	{
		rt_kprintf("set %s mode failed!\n", PIN_DEVICE_NAME);
		return RT_ERROR;
	}
	
	while (1)
	{
		pin_status.status = PIN_LOW;
		rt_device_write(pin_dev, 0, &pin_status, sizeof(pin_status));
		rt_thread_mdelay(500);
		
		pin_status.status = PIN_HIGH;
		rt_device_write(pin_dev, 0, &pin_status, sizeof(pin_status));
		rt_thread_mdelay(500);
	}
}

编译后下载至开发板,发现绿灯以1HZ的频率闪烁。使用putty和开发板对应的串口进行通讯,发送list_device命令可以看到pin设备的ref_count为1表示被引用了一次。

至此,实现通过方式1)通过设备操作接口 对GPIO的操作!

猜你喜欢

转载自blog.csdn.net/weixin_43885532/article/details/109822432