使用RTT的引脚中断功能,按键触发中断,进而控制LED亮灭

接口函数

绑定引脚中断回调函数

若要使用到引脚的中断功能,可以使用如下函数将某个引脚配置为某种中断触发模式并绑定一个中断回调函数到对应引脚,当引脚中断发生时,就会执行回调函数:

  1. rt_err_t rt_pin_attach_irq(rt_int32_t pin, rt_uint32_t mode,
  2. void (*hdr)(void *args), void *args);
参数 描述
pin 引脚编号
mode 中断触发模式
hdr 中断回调函数,用户需要自行定义这个函数
args 中断回调函数的参数,不需要时设置为 RT_NULL
返回 ——
RT_EOK 绑定成功
错误码 绑定失败

中断触发模式 mode 可取如下 5 种宏定义值之一:

  1. #define PIN_IRQ_MODE_RISING 0x00 /* 上升沿触发 */
  2. #define PIN_IRQ_MODE_FALLING 0x01 /* 下降沿触发 */
  3. #define PIN_IRQ_MODE_RISING_FALLING 0x02 /* 边沿触发(上升沿和下降沿都触发)*/
  4. #define PIN_IRQ_MODE_HIGH_LEVEL 0x03 /* 高电平触发 */
  5. #define PIN_IRQ_MODE_LOW_LEVEL 0x04 /* 低电平触发 */

使能引脚中断

绑定好引脚中断回调函数后使用下面的函数使能引脚中断:

  1. rt_err_t rt_pin_irq_enable(rt_base_t pin, rt_uint32_t enabled);
参数 描述
pin 引脚编号
enabled 状态,可取 2 种值之一:PIN_IRQ_ENABLE(开启),PIN_IRQ_DISABLE(关闭)
返回 ——
RT_EOK 使能成功
错误码 使能失败

脱离引脚中断回调函数

可以使用如下函数脱离引脚中断回调函数:

  1. rt_err_t rt_pin_detach_irq(rt_int32_t pin);
参数 描述
pin 引脚编号
返回 ——
RT_EOK 脱离成功
错误码 脱离失败

引脚脱离了中断回调函数以后,中断并没有关闭,还可以调用绑定中断回调函数再次绑定其他回调函数。

读取引脚电平

读取引脚电平的函数如下所示:

  1. int rt_pin_read(rt_base_t pin);
参数 描述
pin 引脚编号
返回 ——
PIN_LOW 低电平
PIN_HIGH 高电平

上机实验

image.png

  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <board.h>
  4. #define GPIONum_LED GET_PIN(C, 2) //获取C2引脚号
  5. #define GPIONum_KEY GET_PIN(A, 0) //获取A0引脚号
  6. rt_bool_t LED_flag = PIN_HIGH;
  7. /* 中断回调函数 */
  8. void LED_on_off(void *args)
  9. {
  10. rt_kprintf("Change LED!\n");
  11. LED_flag = ~LED_flag;
  12. rt_pin_write(GPIONum_LED, LED_flag);
  13. }
  14. int main(void)
  15. {
  16. /* LED引脚为输入模式 */
  17. rt_pin_mode(GPIONum_LED, PIN_MODE_OUTPUT);
  18. rt_pin_write(GPIONum_LED, LED_flag);
  19. /* 按键引脚为输入模式 */
  20. rt_pin_mode(GPIONum_KEY, PIN_MODE_INPUT_PULLUP);
  21. /* 绑定中断,下降沿模式,回调函数名为LED_on */
  22. rt_pin_attach_irq(GPIONum_KEY, PIN_IRQ_MODE_FALLING, LED_on_off, RT_NULL);
  23. /* 使能中断 */
  24. rt_pin_irq_enable(GPIONum_KEY, PIN_IRQ_ENABLE);
  25. }

因为不需要使用到额外的线程,初始化直接在mian主线程中进行