目录
一.中断流程
二.stm32中断
- 使用NVIC统一管理中断,每个中断通道都有16个优先级
- 优先级分为响应优先级和抢占优先级
-
NVIC基本结构
-
NVIC中断优先级
- 优先级由优先级寄存器的四位决定
- 分为高n位抢占优先级和低n-1位响应优先级
- 抢占优先级高可以中断嵌套,响应优先级高可以优先排队
三.EXTI外部中断
-
简介
- EXTI通过监测GPIO口电平变化,向NVIC发起中断申请,经NVIC裁决后可中断CPU主程序,使CPU执行中断程序
- 触发方式:上升沿/下降沿/双边沿/软件触发
- 相同的GPIO_Pin口不能同时触发中断(PinA1/PinB1/PinC1不能同时触发)
- 触发响应方式:事件响应/中断响应
- 事件响应:中断信号不会进入CPU,而是通向其他外设(触发ADC转换,DMA)
-
基本结构
-
AFIO复用I/O口
- 复用功能引脚重映射
- 中断引脚选择
-
EXTI框图
四.使用EXTI外部中断
-
中断步骤
- 配置RCC时钟,把设计外设的时钟打开
- 配置GPIO,选择端口为输入模式
- 配置AFIO,选择引脚
- 配置EXIO,选择边沿触发方式
- 配置NVIC,选择中断优先级
-
AFIO函数
void GPIO_AFIODeInit(void);//AFIO初始化,清除配置
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);//锁定配置
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);//配置事件输出功能
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);//引脚重映射
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);//配置AFIO数据选择器,选择中断引脚
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);//用不太到
-
EXTI函数
void EXTI_DeInit(void);//清除配置,恢复默认上电
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);//配置EXTI外设
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);//结构体变量赋值
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line);
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);
void EXTI_ClearFlag(uint32_t EXTI_Line);//清除中断标志位
//主程序读写状态寄存器
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);//清除中断标志位
//中断函数读写状态寄存器
-
NVIC函数
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup);//中断分组函数
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//初始化NVIC
void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);//
void NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState);
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource);
-
初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//EXTI与NVIC不需要开启时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_14);
//GPIO初始化
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
//AFIO初始化
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line=EXTI_Line14;
EXTI_InitStruct.EXTI_LineCmd=ENABLE;
EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt ;//中断
EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;//下降沿触发
EXTI_Init(&EXTI_InitStruct);
//EXTI初始化
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;//响应优先级
NVIC_Init(&NVIC_InitStruct);