开发环境:
IDE:RT-Thread Studio 2.2.7
开发板:HPM5300EVK
我相信大多数学习嵌入式的朋友学习单片机的第一个程序都是点灯,毕竟点灯简单嘛,操作下GPIO即可。当然,本教程的第一个应用也从GPIO的使用开始。
1 RT-Thread PIN设备驱动简介
RT-Thread 提供了一套简单的 I/O 设备模型框架,如下图所示。
它位于硬件和应用程序之间,共分成三层,从上到下分别是 I/O 设备管理层、设备驱动框架层、设备驱动层。
应用程序通过 I/O 设备管理接口获得正确的设备驱动,然后通过这个设备驱动与底层 I/O 硬件设备进行数据(或控制)交互。关于I/O模型的详细描述请参看RT-Thread官方手册。
I/O设备模型:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device
PIN设备属于Miscellaneous类型,在驱动文件pin.c中的rt_device_pin_register()函数可以看到其注册的设备类型,PIN设备是很多驱动的基础,其他驱动的开发还会依赖PIN设备,比如软件I2C的驱动就是在PIN设备的基础上开发的。
应用程序通过 RT-Thread 提供的 PIN 设备管理接口来访问 GPIO,相关接口如下所示:
函数 |
描述 |
---|
rt_pin_get() |
获取引脚编号 |
rt_pin_mode() |
设置引脚模式 |
rt_pin_write() |
设置引脚电平 |
rt_pin_read() |
读取引脚电平 |
rt_pin_attach_irq() |
绑定引脚中断回调函数 |
rt_pin_irq_enable() |
使能引脚中断 |
rt_pin_detach_irq() |
脱离引脚中断回调函数 |
关于PIN驱动API的详细描述请参看以下内容:
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pin/pin
2 PIN设备使用实例之按键
笔者这里使用的是HPM5300EVK开发板,MCU资源很丰富,HPM5300EVK的用户LED已经在主线程中使用了,因此这里就用户按键来举例说明如何使用PIN设备。
首先看下电路图:
当然不同开发板,其引脚可能不同,请根据具体情况使用。由以上电路图可以看到,当PA0输入低电平,表示按键按下,反之亦然。
核心代码如下:
/**
******************************************************************************
* [url=home.php?mod=space&uid=1455510]@file[/url] task.c
* [url=home.php?mod=space&uid=40524]@author[/url] BruceOu
* [url=home.php?mod=space&uid=644434]@version[/url] V1.0
* @date 2023-12-23
* [url=home.php?mod=space&uid=2676013]@blog[/url] https://blog.bruceou.cn/
* [url=home.php?mod=space&uid=3179494]@Official[/url] Accounts 嵌入式实验楼
* [url=home.php?mod=space&uid=2666770]@Brief[/url] Key
******************************************************************************
*/
/*Includes**********************************************************************/
#include <rtthread.h>
#include <rtdevice.h>
#include "hpm_common.h"
#include "hpm_soc.h"
#include <drv_gpio.h>
#define THREAD_PRIORITY 7
#define THREAD_STACK_SIZE 512
#define THREAD_TIMESLICE 3
/* defined the KEY pin: PA9 */
#define PIN_KEY GET_PIN(A, 9)
static rt_thread_t key_tid = RT_NULL;
/* 按键检测线程入口函数*/
static void key_thread_entry(void *parameter)
{
static rt_uint8_t key_up = 1; /* 按键松开标志 */
/* 初始化按键 */
rt_pin_mode(PIN_KEY, PIN_MODE_INPUT);
while (1)
{
/* 检测按键是否按下 */
if (key_up && (rt_pin_read(PIN_KEY) == PIN_LOW) )
{
rt_thread_mdelay(50); /* 延时消抖*/
key_up = 0;
if (rt_pin_read(PIN_KEY) == PIN_LOW)
{
/* 按键KEY按下,按键按下处理*/
rt_kprintf("KEY pressed!\n");
}
}
else if((rt_pin_read(PIN_KEY) == PIN_HIGH) )
{
key_up = 1; /* 按键已松开 */
}
rt_thread_mdelay(100);
}
}
/* 线程初始化*/
int key_init(void)
{
/* 创建线程,名称是 key_thread,入口是 key_thread*/
key_tid = rt_thread_create("key_thread",
key_thread_entry,
RT_NULL,
THREAD_STACK_SIZE,
THREAD_PRIORITY,
THREAD_TIMESLICE);
/* 如果获得线程控制块,启动这个线程 */
if (key_tid != RT_NULL)
rt_thread_startup(key_tid);
return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(key_init, key init);
构建并下载程序,并使用msh 命令初始化KEY线程,按下按键,则可以看到串口终端输出以下信息:
当然啦,在finsh输入list device可以查到注册到RT-Thread的PIN设备: