加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 一、前言
    • 二、编程讲解
    • 三、项目实战
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

03/26 07:53
2463
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
LAN8742AI-CZ 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER

ECAD模型

下载ECAD模型
$2.57 查看
H11G1 1 Motorola Mobility LLC 1 CHANNEL DARLINGTON OUTPUT OPTOCOUPLER
$0.89 查看
FOD817ASD 1 onsemi 4-Pin DIP Phototransistor Optocouplers, 1000-REEL

ECAD模型

下载ECAD模型
$0.52 查看

相关推荐

电子产业图谱