在学习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的操作!