RT_Thread_PIN中断

官方资料:PIN设备 (rt-thread.org)

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");
	}
	
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值