rtthread studio与正点原子apollo[2]--PIN设备
前言
本文介绍RT-Thread设备管理中PIN设备的使用方法,以按键控制LED灯为例,说明IO端口的定义、工作模式及终端的相关内容。
一、apolloLED与按键电路
apollo的LED电路如下图所示:
apollo主板有三个LED灯,PWR为电源指示灯,当主板上电是自动点亮,LED0和LED1分别连接到芯片的PB1和PB0,由图可知,当对应的IO口输出低电平时,灯会点亮,输出高电平时灯会熄灭。
LED0---------PB1
LED1---------PB0
按键电路如下图所示:
apollo主板上有四个按键,其中KEY_UP按下时,IO引脚电平会变高,可以作为系统唤醒按键使用;KEY0、KEY1、KEY2为普通按键,IO口使用内部上拉使电平为高,当有按键按下时,电平会由高变低。
KEY_UP---------PA0
KEY0 ---------PH3
KEY1 ---------PH2
KEY3 ---------PC13
本文使用按键KEY0控制LED0。
二、RT-Thread中使用PIN设备
关于RT-Thread中PIN设备的使用可以参考官方文档
https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pin/pin
1.IO配置
(1)IO宏定义
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#define LED0 GET_PIN(B,1)
#define KEY0 GET_PIN(H,3)
<rtthread.h>:RT-Thread内核头文件
<board.h>:开发板相关硬件的头文件
<rtdevice.h>:使用RT-thread的硬件定义
(2)IO口模式配置
rt_pin_mode(LED0,PIN_MODE_OUTPUT);//LED灯配置为输出模式
rt_pin_mode(KEY0,PIN_MODE_INPUT_PULLUP);//按键配置为输出模式,并内部上拉
(3)按键中断配置
//按键下降沿触发中断,回调函数名KEY0_IRQ
rt_pin_attach_irq(KEY0, PIN_IRQ_MODE_FALLING, KEY0_IRQ, RT_NULL);
回调函数定义
void KEY0_IRQ(void *args)
{
rt_thread_mdelay(20);//按键消抖
if(rt_pin_read(KEY0) == 0)//读取按键电平
{
rt_sem_release(key_sem);//释放信号量
}
}
等待信号量释放后改变LED灯的状态。
.完整工程代码
代码如下:
#include <rtthread.h>
#include <board.h>
#include <rtdevice.h>
#define KEY0 GET_PIN(H,3)
#define LED0 GET_PIN(B,1)
static char thread1_stack[1024];
static struct rt_thread thread1;
static rt_sem_t key_sem=RT_NULL;
rt_uint8_t beepsta=0;
void KEY0_IRQ(void *arg)
{
rt_thread_mdelay(20);
if(rt_pin_read(KEY0)==0)
{
rt_sem_release(key_sem);
}
}
static void thread1_entry(void *param)
{
rt_pin_mode(KEY0,PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(KEY0, PIN_IRQ_MODE_FALLING, KEY0_IRQ, RT_NULL);
rt_pin_irq_enable(KEY0, PIN_IRQ_ENABLE);
rt_pin_mode(LED0,PIN_MODE_OUTPUT);
rt_pin_write(LED0, PIN_HIGH);
while(1)
{
if(rt_sem_take(key_sem,RT_WAITING_FOREVER)==RT_EOK)
{
if(beepsta==0)
{
rt_pin_write(LED0, PIN_LOW);
beepsta=1;
}
else if (beepsta==1)
{
rt_pin_write(LED0, PIN_HIGH);
beepsta=0;
}
}
}
}
int IO_init(void)
{
rt_thread_init(&thread1,"thread1",thread1_entry,RT_NULL,&thread1_stack[0],sizeof(thread1_stack),20,10);
rt_thread_startup(&thread1);
key_sem=rt_sem_create("key_sem", 0, RT_IPC_FLAG_FIFO);
return 0;
}
总结
本文介绍了RT-Thread对apollo IO口的配置及使用,主要功能函数如下:
(1)设置PIN设备的模式:rt_pin_mode()–设置引脚模式
(2)IO口中断:rt_pin_attach_irq()–绑定引脚中断回调函数
rt_pin_irq_enable()–使能引脚中断
(3)IO口读写函数:
rt_pin_write() 设置引脚电平
rt_pin_read() 读取引脚电平