1、绑定中断回调函数
可检测引脚的电平变化而自动进入中断,调用我们编写的中断回调函数。
#define PIN_IRQ_MODE_RISING 0x00 /* 上升沿触发 */
#define PIN_IRQ_MODE_FALLING 0x01 /* 下降沿触发 */
#define PIN_IRQ_MODE_RISING_FALLING 0x02 /* 边沿触发(上升沿和下降沿都触发)*/
#define PIN_IRQ_MODE_HIGH_LEVEL 0x03 /* 高电平触发 */
#define PIN_IRQ_MODE_LOW_LEVEL 0x04 /* 低电平触发 */
rt_err_t rt_pin_attach_irq( rt_int32_t pin,
rt_uint32_t mode,
void (*hdr)(void *args),
void *args
);
参数 | 描述 |
---|---|
pin | 引脚编号 |
mode | 中断触发模式,上升沿、下降沿、双边沿、高电平、低电平; |
hdr | 中断回调函数,用户需要自行定义这个函数 |
args | 中断回调函数的参数,不需要时设置为 RT_NULL |
返回 | —— |
RT_EOK | 绑定成功 |
错误码 | 绑定失败 |
2、使能中断,别忘了
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 | 使能成功 |
错误码 | 使能失败 |
3、脱离中断回调函数
脱离后,不会进入之前绑定的回调函数了,中断仍然处于使能的状态。
可再次调用中断绑定函数,绑定其他中断回调函数。
rt_err_t rt_pin_detach_irq(rt_int32_t pin);
4、代码
- 程序开始运行,串口提示KEY0、KEY1中断绑定成功;
- 按下KEY0,蜂鸣器响,串口提示key0_beep_on()脱离、led0_on()绑定;
- 再次按KEY0,LED0亮代表切换到led0_on这个中断回调函数了;
- 按下KEY1,蜂鸣器停止;
P.S. 没有消抖,因为重点不在这里,有关按键的使用,短按、长按、长按几秒什么的以后专门写一篇。
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define LED0_PIN GET_PIN(F, 9)
#define BEEP_PIN GET_PIN(F, 8)
#define KEY0_PIN GET_PIN(E, 4)
#define KEY1_PIN GET_PIN(E, 3)
void led0_on()
{
rt_pin_write(LED0_PIN, PIN_LOW);
}
void led0_off()
{
rt_pin_write(LED0_PIN, PIN_HIGH);
}
void key0_beep_on()
{
rt_pin_write(BEEP_PIN, PIN_HIGH);
rt_kprintf("KEY0中断回调函数key0_beep_on()脱离\n");
rt_pin_detach_irq(KEY0_PIN);
rt_kprintf("KEY0中断回调函数led0_on()绑定\n");
rt_pin_attach_irq(KEY0_PIN, PIN_IRQ_MODE_FALLING, led0_on, RT_NULL);
}
void beep_off()
{
rt_pin_write(BEEP_PIN, PIN_LOW);
}
int main(void)
{
rt_err_t pin_irq_status;
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
led0_off();
rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(KEY0_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT_PULLUP);
rt_pin_attach_irq(KEY0_PIN, PIN_IRQ_MODE_FALLING, key0_beep_on, RT_NULL);
rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, beep_off, RT_NULL);
pin_irq_status = rt_pin_irq_enable(KEY0_PIN, PIN_IRQ_ENABLE);
if(pin_irq_status != RT_EOK){
rt_kprintf("KEY0绑定中断错误,错误代码:%d\n",pin_irq_status);
}else{
rt_kprintf("KEY0绑定中断成功\n");
}
pin_irq_status = rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
if(pin_irq_status != RT_EOK){
rt_kprintf("KEY1绑定中断错误,错误代码:%d\n",pin_irq_status);
}else{
rt_kprintf("KEY1绑定中断成功\n");
}
}