RT-Thread零基础快速入门第5讲——外部中断

  • 03/26 07:53

一、前言

这一讲,我要讲的是外部中断,也不知道是太简单了还是没有人用,我没找到比较完整的关于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

人工客服
(售后/吐槽/合作/交友)
  • 器件型号:S29JL064J70TFI000
    • 数量 1
    • 建议厂商 Spansion
    • 器件描述 Flash, 4MX16, 70ns, PDSO48, LEAD FREE, MO-142(B)DD, TSOP-48
    • 参考价格 $6.16
    • 风险等级
    • ECAD模型
    • 数据手册
    • 查看更多信息
  • 器件型号:EPCS16SI8N
    • 数量 1
    • 建议厂商 Intel Corporation
    • 器件描述 Configuration Memory, 16MX1, Serial, CMOS, PDSO8, LEAD FREE, PLASTIC, SOIC-8
    • 参考价格 $17.33
    • 风险等级
    • ECAD模型

      ECAD模型

      下载ECAD模型
    • 数据手册
    • 查看更多信息
  • 器件型号:ASDMB-25.000MHZ-LC-T
    • 数量 1
    • 建议厂商 Abracon Corporation
    • 器件描述 MEMS OSC XO 25.0000MHZ LVCMOS
    • 参考价格 暂无数据
    • 风险等级
    • ECAD模型

      ECAD模型

      下载ECAD模型
    • 数据手册
    • 查看更多信息

相关资讯

  1. 1.
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 14.
  15. 15.
  16. 16.
  17. 17.
  18. 18.
  19. 19.
  20. 20.
查看全部20条内容