RTT-Pin设备模型

1. Pin 是什么?

Pin 设备本质上是对 MCU 的 GPIO 引脚进行统一封装。

它的作用是:不用直接操作寄存器,也能完成 LED 控制、按键读取、外部中断等功能;更换芯片时,上层应用代码通常无需大改。

2. GPIO 常见用途

  • 输出:控制 LED、蜂鸣器、继电器等。

  • 输入:读取按键、传感器状态。

  • 中断:按键状态变化时主动通知 CPU,比轮询更高效。

3. 引脚常见模式

模式 说明
PIN_MODE_OUTPUT 普通输出
PIN_MODE_OUTPUT_OD 开漏输出,常用于 I2C 等场景
PIN_MODE_INPUT 浮空输入
PIN_MODE_INPUT_PULLUP 上拉输入,按键常用
PIN_MODE_INPUT_PULLDOWN 下拉输入

使用引脚前,必须先设置模式:

复制代码
rt_pin_mode(pin, PIN_MODE_OUTPUT);

代码解析: pin 是引脚编号,PIN_MODE_OUTPUT 将该引脚配置为输出。引脚上电后的默认状态不一定符合需求,因此无论控制 LED 还是读取按键,都应先设置正确的工作模式。

4. Pin 设备模型的作用

RT-Thread 的 Pin 框架位于应用与芯片 GPIO 驱动之间:

复制代码
应用程序
   ↓
Pin 设备管理接口
   ↓
Pin 设备驱动框架
   ↓
芯片 GPIO 驱动
   ↓
硬件引脚

不同芯片厂商只需适配自己的 GPIO 驱动,上层统一使用 rt_pin_*() 接口即可。

5. 常用 API

接口 作用
rt_pin_get() 根据名称获取引脚编号
rt_pin_mode() 设置引脚模式
rt_pin_write() 设置输出电平
rt_pin_read() 读取输入电平
rt_pin_attach_irq() 绑定中断回调函数
rt_pin_irq_enable() 使能或关闭中断
rt_pin_detach_irq() 解绑中断回调函数

6. 控制 LED

复制代码
#define LED_PIN  35
​
rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
​
/* 输出高电平 */
rt_pin_write(LED_PIN, PIN_HIGH);
​
/* 输出低电平 */
rt_pin_write(LED_PIN, PIN_LOW);

代码解析: LED_PIN 是 LED 对应的 GPIO 编号;两次 rt_pin_write() 分别输出高、低电平。代码只负责改变引脚电平,LED 是否点亮取决于硬件接法:低电平点亮的板子需要用 PIN_LOW 点亮。

注意:有些开发板的 LED 是低电平点亮,实际亮灭逻辑要以原理图为准。

7. 读取按键

复制代码
#define KEY_PIN  55
​
rt_pin_mode(KEY_PIN, PIN_MODE_INPUT_PULLUP);
​
if (rt_pin_read(KEY_PIN) == PIN_LOW)
{
    /* 按键被按下 */
}

代码解析: 先把 KEY_PIN 设置为上拉输入,未按下时引脚被拉为高电平;按下后通常接地,因此读到 PIN_LOW。这种写法是轮询方式,适合简单场景,但会持续占用 CPU 查询按键状态。

按键常使用上拉输入:未按下为高电平,按下后接地变为低电平。

8. 按键中断

中断方式不需要一直循环查询按键状态。按键电平发生变化时,系统会自动执行回调函数。

复制代码
#define KEY_PIN  55
#define LED_PIN  35
​
static void key_irq_handler(void *args)
{
    rt_pin_write(LED_PIN, PIN_HIGH);
}
​
static void key_init(void)
{
    rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT);
    rt_pin_mode(KEY_PIN, PIN_MODE_INPUT_PULLUP);
​
    rt_pin_attach_irq(KEY_PIN,
                      PIN_IRQ_MODE_FALLING,
                      key_irq_handler,
                      RT_NULL);
​
    rt_pin_irq_enable(KEY_PIN, PIN_IRQ_ENABLE);
}

代码解析: key_irq_handler() 是按键中断触发后执行的回调函数;这里将 LED 输出为高电平。初始化函数先配置 LED 输出与按键上拉输入,再将按键的下降沿绑定到回调,最后使能中断。回调运行在中断上下文,应避免延时、阻塞和耗时操作;若需要复杂处理,建议在回调中通知线程。

常见中断触发方式:

  • PIN_IRQ_MODE_RISING:上升沿触发

  • PIN_IRQ_MODE_FALLING:下降沿触发

  • PIN_IRQ_MODE_RISING_FALLING:双边沿触发

  • PIN_IRQ_MODE_HIGH_LEVEL:高电平触发

  • PIN_IRQ_MODE_LOW_LEVEL:低电平触发

总结

Pin 设备模型让 GPIO 操作更加统一、简单。初学阶段重点掌握三类操作即可:

复制代码
输出控制:rt_pin_mode() + rt_pin_write()
输入读取:rt_pin_mode() + rt_pin_read()
中断处理:rt_pin_attach_irq() + rt_pin_irq_enable()
相关推荐
半仙10083 小时前
电感式编码器 IS06-18 在轮毂电机中的实战应用指南
嵌入式硬件·机器人
ACP广源盛139246256733 小时前
Ling‑3.0‑flash 昇腾 0‑Day 适配落地@ACP#IX9104 在国产高密度算力矩阵中的机遇与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件
wengqidaifeng3 小时前
2026 年电赛(TI 杯)H 题:摆杆机械结构、MaxiCamPro 测量、步进编码器与三层 PID
单片机·嵌入式硬件·mcu
振南的单片机世界4 小时前
1MΩ内阻+10pF寄生电容=信号“低通谋杀”
arm开发·stm32·单片机·嵌入式硬件
十月的皮皮5 小时前
STM32从零到量产开发:四路继电器工业控制模块开发 -上位机主窗口设计说明
c语言·stm32·单片机·stm32cubemx
wuyk5555 小时前
第1章:无刷电机核心原理与运行机制
c语言·开发语言·stm32·单片机·嵌入式硬件·机器学习
科芯创展5 小时前
XZ9164,16V,0.8A稳压LDO芯片
单片机·嵌入式硬件
WWJA王文举5 小时前
HAL库、标准库、LL库和寄存器开发有什么区别?STM32四种开发方式一次讲透
stm32·单片机·嵌入式硬件
0x3F(小茶)6 小时前
FreeRTOS 系统配置
c语言·单片机·mcu