RT-Thread引脚基础管理及IO模型
1、PIN管理
1.1 PIN设备简介
芯片上的引脚一般分为 4 类:电源、时钟、控制与 Input/Output。
I/O 口在使用模式上又分为通用I/O(General Purpose Input Output,即GPIO)、复用 I/O(如 SPI/I2C/UART 等),引脚的功能特性和裸机编程相同。
1.2 访问PIN设备
RT-Thread提供以下接口访问引脚:
函数 | 描述 |
---|---|
rt_pin_mode() | 设置引脚模式 |
rt_pin_write() | 设置引脚电平 |
rt_pin_read() | 读取引脚电平 |
rt_pin_attach_irq() | 绑定引脚中断回调函数 |
rt_pin_irq_enable() | 使能引脚中断 |
rt_pin_detach_irq() | 脱离引脚中断回调函数 |
1.2.1 获取引脚编号
RT-Thread 提供的引脚编号需要和芯片的引脚号区分开来,它们并不是同一个概念,引脚编号由 PIN 设备驱动程序定义,和具体的芯片相关。有2种方式可以获取引脚编号:
- 使用宏定义
如果使用 rt-thread/bsp/stm32 目录下的 BSP 则可以使用下面的宏获取引脚编号:
GET_PIN(port, pin)
例如在潘多拉开发板点亮红色LED,对着引脚PE7,则
#define LEDR_PIN GET_PIN(E, 7)
- 查看驱动文件
查看 PIN 驱动代码 drv_gpio.c
文件确认引脚编号。此文件里有一个数组存放了每个 PIN 脚对应的编号信息,如下所示:
#if defined(GPIOE)
__STM32_PIN(64, E, 0),
__STM32_PIN(65, E, 1),
__STM32_PIN(66, E, 2),
__STM32_PIN(67, E, 3),
__STM32_PIN(68, E, 4),
__STM32_PIN(69, E, 5),
__STM32_PIN(70, E, 6),
__STM32_PIN(71, E, 7),
……
以我们的红色LED PE7为例,其端口号为E,引脚号为7,对应上述的__STM32_PIN(71, E, 7)
,则其引脚编号为71。
1.2.2 设置引脚模式
引脚在使用前需要先设置好工作模式,通过如下函数完成:
void rt_pin_mode(rt_base_t pin, rt_base_t mode);
//pin为引脚编号
//mode为工作模式
RT-Thread 支持的引脚工作模式可取如下所示的 5 种宏定义值之一:
#define PIN_MODE_OUTPUT 0x00 /* 输出 */
#define PIN_MODE_INPUT 0x01 /* 输入 */
#define PIN_MODE_INPUT_PULLUP 0x02 /* 上拉输入 */
#define PIN_MODE_INPUT_PULLDOWN 0x03 /* 下拉输入 */
#define PIN_MODE_OUTPUT_OD 0x04 /* 开漏输出 */
1.2.3 设置引脚电平
设置引脚输出电平的函数如下所示:
void rt_pin_write(rt_base_t pin, rt_base_t value);
//pin:引脚编号
//value:电平逻辑值,可取 2 种宏定义值之一:PIN_LOW 或PIN_HIGH
1.2.4 读取引脚电平
读取引脚电平的函数如下所示:
int rt_pi