探索STM32微控制器技术
中断本身的概念非常简单,就是在CPU工作时快速处理一个紧急事件后CPU再回来重新处理主要任务。但主要的流程实际上非常繁琐,并且HAL库;标准库;寄存器配置;的流程各不相同,但又有相似的地方。如果作为初学者,很可能没有分清的情况下看了不同版本的文章,从而二导致最终晕头转向。
目录
1.中断的优先级
2.中断的基本架构
1.AFIO配置选线
2.EXTI中断触发
3.NVIC
3.HAL库中断的代码配置
1.配置使能并配置GPIO口模式&2.使能中断比并设定中断优先组
3.配置中断回调函数内容
1.中断的优先级
再STM32 中主要有三个中断优先级的概念:
自然优先级:芯片自动为中断配置的优先级,用户无法改变。
抢断优先级:当一个中断正在运行时,一个中断如果抢断优先级大于该中断。则可以中断该中断。
响应优先级:当两个中断同时到达是,按响应优先级优先。
注意:当没有配置抢断优先级和响应优先级时或者两者都相等时按照自然优先级优先。当同时响应时先优先抢断优先级,再优先响应响应优先级。
2.中断的基本架构
中断的架构如果细讲其实是挺复杂的,但是其实很多东西不知道也行,所以这里我给一个我自己的流程作为初学者直接拿来熟悉流程的用。
1.AFIO配置选线
AFIO的功能其实很简单,就是复用IO口。把中断原本配置的引脚配置到其他IO口,从而节省引脚的使用。
外部中断偏移寄存器 AFIO_EXTICR1-AFIO_EXTICR4
2.EXTI中断触发
EXTI主要用来检测对应GPIO口的电平变化。当电平变化符合配置时,EXTI将对应的中断请求发送到NVIC。此外,EXTI还可以屏蔽事件或者中断。
中断屏蔽寄存器 EXTI_IMR
上升沿触发选择寄存器 EXTI_RTSR
下降沿触发选择寄存器 EXTI_FTSR)
这个几个寄存器的使用方法都十分的简单,就是将对应的来自x线的中断进行对应寄存器的处理。
3.NVIC
NVIC主要的功能是使能或者失能对应的外部中断;配置外部中断的优先级;处理外部中断的优先级,设定优先级组。
中断使能寄存器 ISER
中断除能寄存器 ICER
应用程序中断及复位控制寄存器 AIRCR
中断优先级寄存器 IPR
其中AIRCR用来配置抢断优先级和响应优先级的位数,这个也就是优先级组的分组选择。
3.HAL库中断的代码配置
HAL库中的中断配置可以总结为三步:
1.配置使能并配置GPIO口模式—2.使能中断比并设定中断优先组—3.配置中断回调函数内容
1.配置使能并配置GPIO口模式&2.使能中断比并设定中断优先组
void exti_init(){
GPIO_InitTypeDef gpio_init;
gpio_init.Mode = GPIO_MODE_IT_FALLING; //下降沿触发
gpio_init.Pin = GPIO_PIN_0;
gpio_init.Pull = GPIO_PULLUP;
gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
__HAL_RCC_GPIOA_CLK_ENABLE(); //使能时钟树
HAL_GPIO_Init(GPIOA, &gpio_init); //初始化GPIO
HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //设定中断线路,设定抢占优先级,设定响应优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断
}
其中,EXTI0_IRQn是一个被宏定义了的指定函数,也就是说这个函数名是定死的。这些被宏定义的函数在对应的启动文件内找:
3.配置中断回调函数内容
void EXTI0_IRQHandler(){
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); //中断函数对应的公共处理函数,在该函数中会调用一个回调函数
//该回调函数是一个可重写的类型,也就是我们中断函数中的服务内容函数。
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
delay_ms(20);
if(GPIO_Pin == GPIO_PIN_0 && HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
led1_toggle();
}
其中对应的公共处理函数在这里看:
这里能看出来公共函数就是重新检测了一下标志位是否被置0;然后调用了回调函数。这里回调函数是一个 weak类型,也就是让用户重写的函数类型。
最后直接上图:
如果你是一个STM32HAL库配置的初学者,请不要太过于在意这些各种控制器和寄存器的细节。记住大概流程,多自己动手做项目熟悉了主要的代码流程即可。
作者:科文小白狼