一、前言
这一讲,我要讲的是外部中断,也不知道是太简单了还是没有人用,我没找到比较完整的关于RT-thread外部中断的教程,只发现RT-thread文档中心的PIN设备里面有提及中断相关的函数。不管怎样,我觉得外部中断平常用的还是很多的,至少我在使用RT-thread之前是经常会用到,好了,废话不多说,马上开始进入我们的教程。
源码链接
我发布的所有关于RT-thread的教程源代码都在下面这个链接里面,随着我教程的更新,新的代码也会加入进去。
教程源码下载链接:https://pan.baidu.com/s/1N2D8dM31deKIqNqaIQfPiA
提取码:7nsx
二、编程讲解
第一步:配置外部中断
从这个函数的描述我们可以很清楚的看到,只要调用上面这个函数就可以配置成外部中断脚,中断触发的方式,以及回调函数(等同于中断服务函数),而且回调函数的名称我们还可以自由定义,不像我们用裸机程序的时候,中断服务函数是已经固定了的。
第二步:使能中断
直接调用下面这个函数即可。
第三步:自己定义一个回调函数
因为RT-thread的外部中断没有固定的中断服务函数,所以我们需要自己定义一个,示例如下:
/* 自己定义一个回调函数,相当于中断服务函数 */
void IQR_HANDALE_KEY0(void *args)
{
rt_pin_write(LED0_PIN, PIN_LOW);//点亮LED0
}
三、项目实战
因为这个两个函数原本在pin.c里面就有定义,所以我们也不需要自己去写,直接调用就行了。
我这里用两个按键,KEY0按下,触发外部中断,点亮LED0,KEY1按下,熄灭LED0,示例代码如下:
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#define LED0_PIN GET_PIN(F, 9)
#define LED1_PIN GET_PIN(F, 10)
#define KEY0_PIN GET_PIN(E, 4)
#define KEY1_PIN GET_PIN(E, 3)
/* 自己定义KEY0的回调函数,相当于中断服务函数 */
void IQR_HANDALE_KEY0(void *args)
{
rt_pin_write(LED0_PIN, PIN_LOW);//点亮LED0
}
/* 自己定义KEY1的回调函数,相当于中断服务函数 */
void IQR_HANDALE_KEY1(void *args)
{
rt_pin_write(LED0_PIN, PIN_HIGH);//熄灭LED0
}
int main(void)
{
int i = 0;
/* 把LED引脚设置为输出 */
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);
/* 先把两个灯关掉 */
rt_pin_write(LED0_PIN, PIN_HIGH);
rt_pin_write(LED1_PIN, PIN_HIGH);
/* 把KEY引脚设置为输入 */
rt_pin_mode(KEY0_PIN, PIN_MODE_INPUT);
rt_pin_mode(KEY1_PIN, PIN_MODE_INPUT);
/* 绑定中断,下降沿模式,回调函数名为IQR_HANDALE_KEY0 */
rt_pin_attach_irq(KEY0_PIN, PIN_IRQ_MODE_FALLING, IQR_HANDALE_KEY0, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY0_PIN, PIN_IRQ_ENABLE);
/* 绑定中断,下降沿模式,回调函数名为IQR_HANDALE_KEY1 */
rt_pin_attach_irq(KEY1_PIN, PIN_IRQ_MODE_FALLING, IQR_HANDALE_KEY1, RT_NULL);
/* 使能中断 */
rt_pin_irq_enable(KEY1_PIN, PIN_IRQ_ENABLE);
while (1)
{
rt_pin_write(LED1_PIN, PIN_LOW);//点亮LED1
rt_thread_mdelay(1000);
rt_pin_write(LED1_PIN, PIN_HIGH);//熄灭LED1
rt_thread_mdelay(1000);
}
}
四、结束语
好了,关于外部中断的编程讲解就到这里,如果还有什么问题可以私信给我。如果需要本文对应的源码的话可以在博文前言部分的链接下载。
如果觉得这篇文章对你有用,点赞+关注支持一下博主呗。
后续我会继续更新RT-thread入门教程系列,如果感兴趣的同学可以关注一下博主,谢谢!
RT-thread相关教程汇总:https://blog.csdn.net/ShenZhen_zixian/article/details/120563891