精华内容
下载资源
问答
  • STM32 中断实验

    2020-06-17 21:58:28
    STM32支持19个外部中断请求,也即有19根中断线来响应 线 0~15:对应外部 IO 口的输入中断。 这16根线每根对应7个IO口,从A~G,号码与线号对应,但每次只能连接到一个IO口上 线 16:连接到 PVD 输出。 补充 PVD = ...

    实验目的: 对系统中断的过程有一个大概的了解,能够自主写出代码控制各IO口的中断信息;应用目的通
    过板载的 4 个按键,控制板载的两个 LED 的亮灭以及蜂鸣器的发声。

    简介
    STM32支持19个外部中断请求,也即有19根中断线来响应

    线 0~15:对应外部 IO 口的输入中断。
    这16根线每根对应7个IO口,从A~G,号码与线号对应,但每次只能连接到一个IO口上

    线 16:连接到 PVD 输出。
    补充 PVD = Programmable Votage Detector 可编程电压监测器
    它的作用是监视供电电压,在供电电压下降到给定的阀值以下时,产生一个中断,通知软件做紧急处理。当供电电压又恢复到给定的阀值以上时,也会产生一个中断,通知软件供电恢复。供电下降的阀值与供电上升的PVD阀值有一个固定的差值,引入这个差值的目的是为了防止电压在阀值上下小幅抖动,而频繁地产生中断。

    线 17:连接到 RTC 闹钟事件。
    线 18:连接到 USB 唤醒事件。

    线16~18都是特定的中断响应
    在这里插入图片描述

    用来配置这种映射关系的函数为

    void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) {}
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);	//将中断线 2 与 GPIOE 连接,IO口即为GPIOE2;
    

    也就是说使用了这个函数以后IO口与中断线关联,就可以进行下一步中断线 | 上中断的操作;

    初始化:

    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
    EXTI_InitTypeDef  EXTI_InitStructure; 
    EXTI_InitStructure.EXTI_Line = EXTI_Line4; 
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; 
    EXTI_InitStructure.EXTI_LineCmd = ENABLE; 
    EXTI_Init(&EXTI_InitStructure);    //根据 EXTI_InitStruct 中指定的;
    //参数初始化外设 EXTI 寄存器;
    

    一个EXTI_InitTypeDef结构体内有四个成员:

    typedef struct 
    { 
      uint32_t EXTI_Line;  
      EXTIMode_TypeDef EXTI_Mode;    
      EXTITrigger_TypeDef EXTI_Trigger;  
      FunctionalState EXTI_LineCmd;   
    }EXTI_InitTypeDef;
    

    第一个参数是中断线的标号,取值范围为
    EXTI_Line0~EXTI_Line15。这个在上面已经讲过中断线的概念。也就是说,这个函数配置的是某个中断线上的中断参数。第二个参数是中断模式,可选值为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发 EXTI_Trigger_Rising_Falling。最后一个参数就是使能中断线。

    接下来还有中断优先级的定义
    抢占优先级:多个IO同时发出中断请求时,抢占优先级越小,CPU越优先响应,但如果已经有中断被响应,那这时候就应该对比一下响应优先级,来判断是否要跳出去执行另一个中断;

    NVIC_InitTypeDef NVIC_InitStructure; 
    NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;         //使能按键外部中断通道 
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,  
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;  //子优先级 2 
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   //使能外部中断通道 
    NVIC_Init(&NVIC_InitStructure);                          //中断优先级分组初始化
    

    中断服务函数
    STM32 的 IO 口外部中断函数只有 6 个,分别为:

    EXPORT  EXTI0_IRQHandler           
    EXPORT  EXTI1_IRQHandler        
    EXPORT  EXTI2_IRQHandler          
    EXPORT  EXTI3_IRQHandler         
    EXPORT  EXTI4_IRQHandler           
    EXPORT  EXTI9_5_IRQHandler	//5~9共用     
    EXPORT  EXTI15_10_IRQHandler	//10~15共用
    
    //EXPORT表明该函数已经在其他文件中定义过了,可以直接使用;
    

    两个常用函数

    ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)//判断某个中断线上的中断是否发生;
    void EXTI_ClearITPendingBit(uint32_t EXTI_Line)//清除中断标志位;
    

    具体实现函数 exit.c

    #include "exti.h"
    #include "led.h"
    #include "key.h"
    #include "delay.h"
    #include "usart.h"
    
    //外部中断初始化函数
    void EXTIX_Init(void)
    {
    
    	EXTI_InitTypeDef EXTI_InitStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //外部中断,需要使能AFIO时钟
    
    	KEY_Init(); //初始化按键对应io模式
    
    	//GPIOC.5 中断线以及中断初始化配置
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource5);
    
    	EXTI_InitStructure.EXTI_Line = EXTI_Line5;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿触发
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
    	//GPIOA.15	  中断线以及中断初始化配置
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15);
    
    	EXTI_InitStructure.EXTI_Line = EXTI_Line15;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
    	//GPIOA.0	  中断线以及中断初始化配置
    	GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);
    
    	EXTI_InitStructure.EXTI_Line = EXTI_Line0;
    	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
    	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    	EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			 //使能按键所在的外部中断通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;		 //子优先级1
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能外部中断通道
    	NVIC_Init(&NVIC_InitStructure);								 //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;			 //使能按键所在的外部中断通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;		 //子优先级1
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能外部中断通道
    	NVIC_Init(&NVIC_InitStructure);
    
    	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;		 //使能按键所在的外部中断通道
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;		 //子优先级1
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;				 //使能外部中断通道
    	NVIC_Init(&NVIC_InitStructure);
    }
    
    void EXTI0_IRQHandler(void)
    {
    	delay_ms(10); //消抖
    	if (WK_UP == 1)
    	{
    		LED0 = !LED0;
    		LED1 = !LED1;
    	}
    	EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
    }
    void EXTI9_5_IRQHandler(void)
    {
    	delay_ms(10); //消抖
    	if (KEY0 == 0)
    	{
    		LED0 = !LED0;
    	}
    	EXTI_ClearITPendingBit(EXTI_Line5); //清除LINE5上的中断标志位
    }
    
    void EXTI15_10_IRQHandler(void)
    {
    	delay_ms(10); //消抖
    	if (KEY1 == 0)
    	{
    		LED1 = !LED1;
    	}
    	EXTI_ClearITPendingBit(EXTI_Line15); //清除LINE15线路挂起位
    }
    
    

    最后是主函数代码,要实现目的功能还是比较简单的

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "key.h"
    #include "usart.h"
    #include "exti.h"
    
    int main(void)
    {
    
    	delay_init();									//延时函数初始化
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置中断优先级分组2
    	uart_init(9600);								//串口初始化为9600
    	LED_Init();										//初始化与LED连接的硬件接口
    	EXTIX_Init();									//外部中断初始化
    	LED0 = 0;										//点亮LED
    	while (1)
    	{
    		printf("OK\n");
    		delay_ms(1000);
    	}
    
    	return 0;
    }
    
    
    展开全文
  • STM32中断嵌套实验基于神舟3号开发板
  • stm32外部中断实验

    2017-11-12 15:11:40
    stm32外部中断实验,初学者入门学习交流,stm32f107zet6
  • STM32 定时器中断实验

    2018-06-20 20:54:01
    基于STM32的定时器中断实验,需要用KEIL 5打开,可直接下载仿真。基于STM32的定时器中断实验,需要用KEIL 5打开,可直接下载仿真。
  • STM32 实验4 外部中断实验 采用最新的3.5的库函数,一气呵成的外部中断实践。
  • STM32 实验7 定时器中断实验,欢迎来下载,免费的啊。
  • STM32外部中断实验

    2018-11-14 10:54:47
    亲测可用,可以用来做STM32的外部中断,有问题可以联系或者在评论区评论
  • 外部中断实验 1.外部中断介绍 1-1:STM32 每个I/O口都可以作为外部中断的中断输入口;F103的中断控制器支持19个外部中断,分别是:外部I/O口的输入中断对应的中断线为0-15;PVD输出中断对应中断线16;RTC闹钟事件...

    外部中断实验

    1.外部中断介绍
    1-1:STM32 每个I/O口都可以作为外部中断的中断输入口;F103的中断控制器支持19个外部中断,分别是:外部I/O口的输入中断对应的中断线为0-15;PVD输出中断对应中断线16;RTC闹钟事件对应中断线17;USB唤醒事件对应中断线18.
    1-2:中断线与I/O口对应的关系
    中断线0-15 对应GPIOx.0-GPIOx.15;每个中断线对应7个I/O口,但是每次只能选择一个链接一个I/O口,
    1-3:配置中断线与GPIO的映射关系函数为:GPIO_EXTILineConfig()
    定义:

    void GPIO_EXTILineConfig(GPIO_PortSoyrce,GPIO_PinSource)
    //第一个参数对应GPIO模块;第二个参数对应中断线

    2.中断线的中断初始化函数:EXTI_Init();
    定义:void EXTI_Init(*EXTI_InitStruct)
    结构体EXTI_InitStruct的成员变量有:
    EXTI_Line:设置中断线的标号;
    EXTI_Mode:选择中断模式(两种模式可选:EXTI_Mode_Interrupt 或者 EXTI_Mode_Event)
    EXTI_Trigger:选择触发方式:EXTI_Trigger_Falling 下降沿触发;EXTI_Trigger_Rising 上升沿触发;EXTI_Trigger_Rising_Falling 任意电平触发
    EXTI_LineCmd:使能中断线;

    3.外部中断必须要设置NVIC中断优先级
    设置中断优先级步骤:
    1.使能外部中断通道:NVIC_IRQChannel = EXTI0_IRQn
    2.设置抢占优先级:NVIC_IRQChannelPreemptionPriority = 0x02
    3.设置子优先级:NVIC_IRQChannelSubPriority = 0x03
    4.使能外部中断通道:NVIC_IRQChannelCmd = ENABLE
    5.中断优先级初始化:NVIC_Init(&NVIC_InitStructure)

    4.编写中断服务函数
    1.I/O口外部中断函数分别为:
    EXPORT EXTI0_IRQHandler(中断线0);
    EXPORT EXTI1_IRQHandler(中断线1);
    EXPORT EXTI2_IRQHandler(中断线2);
    EXPORT EXTI3_IRQHandler(中断线3);
    EXPORT EXTI4_IRQHandler(中断线4);
    EXPORT EXTI9_5_IRQHandler(中断线5-9);
    EXPORT EXTI15_10_IRQHandler(中断线10-15);
    2.判断中断线的中断是否发生(标志位是否置位)函数为:EXTI_GetITStatus(EXTI_Line)
    3.清除中断标志位函数:EXTI_ClearITPendingBit(EXTI_line)

    5.使用I/O口外部中断步骤:
    1.初始化I/O口为输入
    2.开启AFIO时钟
    3.设置中断线与I/O口的映射关系
    4.初始化线上中断,设置触发条件
    5.配置中断分组,并使能中断
    6.编写中断函数

    展开全文
  • STM32F1外部中断实验

    2015-09-17 08:08:28
    STM32F1外部中断实验,库函数版本STM32F1外部中断实验,库函数版本
  • stm外部中断实验.pptx

    2020-02-20 16:53:51
    stm外部中断实验.pptx
  • stm32 定时器3实现精确的1s延时时基,LED灯以1s间隔黄绿蓝三盏灯循环闪烁,通过Proteus仿真看效果。
  • 1、STM32的每个IO都可以作为外部中断输入。 2、STM32中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 每...

    一、外部中断概述

    1、STM32的每个IO都可以作为外部中断输入。
    2、STM32的中断控制器支持19个外部中断/事件请求:
    线0~15:对应外部IO口的输入中断。
    线16:连接到PVD输出。
    线17:连接到RTC闹钟事件。
    线18:连接到USB唤醒事件。

    每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

    从上面可以看出,STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),
    STM32F103RCT6(51),那么中断线怎么跟io口对应呢?

    GPIOx.0映射到EXTI0
    GPIOx.1映射到EXTI1

    GPIOx.15映射到EXTI15


    3、IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数。

    从表中可以看出,外部中断线5~9分配一个中断向量,共用一个服务函数外部中断线10~15分配一个中断向量,共用一个中断服务函数。

    4、中断服务函数列表

    EXTI0_IRQHandler           
    EXTI1_IRQHandler
    EXTI2_IRQHandler           
    EXTI3_IRQHandler           
    EXTI4_IRQHandler           
    EXTI9_5_IRQHandler         
    EXTI15_10_IRQHandler

    二、外部中断常用库函数

    ①void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
       //设置IO口与中断线的映射关系

       exp:  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

    ②void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
     //初始化中断线:触发方式等

    ③ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
    //判断中断线中断状态,是否发生

    ④void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
    //清除中断线上的中断标志位


    1、EXTI_Init函数
    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

    2、外部中断的一般配置步骤

    初始化IO口为输入。
           GPIO_Init();
    开启IO口复用时钟。
           RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    设置IO口与中断线的映射关系。
            void GPIO_EXTILineConfig();
    初始化线上中断,设置触发条件等。
           EXTI_Init();
    配置中断分组(NVIC),并使能中断。
           NVIC_Init();

    编写中断服务函数。
          EXTIx_IRQHandler();
    清除中断标志位
          EXTI_ClearITPendingBit();

    三、硬件连接

    mini stm32

     

    展开全文
  • STM32中断

    千次阅读 2019-02-08 22:35:47
    这里我们首先 STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/ 事件请求。每个中断设有状态位,每个中断...

    这里我们首先 STM32 IO 口中断的一些基础概念。STM32 的每个 IO 都可以作为外部中断
    的中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/
    事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。STM32F103 的
    19 个外部中断为:
    线 0~15:对应外部 IO 口的输入中断。
    线 16:连接到 PVD 输出。
    线 17:连接到 RTC 闹钟事件。
    线 18:连接到 USB 唤醒事件。
    从上面可以看出,STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不
    止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样
    设计,GPIO 的管教 GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 0~15。这样每个中
    断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、
    GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来
    决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO 跟中断线的映射关系图:
    在这里插入图片描述
    在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的:

    void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
    

    该函数将 GPIO 端口与中断线映射起来,使用范例是:

    GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
    

    将中断线 2 与 GPIOE 映射起来,那么很显然是 GPIOE.2 与 EXTI2 中断线连接了。设置好中断
    线映射之后,那么到底来自这个 IO 口的中断是通过什么方式触发的呢?接下来我们就要设置
    该中断线上中断的初始化参数了。
    中断线上中断的初始化是通过函数 EXTI_Init()实现的。EXTI_Init()函数的定义是:

    void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
    

    下面我们用一个使用范例来说明这个函数的使用:

    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line4;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的
    //参数初始化外设 EXTI 寄存器
    

    上面的例子设置中断线 4 上的中断为下降沿触发。STM32 的外设的初始化都是通过结构体来设
    置初始值的,这里就不罗嗦结构体初始化的过程了。我们来看看结构体 EXTI_InitTypeDef 的成
    员变量:

    typedef struct
    {
    uint32_t EXTI_Line;
    EXTIMode_TypeDef EXTI_Mode;
    EXTITrigger_TypeDef EXTI_Trigger;
    FunctionalState EXTI_LineCmd;
    }EXTI_InitTypeDef;
    

    从定义可以看出,有 4 个参数需要设置。第一个参数是中断线的标号,取值范围为
    EXTI_Line0~EXTI_Line15。这个在上面已经讲过中断线的概念。也就是说,这个函数配置的是某个中断线上的中断参数。第二个参数是中断模式,可选值为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling,上
    升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发
    EXTI_Trigger_Rising_Falling,相信学过 51 的对这个不难理解。最后一个参数就是使能中断线了。
    我们设置好中断线和 GPIO 映射关系,然后又设置好了中断的触发模式等初始化参数。既
    然是外部中断,涉及到中断我们当然还要设置 NVIC 中断优先级。这个在前面已经讲解过,这
    里我们就接着上面的范例, 设置中断线 2 的中断优先级。

     NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;  //子优先级 2
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
        NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化
    

    上面这段代码相信大家都不陌生,我们在前面的串口实验的时候讲解过,这里不再讲解。
    我们配置完中断优先级之后,接着我们要做的就是编写中断服务函数。中断服务函数的名
    字是在 MDK 中事先有定义的。这里需要说明一下,STM32 的 IO 口外部中断函数只有 6 个,
    分别为:

    EXPORT EXTI0_IRQHandler
    EXPORT EXTI1_IRQHandler
    EXPORT EXTI2_IRQHandler
    EXPORT EXTI3_IRQHandler
    EXPORT EXTI4_IRQHandler
    EXPORT EXTI9_5_IRQHandler
    EXPORT EXTI15_10_IRQHandler
    

    中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中
    断线 10-15 共用中断函数 EXTI15_10_IRQHandler。在编写中断服务函数的时候会经常使用到两
    个函数,第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):
    ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
    这个函数一般使用在中断服务函数的开头判断中断是否发生。另一个函数是清除某个中断线上
    的中断标志位:
    void EXTI_ClearITPendingBit(uint32_t EXTI_Line);
    这个函数一般应用在中断服务函数结束之前,清除中断标志位。
    常用的中断服务函数格式为:
    void EXTI3_IRQHandler(void)
    {
    if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生
    {
    中断逻辑…
    EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位
    }
    }
    在这里需要说明一下,固件库还提供了两个函数用来判断外部中断状态以及清除外部状态
    标志位的函数 EXTI_GetFlagStatus 和 EXTI_ClearFlag,他们的作用和前面两个函数的作用类似。
    只是在 EXTI_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而
    EXTI_GetFlagStatus 直接用来判断状态标志位。
    讲到这里,相信大家对于 STM32 的 IO 口外部中断已经有了一定了了解。下面我们再总结一
    下使用 IO 口外部中断的一般步骤:
    1)初始化 IO 口为输入。
    2)开启 AFIO 时钟
    3)设置 IO 口与中断线的映射关系。
    4)初始化线上中断,设置触发条件等。
    5)配置中断分组(NVIC),并使能中断。
    6)编写中断服务函数。
    通过以上几个步骤的设置,我们就可以正常使用外部中断了。
    main.c

    #include "led.h"
    #include "delay.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"
    #include "exti.h"
    #include "beep.h"
    
    
    	
     int main(void)
     {		
     
    	delay_init();	    	 //延时函数初始化	  
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	uart_init(115200);	 //串口初始化为115200
    	LED_Init();		  		//初始化与LED连接的硬件接口 
    	BEEP_Init();		 	//初始化蜂鸣器IO
    	EXTIX_Init();         	//初始化外部中断输入 
    	LED0=0;					//先点亮红灯
    	while(1)
    	{	    
    		printf("OK\r\n");	
    		delay_ms(1000);	  
    	}	 
    }
    
    

    exti.c

    #include "exti.h"
    #include "led.h"
    #include "key.h"
    #include "delay.h"
    #include "usart.h"
    #include "beep.h"
    
    
    //外部中断0服务程序
    void EXTIX_Init(void)
    {
     
       	EXTI_InitTypeDef EXTI_InitStructure;
     	  NVIC_InitTypeDef NVIC_InitStructure;
    
        KEY_Init();	 //	按键端口初始化
    
      	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//使能复用功能时钟
    
    
    
       //GPIOE.3	  中断线以及中断初始化配置 下降沿触发 //KEY1
      	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource3);
      	EXTI_InitStructure.EXTI_Line=EXTI_Line3;
      	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
      	EXTI_Init(&EXTI_InitStructure);	  	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
       //GPIOE.4	  中断线以及中断初始化配置  下降沿触发	//KEY0
      	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
      	EXTI_InitStructure.EXTI_Line=EXTI_Line4;
      	EXTI_Init(&EXTI_InitStructure);	  	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
    
       //GPIOA.0	  中断线以及中断初始化配置 上升沿触发 PA0  WK_UP
     	  GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); 
    
      	EXTI_InitStructure.EXTI_Line=EXTI_Line0;
      	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
      	EXTI_Init(&EXTI_InitStructure);		//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器
    
    
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//使能按键WK_UP所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2, 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;					//子优先级3
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure); 
    
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;			//使能按键KEY1所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;					//子优先级1 
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);  	  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
    
      	NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;			//使能按键KEY0所在的外部中断通道
      	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2 
      	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级0 
      	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
      	NVIC_Init(&NVIC_InitStructure);  	  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
     
    }
    
    //外部中断0服务程序 
    void EXTI0_IRQHandler(void)
    {
    	delay_ms(10);//消抖
    	if(WK_UP==1)	 	 //WK_UP按键
    	{				 
    		BEEP=!BEEP;	
    	}
    	EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
    }
     
    
    //外部中断3服务程序
    void EXTI3_IRQHandler(void)
    {
    	delay_ms(10);//消抖
    	if(KEY1==0)	 //按键KEY1
    	{				 
    		LED1=!LED1;
    	}		 
    	EXTI_ClearITPendingBit(EXTI_Line3);  //清除LINE3上的中断标志位  
    }
    
    void EXTI4_IRQHandler(void)
    {
    	delay_ms(10);//消抖
    	if(KEY0==0)	 //按键KEY0
    	{
    		LED0=!LED0;
    		LED1=!LED1; 
    	}		 
    	EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
    }
     
    
    

    exti.h

    #ifndef __EXTI_H
    #define __EXIT_H	 
    #include "sys.h"
    
    void EXTIX_Init(void);//外部中断初始化		 					    
    #endif
    
    
    
    展开全文
  • STM32外部中断实验-EXTI

    2020-10-19 13:51:42
    STM32 外部中断简介 STM32 的每个 IO 都可以作为外部中断中断输入口,这点也是 STM32 的强大之处。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽...
  • 正点原子STM32F103外部中断实验
  • STM32定时器中断实验

    2012-10-29 11:45:01
    解压之后可直接运行,已设置好!对于学生来说,这个程序比较入门易懂!
  • STM32F4外部中断实验例程.rar
  • stm32定时器中断实验

    千次阅读 2017-05-11 11:05:09
    //个人总结:所有的中断实验都是设置好中断的条件,编写中断处理函数;之前是串口通信,当串口发送数据时,将数据打印出;后来是外部中断,这里用到了外部时钟,发生外部输入中断时,进行处理;看门狗(独立看门狗和...
  • 中断实验STM32

    2013-09-15 17:42:31
    进行STM 32 的初级学习下载,中断服务的相关程序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,894
精华内容 3,157
关键字:

stm32中断实验