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() 读取引脚电平

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值