STM32外部中断
- STM32有19个外部中断:线0-15对应外部IO口的输入中断;线16连接PVD输出;线17连接RTC闹钟事件;线18连接USB唤醒事件。
- GPIO与中断线的映射关系:GPIOx.0映射到EXTI0,GPIOx.1映射到EXTI1;以此类推。
- 使用外部中断需要使能AFIO时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- 还要设置IO口与中断线的映射关系:(例)GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
- 然后设置中断的触发模式等初始参数
- 然后设置NVIC中断优先级
- 设置完中断优先级后就是编写中断服务函数,STM32的IO口外部中断函数只有6个,中断线0-4分别对应一个中断服务函数,中断线5-9共用一个,10-15公用一个,如图:
- 注意:设置中断优先级分组需要在主函数中调用相关函数设置,一定要记住初始化函数(初始化延时、按键、LED)
- 在编写完中断服务函数之后要清楚中断标志位,如图:
外部中断函数
#include "exti.h"
#include "led.h"
#include "key.h"
#include "delay.h"
#include "usart.h"
void EXTIX_Init(void)
{
EXTI_InitTypeDef EXTI_InitStructure1;
NVIC_InitTypeDef NVIC_InitStructure1;
KEY_Init();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource5);
EXTI_InitStructure1.EXTI_Line = EXTI_Line5;
EXTI_InitStructure1.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure1.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure1.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure1);
NVIC_InitStructure1.NVIC_IRQChannel = EXTI9_5_IRQn;
NVIC_InitStructure1.NVIC_IRQChannelPreemptionPriority = 0x02