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()