中断优先级设计
PS: 这片文章仅仅基于库函数开发
区别于51单片机的可怜的中断资源而言,cortex-M3内核拥有256个中断,其中包括16个内核中断和240个可屏蔽中断,但是stm32f103系列的单片机只保留了CM3内核的一部分资源,具体如图所示:
要学习stm32的中断概念, 还有一点需要理解的是,抢占优先级和响应优先级的概念:
1. 具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。
2. 当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据他们的响应优先级高低来决定先处理哪一个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。
简而言之,就是,抢占>响应,从这俩的英文命名中也能看出端倪,抢占优先级叫做Preemption-Priority,响应优先级叫做 Sub-Priority,主从关系一目了然。
stm32中配置中断优先级分组的寄存器有四个位(二进制运算位),其配置函数为:
void NVIC_PriorityGroupConfig(NVIC_PriorityGroup_x)
入口参数为:
1. NVIC_PriorityGroup_0:
0 bits 分配于抢占优先级, 4 bits 分配于响应优先级
2. NVIC_PriorityGroup_1:
1 bits 分配于抢占优先级, 3 bits 分配于响应优先级
3. NVIC_PriorityGroup_2:
2 bits 分配于抢占优先级, 2 bits 分配于响应优先级
4. NVIC_PriorityGroup_3:
3 bits 分配于抢占优先级, 1 bits 分配于响应优先级
5. NVIC_PriorityGroup_4:
4 bits 分配于抢占优先级, 0 bits 分配于响应优先级
以上NVIC_PriorityGroupConfig(); 是对全局中断分组的一个初始化,对于某一个中断分组,有着一个独特的结构体来实现 —— NVIC_InitTypeDef
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
首先,第一个结构体成员 NVIC_IRQChannel对应的是中断的类型:如串口中断,看门狗中断等,具体的可定义参数有:
(这些参数的意义以后再作说明)
第二个参数为:NVIC_IRQChannelPreemptionPriority,表示抢占优先级,根据开头对优先级分组的函数NVIC_PriorityGroupConfig()来说,不同的分组有着不同的限制
第三个参数为:NVIC_IRQChannelSubPriority,表示响应优先级
比如,NVIC_Group_3,两位抢占优先级,两位响应优先级,那么抢占优先级的最高设置为2^3-1=7,响应的最高则可以设置到2^1-1=1。
第四个参数 : NVIC_IRQChannelCmd,表示中断使能,一般来说,配置的时候给一个ENABLE表示开启即可。