0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32学习笔记一外部中断

冬至子 来源:TECHTIMES 作者:霁风AI 2023-10-24 14:12 次阅读

1. STM32 外部中断简介

STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。代码主要分布在固件库的 stm32f10x_exti.h 和 stm32f10x_exti.c 文件。

STM32F103的 19 个外部中断为:

1.jpg

触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。

2. 外部中断分组

STM32 的每一个 GPIO 都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组。

比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0 为第一组。

依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。

图片

3. 使用 IO 口外部中断的配置步骤

3.1 初始化 IO 口为输入

设置作为外部中断输入的 IO 口的状态,可以设置为上拉 / 下拉输入 / 浮空输入,但浮空的时候外部一定要带上拉,或者下拉电阻。否则可能导致中断不停的触发。在干扰较大的地方,就算使用了内部上拉/下拉,也建议使用外部上拉/下拉电阻,这样可以一定程度防止外部干扰带来的影响。

3.2 开启 IO 口复用时钟,设置 IO 口与中断线的映射关系

STM32 的 IO 口与中断线的对应关系需要配置外部中断配置寄存器 EXTICR,这样我们要先开启复用时钟,然后配置 IO 口与中断线的对应关系。才能把外部中断与中断线连接起来。

3.3 开启与该IO口相对的线上中断/事件,设置触发条件

配置中断产生的条件,STM32 可以配置成上升沿触发,下降沿触发,或者任意电平变化触发,但是不能配置成高电平触发和低电平触发。同时要开启中断线上的中断。

注意:

如果使用外部中断,并设置该中断的 EMR 位的话,会引起软件仿真不能跳到中断,而硬件上是可以的。而不设置 EMR,软件仿真就可以进入中断服务函数,并且硬件上也是可以的。建议不要配置 EMR 位。

3.4 配置中断分组NVIC

配置中断的分组,以及使能,对 STM32 的中断来说,只有配置了 NVIC 的设置,并开启才能被执行,否则是不会执行到中断服务函数里面去的。

3.5 编写中断服务函数

这是中断设置的最后一步,中断服务函数,是必不可少的,如果在代码里面开启了中断,但是没编写中断服务函数,就可能引起硬件错误,从而导致程序崩溃!所以在开启了某个中断后,一定要记得为该中断编写服务函数。在中断服务函数里面编写你要执行的中断后的操作。

4. 例程分析

4.1 配置外部中断对应IO

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 数 名: exti_gpio_config
//    功能说明: 外部中断GPIO参数配置
//    形    参: 无
//    返 回 值: 无
//    日    期: 2020-04-25
//    备    注: 
//    作    者: by 霁风AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_gpio_config(void)
{
    GPIO_InitTypeDef gpio_init_config;

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能PORTA时钟

    gpio_init_config.GPIO_Pin       = GPIO_Pin_0;//PA0
    gpio_init_config.GPIO_Mode      = GPIO_Mode_IPD; //PA0设置成输入,默认下拉      
    GPIO_Init(GPIOA, &gpio_init_config);//初始化GPIOA.0
}

4.2 配置外部中断参数

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 数 名: exti_config
//    功能说明: 外部中断参数配置
//    形    参: 无
//    返 回 值: 无
//    日    期: 2020-04-25
//    备    注: 
//    作    者: by 霁风AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_config(void)
{
    EXTI_InitTypeDef exti_init_config;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);    //外部中断,需要使能AFIO时钟

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //PA0设置为外部中断

      exti_init_config.EXTI_Line      = EXTI_Line0;
      exti_init_config.EXTI_Mode      = EXTI_Mode_Interrupt;  
      exti_init_config.EXTI_Trigger   = EXTI_Trigger_Rising;//上升沿触发
      exti_init_config.EXTI_LineCmd   = ENABLE;

    EXTI_Init(&exti_init_config);       //根据EXTI_InitTypeDef中指定的参数初始化外设EXTI寄存器
}

4.3 配置中断向量

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 数 名: exit_nvic_config
//    功能说明: 中断向量参数配置
//    形    参: 无
//    返 回 值: 无
//    日    期: 2020-04-25
//    备    注: 
//    作    者: by 霁风AI
//---------------------------------------------------------------------------------------------------------------------------------------------
static void exti_nvic_config(void)
{
    NVIC_InitTypeDef nvic_init_config;

    nvic_init_config.NVIC_IRQChannel                    = EXTI0_IRQn;//使能按键所在的外部中断通道
    nvic_init_config.NVIC_IRQChannelPreemptionPriority  = 0x02;//抢占优先级2
    nvic_init_config.NVIC_IRQChannelSubPriority         = 0x02;//子优先级1
    nvic_init_config.NVIC_IRQChannelCmd                 = ENABLE;

    NVIC_Init(&nvic_init_config);
}

4.4 统一外部中断调用接口

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 数 名: exti_init
//    功能说明: 外部中断初始化
//    形    参:     exti_no:中断号
//    返 回 值: 无
//    日    期: 2020-04-25
//    备    注: 外部调用此函数,实现EXTI的初始化配置
//    作    者: by 霁风AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void exti_init(uint8_t exti_no)
{
    if (exti_no == 0)
    {
        exti_gpio_config();
        exti_config();
        exti_nvic_config();
    }
}

4.5 编写中断服务函数

