STM32学习笔记一外部中断

发布者:美好回忆最新更新时间:2024-07-26 来源: elecfans关键字:STM32  学习笔记  外部中断 手机看文章 扫描二维码
随时随地手机看文章

1. STM32 外部中断简介

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

STM32F103的 19 个外部中断为:

1.jpg?imageView2/2/w/1000

触发方式: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  学习笔记  外部中断 引用地址:STM32学习笔记一外部中断

上一篇:STM32单片机简介
下一篇:STM32WB55_NUCLEO开发(6)----手机与STM32WB通过配对后进行数值比较

推荐阅读最新更新时间:2026-03-20 14:03

STM32学习笔记(六)---EXTI
EXTI: 外部中断/事件控制器 一、EXTI简介 外部中断/事件控制器包含多大23个用于产生事件/中断请求的边沿检测器。 每根输入线都可单独进行配置:选择类型(中断/事件)和相应的触发事件(上升沿、下降沿或边沿触发) 每根输入线可单独屏蔽。 注意:检测脉冲宽度低于APB2时钟宽度的外部信号 二、EXTI框图 EXITI可分为两大功能:产生中断和产生事件 1. 产生中断 红色虚线指示的流程 编号1:输入线可以通过寄存器设置为任意一个GPIO,也可以是一些外设的事件。 编号2:边沿检测电路检测到EXTI_RTSR(上边沿寄存器)或EXTI_FTSR(下边沿寄存器)有效信号就输出1无效信号输出0 编号3:或门电
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font><font color='red'>笔记</font>(六)---<font color='red'>EXTI</font>
STM32学习笔记整理之(2)——外部中断
学习STM32也快一年了,现在工作的内容跟用的是STM32平台的,趁着年前工作量比较小,总结一下STM32的基础知识,不出意外的话将会连续发布完整的笔记整理,学习的时候主要是跟着野火教程学的,然后在整理出适合自己的笔记。 2.1 NVIC配置 1、中断分组 在配置优先级的时候,NVIC 只可以配置 16 种中断向量的优先级,抢占优先级和响应优先级的数量由一个 4 位的数字来决定,把这个 4 位数字的位数分配成抢占优先级部分和响应优先级部分。 有 5 组分配方式: 第0组:所有4位用来配置响应优先级。 第1组:最高1位配抢占优先级,低3位配响应优先级。2^1=2 种抢占优先级(0,1),2^3=8 种响应优先级, 第2组:2位
[单片机]
STM32学习笔记(2):外部中断的使用
中断对于开发嵌入式系统来讲的地位绝对是毋庸置疑的,在C51单片机时代,一共只有5个中断,其中2个外部中断,2个定时/计数器中断和一个串口中断,但是在STM32中,中断数量大大增加,而且中断的设置也更加复杂。今天就将来探讨一下关于STM32中的中断系统。 1 基本概念 ARM Coetex-M3内核共支持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。STM32目前支持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使用中断优先级设置8bit中的高4位。 STM32可支持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字
[单片机]
STM32学习笔记---基于UCOSII的EXTI外部按键中断实验
继做了基于UCOSII的IWDG独立看门狗实验后,继续进行第25个实验-基于UCOSII的EXTI外部按键中断实验,此实验在基于UCOSII的IWDG实验基础上添加EXTI而来,三个按键,分别按下串口输出按键信息!在多任务下添加了IWDG独立看门狗。 //EXTI按键任务---------------------------------------- static void Task_EXTI(void* p_arg) { (void) p_arg; while(1) { //看门狗更新设置喂狗操作 IWDGSET(); TESTKEY(); OSTimeDlyHMSM(0, 0, 0, 10); }
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font><font color='red'>笔记</font>---基于UCOSII的<font color='red'>EXTI</font>外部按键中断实验
STM32学习笔记EXTI外部中断
一:EXTI(外部中断)说明 =========================================分割线========================================= 外部中断/事件控制器由19个产生事件/中断要求的边沿检测器组成。每个输入线可以独立地配置 输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以被独 立的屏蔽。挂起寄存器保持着状态线的中断要求。 =========================================分割线========================================= 19个中断如下:
[单片机]
<font color='red'>STM32</font><font color='red'>学习</font><font color='red'>笔记</font>之<font color='red'>EXTI</font>(<font color='red'>外部中断</font>)
STM32学习笔记--EXTI
1、PA0 ... PF0 共用一个中断标志 EXT0 PA1 ... PF1 共用一个中断标志 EXT1 . . . . PA15... PF15共用一个中断标志 EXT15 2、EXT5-9 共用一个中断源 EXT10-15 共用一个中断源 3、启用中断前,需ENABLE IO口的复用功能(AFIO) 4、设置中断IO口 5、将IO口注册到中断线(将IO口映射到中断线N) 例:GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource3); 将GPIOD.3注册至                          
[单片机]
stm32学习笔记之DMA详细分析
  1、DMA简介   DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。   CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。   DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。   2、DMA的工作原理   DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情
[单片机]
<font color='red'>stm32</font><font color='red'>学习</font><font color='red'>笔记</font>之DMA详细分析
STM32学习笔记(八)USART(Universal synchronous asynchronous receiver transmitter)
通用同步异步收发器 USART通讯协议 同步通讯 和 异步通讯 根据通讯的数据同步方式,又分为同步和异步两种,可以根据通讯过程中是否有使用到时钟信号进行简单的区分。 在同步通讯中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据,见下图。通讯中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。 同步通讯 在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些同步用的信号位,或者把主体数据进行打包,以数据帧的格式传输数据,见下图,某些通讯中还需要双方约定数据的传输速率,以便更好地同步 。 异步通讯 在同步通讯中,数据信号所传输的内容绝大部分就是有效数据,而异步通
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved