rtt——PIN设备的使用

freertos

RT-thread通过PIN设备对芯片的GPIO引脚进行管理,我们可以通过rtt它提供的一系列PIN设备管理接口来操作GPIO

rt_pin_get

在rtt中的引脚编号和芯片上的引脚号并不是一个概念,所以在操作PIN设备前,我们需要使用引脚编号来指定对哪个引脚进行操作。通常有3种方式获得引脚编号:调用API、宏定义、查看PIN驱动文件。

调用API

使用rt_pin_get函数获取引脚编号

pin_num = rt_pin_get("PA.3");

宏定义

#define LED GET_PIN(A,3)

查看PIN驱动文件

pin的驱动文件在drivers/drv_gpio.c中

我们从PA0往后依次类推即可

rt_pin_mode

设置引脚输出/输出模式,共有五种模式:推挽输出、开漏输出、输入、上拉输入、下拉输入

引脚在使用前需要先设置好输入输出模式

rt_pin_mode(rt_base_t pin, rt_base_t mode);
// pin为引脚编号、mode为引脚模式

rt_pin_write

设置引脚输出的电平状态

void rtt_pin_write(rt_base_t pin, rt_base_t value);
// pin引脚编号,value输出的电平值:PIN_HIGH 高电平、PIN_LOW低电平

rt_pin_read

读取输入的引脚状态

int rt_pin_read(rt_base_t pin);
// 返回值:引脚状态PIN_HIGH 高电平、PIN_LOW低电平,pin引脚编号

rt_pin_attach_irq

绑定中断回调函数
引脚的中断触发方式一共5种:下降沿、上升沿、高电平、低电平、双边沿

rt_err_t rt_pin_attach_pin(rt_basr_t pin. rt_uint32_t mode, void (*hdr)(void *aegs), void *args);
// rt_err_t:返回结果,绑定成功:RT_EOK;绑定失败:返回错误码
// pin 引脚编号,mode 中断触发方式,void (*hdr)(void *aegs) 中断函数,void *args 函数参数,不设置为RT_NULL

rt_pin_detach_irq

脱离引脚中断回调函数,如果想要不在进入中断函数或更换中断回调方式可以使用这个函数操作

rt_err_t rt_pin_detach_irq(rt_base_t pin);

调用这个函数,虽然脱离了中断回调函数,但是中断还是使能的,可以更换其他的中断函数

rt_pin_enable_irq

使能中断,打开或关闭引脚的中断

rt_err_t rt_pin_enable_irq(rt_base_t pin, rt_uint32_t enabled);
// enabled:PIN_IRQ_ENABLE 开启中断,PIN_IRQ_DISABLE 关闭中断

练习

使用中断方式,实现按键按下时点亮LED

/*
 * Copyright (c) 2006-2025, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-03-10     RT-Thread    first version
 */

#include <rtthread.h>
#include "rtdevice.h"
#include "drv_common.h"
#include <rtdbg.h>

#define DBG_TAG "main"
#define DBG_LVL DBG_LOG
// 定义LED的引脚编号
#define LED_Y GET_PIN(H, 10)
// 定义按键K1的引脚编号
#define KEY1 GET_PIN(A, 0)

/* KEY1的中断回调函数 */
void Key1_irq(void *args)
{
    if(rt_pin_read(KEY1) == PIN_HIGH)
        rt_pin_write(LED_Y, PIN_LOW);
    else {
        rt_pin_write(LED_Y, PIN_HIGH);
    }
}

int main(void)
{
    int count = 1;

    /* 设置引脚的模式 */
    rt_pin_mode(LED_Y, PIN_MODE_OUTPUT);
    rt_pin_write(LED_Y, PIN_HIGH);

    /* 按键中断配置 */
    rt_pin_attach_irq(KEY1, PIN_IRQ_MODE_RISING_FALLING, Key1_irq, RT_NULL);
    /* 开启中断 */
    rt_pin_irq_enable(KEY1, PIN_IRQ_ENABLE);

    while (count++)
    {

    }

    return RT_EOK;
}

相关文章

rtt——线程间通信(互斥量)

互斥量的概念 在 RT-Thread 中,互斥量(Mutex,互斥锁)用于确保共享资源在任意时刻只被一个线程访问 - **确保共享资源的互斥访问**:互斥量用于保护对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源;避免多个线程同时修改共享资源而导致的数据不一致或竞态条件 - 实现临界区保护:互斥量通常用于实现临界区保护,将对共享资源的访问限制在临界区内。**只有获取了互斥量的线程...

freertos

rtt——线程间通信(消息队列)

**消息队列是一种线程间的通信方式,是邮箱的扩展** 消息队列的工作机制 消息队列能够接收来自线程或中断服务例程中**不固定长度的消息**,**并把消息缓存在自己的内存空间中**。其他线程也能够从消息队列中读取相应的消息,而当消息队列为空时,可挂起读取线程。当有新的消息到达时,挂起的线程将被唤醒为接收并处理消息 **消息队列是一种异步的通信方式** 通常将先进入消息队列的消息先传给线程...

freertos

rtt——线程间的通信(邮箱)

邮箱 **邮箱是实时操作系统中的一种典型的线程间的通信方式** **邮箱的通信方式除了可以一对一,也可以一对多通信,或者多对多通信** 邮箱的工作机制 在RT-thread操作系统中,邮箱是开销较低、效率较高的一种线程间通信方式。 **邮箱中的每一封邮件的容量固定为4字节(刚好容下一个32位系统的指针)** 线程或中断服务程序把一封长度为4字节的邮件发送到指定邮箱中,而其他一...

freertos