stm32外部中断实验

STM32的中断控制器支持19个外部中断/事件请求,每个IO都可以作为外部中断输入,其中:
线0~15:对应外部IO口的输入中断。
线16:连接到PVD输出。
线17:连接到RTC闹钟事件。
线18:连接到USB唤醒事件。
每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。

STM32供IO使用的中断线只有16个,但是STM32F10x系列的IO口多达上百个,STM32F103ZET6(112),STM32F103RCT6(51),其对应关系如下:
GPIOx.0映射到EXTI0
GPIOx.1映射到EXTI1

GPIOx.15映射到EXTI15
stm32外部中断实验_第1张图片

如图所示:
IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数
外部中断线5~9分配一个中断向量,共用一个服务函数
外部中断线10~15分配一个中断向量,共用一个中断服务函数
stm32外部中断实验_第2张图片

分别是:
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI9_5_IRQHandler
EXTI15_10_IRQHandler

结合程序说明设置外部中断的一般过程:

(1)使能复用功能时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

(2)根据中断使用外设进行gpio端口初始化,以按键为例,代码以及硬件图如下

  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PORTE时钟
 GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;//KEY0
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
  GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4

硬件连接如下:
stm32外部中断实验_第3张图片
(3)设置IO口与中断线的映射关系

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);

(4)进行中断初始化

EXTI_InitTypeDef itt;
 itt.EXTI_Line=EXTI_Line4 ;
 itt.EXTI_LineCmd=ENABLE;
 itt.EXTI_Mode=EXTI_Mode_Interrupt;
 itt.EXTI_Trigger=EXTI_Trigger_Falling;//设置触发方式为下降沿触发
 EXTI_Init(&itt);

(5)设置中断分组并设置中断优先级,中断分组一般在主函数中设置

 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断分组
 NVIC_InitTypeDef nv;
  nv.NVIC_IRQChannel=EXTI4_IRQn;
 nv.NVIC_IRQChannelCmd=ENABLE;
 nv.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级为2
 nv.NVIC_IRQChannelSubPriority=2;//响应优先级为2
 NVIC_Init(&nv);

(6)编写中断函数

 void EXTI4_IRQHandler(void)
{
 delay_ms(10);//按键防抖专用
 if(KEY0==0)
 {
XXXXXXX//需要执行的任务
 }
 EXTI_ClearITPendingBit(EXTI_Line4);//清除中断标志位
}

你可能感兴趣的:(STM32)