STM32
直播中

Arvinhw

9年用户 899经验值
擅长:嵌入式技术
私信 关注
[问答]

如何对Stm32的外部中断进行配置呢

STM32的IO与中断线是如何对应的?

如何对Stm32的外部中断进行配置呢?

回帖(1)

刘洋

2021-11-16 11:03:09
  1.外部中断
  (1)stm32的每一个IO都可以作为外部中断输入。
  (2)stm32的中断控制器支持19个外部中断/事件请求:
  线0~15:对应外部IO口的输入中断。
  线16:连接到PVD输出。
  线17:连接到RTC闹钟事件。
  线18:连接到USB唤醒事件。
  每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。
  2.IO与中断线的对应
  (112IO对应16个中断线)
  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 跟中断线的映射关系图:
  
  对于每一个中断线,我们可以设置相应的触发方式(上升沿触发,下降沿触发,边沿触发)以及使能 。
  3.中断服务函数
  IO口外部中断在中断向量表只分配了7个中断向量,也就是只能使用7个中断服务函数
  外部中断线5-9分配一个终端向量,共用一个服务函数外部中断线10-15分配一个中断向量,共用一个中断服务函数。
  中断服务函数列表:
  EXTI0_IRQHandler
  EXTI1_IRQHandler
  EXTI2_IRQHandler
  EXTI3_IRQHandler
  EXTI4_IRQHandler
  EXTI9_5_IRQHandler
  EXTI15_10_IRQHandler
  4.配置外部中断
  (1)设置IO口与中断线的映射关系
  void GPIO_Init();
  void RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  使能 AFIO 时钟
  void GPIO_EXITLineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource);
  (2)初始化中断线:触发方式等
  void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
  (3)判断中断线中断状态,是否发生且配置中断分组(NVIC),并编写中断服务函数
  void ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
  void NVIC_Init();
  void EXTIx_IRQHandler();
  (4)清除中断线上的中断标志位
  void EXTI_ClearITPendingBit(uint32_t EXTI_Line); 代码:
  exti.h
  #ifndef __EXTI_H
  #define __EXTI_H
  #include “sys.h”
  void EXTIX_Init(void);
  void EXTI4_IRQHandler(void);
  #endif
  exti.c
  #include “exti.h”
  #include “key.h”
  #include “delay.h”
  #include “led.h”
  void EXTIX_Init(void)
  {
  EXTI_InitTypeDef EXTI_InitStrue;
  NVIC_InitTypeDef NVIC_InitStrue;
  key_Init();//按键端口初始化
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能 AFIO 时钟
  GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);//GPIOE.4中 断线以及中断初始化配置,下降沿触发
  EXTI_InitStrue.EXTI_Line=EXTI_Line4;
  EXTI_InitStrue.EXTI_LineCmd=ENABLE;
  EXTI_InitStrue.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
  EXTI_InitStrue.EXTI_Trigger=EXTI_Trigger_Falling;//设置下降沿触发
  EXTI_Init(&EXTI_InitStrue);//初始化 EXTI 寄存器
  NVIC_InitStrue.NVIC_IRQChannel=EXTI4_IRQn; //使能按键外部中断通道
  NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;//使能外部中断通道
  NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级 2,
  NVIC_InitStrue.NVIC_IRQChannelSubPriority=2;//子优先级 2
  NVIC_Init(&NVIC_InitStrue);//初始化 NVIC
  }
  void EXTI4_IRQHandler(void)
  {
  delay_ms(10);//消抖
  if(KEY0==0)
  {
  LED1=!LED1;
  LED0=!LED0;
  }
  EXTI_ClearITPendingBit(EXTI_Line4);//清除 LINE4 上的中断标志位
  }
  main.c
  #include “stm32f10x.h”
  #include “exti.h”
  #include “delay.h”
  #include “led.h”
  #include “key.h”
  int main(void)
  {
  LED_Init();
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置 NVIC 中断分组 2
  EXTIX_Init();//外部中断初始化
  delay_init();
  while(1)
  {
  delay_ms(1000);
  }
  }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分