stm32学习笔记(四)外部中断

来源:互联网 发布:gta5捏脸数据女韩国 编辑:程序博客网 时间:2024/05/18 01:50
#include "exti.h"#include "led.h"#include "key.h"#include "delay.h"#include "usart.h"////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途//Mini STM32开发板//外部中断 驱动代码   //正点原子@ALIENTEK//技术论坛:www.openedv.com//修改日期:2010/12/01  //版本:V1.0//版权所有,盗版必究。//Copyright(C) 正点原子 2009-2019//All rights reserved  //////////////////////////////////////////////////////////////////////////////////     //外部中断初始化函数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;//使能按键所在的外部中断通道0-4有单独的中断服务函数  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;//使能按键所在的外部中断通道 5-9共用一个中断服务函数  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;//使能按键所在的外部中断通道 9-15共用一个中断服务函数  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线路挂起位}


STM32中,每一个GPIO都可以触发一个外部中断,但是,GPIO的中断是以组位一个单位的,同组间的外部中断同一时间只能使用一个。比如说,PA0,PB0,PC0,PD0,PE0,PF0,PG0这些为1组,如果我们使用PA0作为外部中断源,那么别的就不能够再使用了,在此情况下,我们智能使用类似于PB1,PC2这种末端序号不同的外部中断源。每一组使用一个中断标志EXTIx。EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。

中断配置


      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寄存器

 

    

S TM32中断控制器支持20个外部中断/事件请求:    线0-15:外部IO口输入中断

     线16:连接到PVD输出
     线17:连接到RTC闹钟事件
     线18:连接到USB唤醒事件

     线19:Ethernet Wakeup event


中断模式 typedef enum
{
  EXTI_Mode_Interrupt = 0x00,
  EXTI_Mode_Event = 0x04
}EXTIMode_TypeDef;


中断触发类型

typedef enum
{
  EXTI_Trigger_Rising = 0x08,
  EXTI_Trigger_Falling = 0x0C,  
  EXTI_Trigger_Rising_Falling = 0x10
}EXTITrigger_TypeDef;


中断优先级配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键所在的外部中断通道0-4有单独的中断服务函数  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级1  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中断通道  NVIC_Init(&NVIC_InitStructure);    //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器


中断服务函数

EXTI0 – EXTI4这5个外部中断有着自己的单独的中断响应函数,EXTI5-9共用一个中断响应函数,EXTI10-15共用一个中断响应函数。

抢占优先级和响应优先级
STM32 的中断向量具有两个属性,一个为抢占属性,另一个为响应属性,
其属性编号越小,表明它的优先级别越高。

当两个中断同时到来,先响应抢占优先级搞得中断。

当两个中断抢占优先级一样,先进入响应优先级高的中断。


EXTI_ClearITPendingBit(EXTI_Line5)

中断函数响应完中断之后,要清除中断线路挂起位


http://www.openedv.com/posts/list/43201.htm




原创粉丝点击