STM32中断配置的一般步骤:
中断可以说是任何单片机的灵魂了,STM32当然也不例外,所以STM32的中断配置就很有必要熟练掌握了。
1.中断优先级管理:
在STM32的所有外设中断中,存在三种优先级:抢占优先级,响应优先级,硬件优先级。优先级对应的数值越小,优先级就越高。 当两个中断事件同时发生,首先比较谁的抢占优先级高,就先执行谁;如果抢占优先级相同,那就比较响应优先级,最后再比较硬件优先级。还有一种情况:一个中断正在执行,此时又发生了另外一个中断事件,如果另外的这个中断事件的抢占优先级比正在执行的中断的抢占优先级高,那就会打断当前中断,执行另外的这个中断。这称为”中断嵌套“。
在STM32中,抢占优先级和响应优先级都可以通过NVIC来配置,硬件优先级无法改变。
2.中断配置的一般步骤:
(1)使能中断请求:
中断请求又很多,例如:串口接收中断,定时器更新中断。总而言之使能中断请求就是选择具体是什么事件触发中断, 通常这一步需要做两件事情: 第一,开启外设中断,可以置位相应的寄存器,也可以调用固件库函数;这里以库函数开启定时器2更新中断为例:
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
第二,使能中断在NVIC对应的通道,这一步是在结构体初始化NVIC的时候完成的,需要给NVIC_IRQChannel和NVIC_IRQChannelCmd这两个结构体成员赋值。NVIC_IRQChannel所有可选值在stm32f10x.h文件中。还是以定时器2更新中断为例:
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
这里注意,一个NVIC通道对应一个中断函数,但是可能多个中断请求对应同一个NVIC通道,因此,又可能发生多个中断请求公用一个中断函数的情况。例如:串口1的中断请求可以是发送完成中断(TC标志位置1),也可以是接收完成中断(RXNE标志位非空),但是它们公用同一个中断函数:USART1_IRQn, 这种情况下,可以通过状态机编程的思想来处理中断函数,当然了,具体怎么做,还得靠大家的聪明才智了
经过以上步骤,就完成了使能中断请求
(2)中断优先级管理:
前文已经提到了,在同一个程序中,所有中断的优先级分组必须相同,这个优先级分组时通过调用NVIC_PriorityGroupConfig函数来选择的,这里我以分组2为例子来配置定时器2使能更新中断请求和优先级:
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStruct);
上述代码就是使能中断请求和中断优先级配置的全部过程
(3)编写中断服务函数:
这一步需要注意两点:
- 中断服务函数的名称是确定的,所有的中断函数名称都可以在启动文件中找到
- 中断函数没有限制可以写在哪里,想写在哪里就写在哪里,但是为了方便管理,一般把中断函数写在stm32f10x_it.c文件中
编写中断服务函数这个步骤很简单,也很难,简单在,它没有什么限制,完全由编程者自己来决定写什么,这也中断的精髓所在,非常灵活;难就难在,它的上限非常高,高手和菜鸡的中断服务函数简直时天壤之别
在中断服务函数的编写有一个很重要的思想叫做:状态机;这个大家可以自行了解了,毕竟中断服务函数怎么写完全由你自己决定
好了,以上就是关于中断函数的总结,如果有讲的不够好的地方,欢迎大家指出哈!
|