第一:STM32的中断类型分为两种:抢占优先级和响应优先级。抢占优先级决定了抢占行为,即当系统正在响应某中断L的时候,如果来了抢占优先级更高的异常H时,则H可以抢占L。而当抢占优先级相同的异常不止一个触发时,则最先响应响应优先级高的异常。如果抢占优先级和响应优先级都是相同的,则根据中断在中断向量表中的顺序进行响应。
第二:在对中断优先级进行定义时需要明确两个值。
- 芯片实际使用多少位来表达优先级,其中分别有多少位可以用来定义抢占优先级和响应优先级。
- 每个中断源的优先级如何定义。
针对第一个问题有了中断优先级分组的定义
void NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)中断分组设置
STM32把指定中断优先级的寄存器位减少到4位(AIRCR高四位),这四个思存器的分组方式可以有五种:
第0组:所有4位用于指定响应优先级
第1组:最高1位用于指定抢占式优先级,最低3位用于指定响应优先级
第2组:最高2位用于指定抢占式优先级,最低2位用于指定响应优先级
第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级
第4组:所有4位用于指定抢占式优先级
可以通过调用STM32的固件库中的函数NVIC_PriorityGroupConfig()选择使用哪种优先级分组方式,这个函数的参数有下列5种:
NVIC_PriorityGroup_0 => 选择第0组
NVIC_PriorityGroup_1 => 选择第1组
NVIC_PriorityGroup_2 => 选择第2组
NVIC_PriorityGroup_3 => 选择第3组
NVIC_PriorityGroup_4 => 选择第4组
中断优先级分组只是为了给抢占式优先级和响应优先级在中断优先级寄存器的高四位分配各个优先级数字所占的位数。
针对第二个问题即单独定义每个中断源的中断级别。
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)中断优先级设置
中断源优先级是在中断优先级寄存器中设置的,只能设置及高四位,必须根据中断优先级分组中设置好的位数来在该寄存器中设置相应的数值。假如你选择中断优先级分组的第3组:最高3位用于指定抢占式优先级,最低1位用于指定响应优先级,那么抢占式优先级就有000-111共八种数据选择,也就是有八个中断嵌套,而响应优先级中有0和1两种,总共有8*2=16种优先级。
在设置了中断优先级分组的情况下,可以在规定的位数内指定每个中断源的抢占优先级和响应优先级。
参考
- http://blog.sina.com.cn/s/blog_4fed55ce0100j7nd.html
- Cortex-M3权威指南(中文)
网友评论