提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
STM32学习笔记——中断
引言
基于B站江科大自化协的教程视频来编写,供自己遗忘后重新回忆。对射式红外传感器计次工程
中断需要注意的点是在主函数和中断函数中不要操作相同的硬件,如果功能冲突,一个解决办法就是在中断中进行标志位操作,当中断返回时,在对变量进行操作。
一、AFIO配置
AFIO并没有专门的库函数文件,库函数文件与GPIO库函数文件在一起。
1.AFIO库函数介绍
1.GPIO_AFIODeInit(void) : 用来复位AFIO外设,调用函数,AFIO外设的配置全部清除。
2.GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin):锁定GPIO配置。
3.GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource) 与GPIO_EventOutputCmd(FunctionalState NewState) :用来配置AFIO的事件输出功能,使用较少。
4.GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState) :用来进行引脚重映射
5.GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource):配置AFIO的数据选择器,选择中断引脚
6.GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface):与以太网有关
2.EXTI库函数介绍
1.EXTI_DeInit(void) :配置清除,恢复上电默认状态
2.EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct):根据结构体内参数配置EXTI外设
3.EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct) :把参数传递的结构体变量赋一个默认值
4.EXTI_GenerateSWInterrupt(uint32_t EXTI_Line) :软件触发外部中断。
//5和6主函数中查看和清除标志位
5.EXTI_GetFlagStatus(uint32_t EXTI_Line):获取指定标志位是否置1;
6.EXTI_ClearFlag(uint32_t EXTI_Line) :对指定标志位进行清除。
//7和8在中断函数中查看和清除标志位
7.EXTI_GetITStatus(uint32_t EXTI_Line) :获取中断标志位是否置1
8.EXTI_ClearITPendingBit(uint32_t EXTI_Line) :清除中断挂起标志位
3.NVIC库函数介绍
1.NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup) :用来中断分组
2.NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct):根据结构体里面指定的参数初始化NVIC
3.NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset) :设置中断向量表
4.NVIC_SystemLPConfig(uint8_t LowPowerMode, FunctionalState NewState):系统低功耗配置
4.初始化函数
void CountSensor_Init(void)
{
//开启对应的外设,如GPIOB、AFIO等等
//内核外设不用开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
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(GPIOB,&GPIO_InitStructure);
//配置AFIO
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14); //连接PB14口的第14个中断线路
//配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
EXTI_Init(&EXTI_InitStructure);
//配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择22模式
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
}
5.中断函数
特殊说明:中断函数不用在头文件中声明,因为中断函数是自动执行的!!!
void EXTI15_10_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line14)==SET)
{
EXTI_ClearITPendingBit(EXTI_Line14); //清除中断标志位
}
}