//---------------------------------------------------------------------------------------------------------------------------------------------
//    函 数 名: EXTI0_IRQHandler
//    功能说明: 外部中断0服务函数
//    形    参: 无
//    返 回 值: 无
//    日    期: 2020-04-25
//    备    注: 
//    作    者: by 霁风AI
//---------------------------------------------------------------------------------------------------------------------------------------------
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) != RESET)  
    {
        g_exti_cnt++;

        if (g_exti_cnt % 2)
        {
            Bsp_LedOn(0);   //点亮OLED0
        }
        else 
        {
            Bsp_LedOff(0);  //熄灭OLED0
        }

        if (g_exti_cnt > 200)
        {
            g_exti_cnt = 0;
        }

        EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起
    }
}

补充:

在编写中断服务函数的时候会经常使用到两个函数。

(1)第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

这个函数一般使用在中断服务函数的开头判断中断是否发生。

(2)第二个是清除某个中断线上的中断标志位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

这个函数一般应用在中断服务函数结束之前,清除中断标志位。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354716
  • RTC
    RTC
    +关注

    关注

    2

    文章

    527

    浏览量

    66299
  • GPIO
    +关注

    关注

    16

    文章

    1196

    浏览量

    51898
  • 外部中断
    +关注

    关注

    1

    文章

    131

    浏览量

    15801
  • 中断控制器
    +关注

    关注

    0

    文章

    59

    浏览量

    9438
收藏 人收藏

    评论

    相关推荐

    STM32单片机学习笔记(8):外部中断

    利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。本项目需要实现的功能就是利用CubMX配置外部
    发表于 07-20 15:32 889次阅读
    <b class='flag-5'>STM32</b>单片机<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(8):<b class='flag-5'>外部</b><b class='flag-5'>中断</b>

    STM32学习笔记外部中断EXTI学习

    本帖最后由 飘落的叶 于 2013-4-10 10:46 编辑 STM32学习笔记外部中断EXTI
    发表于 04-10 10:46

    STM32_外部中断程序

    STM32 外部中断程序,很好的学习资料,快来下载吧
    发表于 02-15 17:09 30次下载

    STM32学习笔记——外部中断的初步了解

    STM32F103有76个中断,包括16个内核中断和60个可屏蔽中断,具有16级16级可编程的中断优先级。 理解
    发表于 11-30 01:47 841次阅读
     <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>——<b class='flag-5'>外部</b><b class='flag-5'>中断</b>的初步了解

    STM32各模块学习笔记

    STM32个模块学习笔记 目录 STM32笔记 中断
    发表于 11-30 03:32 3142次阅读

    STM32学习心得十五:外部中断实验

    记录下,方便以后翻阅~主要内容:1) 外部中断概述;2) 外部中断库函数般设置。官方资料
    发表于 11-21 17:51 15次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b>心得十五:<b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验

    Mini STM32 外部中断实验

    外部中断概述1、STM32的每个IO都可以作为外部中断输入。2、
    发表于 11-22 15:06 10次下载
    Mini <b class='flag-5'>STM32</b> <b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验

    STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTI

    STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTI
    发表于 11-26 11:36 0次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>(4)——NVIC<b class='flag-5'>中断</b>优先级管理和<b class='flag-5'>外部</b><b class='flag-5'>中断</b>EXTI

    STM32F407学习记录---外部中断实验

    STM32F407学习记录---外部中断概述STM32F4外部
    发表于 11-29 16:06 4次下载
    <b class='flag-5'>STM32</b>F407<b class='flag-5'>学习</b>记录---<b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验

    STM32外部中断实验-EXTI

    STM32 外部中断简介STM32 的每个 IO 都可以作为外部中断
    发表于 11-29 16:06 9次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>外部</b><b class='flag-5'>中断</b>实验-EXTI

    STM32学习笔记外部中断/事件

    中断基础知识异常就是中断中断就是异常。但是习惯上称系统产生的为异常,外部产生的为中断,即系统异常和外部
    发表于 12-04 17:06 7次下载
    【<b class='flag-5'>STM32</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>】<b class='flag-5'>外部</b><b class='flag-5'>中断</b>/事件

    STM32(六)-------中断外部中断

    STM32中断应用中断知识介绍STM32 中断应用概览异常NVIC优先级定义中断知识介绍
    发表于 12-04 17:21 9次下载
    <b class='flag-5'>STM32</b>(六)-------<b class='flag-5'>中断</b>(<b class='flag-5'>外部</b><b class='flag-5'>中断</b>)

    第二节: 外部中断学习(用CubeMX学习STM32)

    STM32CubeMX配置, 使用HAL库,学习STM32外部中断,hal和CubeMX学习分享
    发表于 12-05 13:06 4次下载
    第二节: <b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>学习</b>(用CubeMX<b class='flag-5'>学习</b><b class='flag-5'>STM32</b>)

    STM32_EXTI外部中断学习笔记

    单片机有两个外部中断 ,分别为外部中断0、1。用来实时地处理外部事件的种内部机制。当某种
    发表于 01-14 15:21 3次下载
    <b class='flag-5'>STM32</b>_EXTI<b class='flag-5'>外部</b><b class='flag-5'>中断</b><b class='flag-5'>学习</b><b class='flag-5'>笔记</b>

    STM32如何配置外部中断STM32外部中断配置步骤

    STM32如何配置外部中断STM32外部中断配置步骤  作为
    的头像 发表于 10-26 17:47 3367次阅读