在学习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表示被引用了一次。
扫描二维码关注公众号,回复:
12410164 查看本文章

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