stm32f10x中断优先级
1、中断优先级分组
中断优先级分组使用函数 NVIC_PriorityGroupConfig,在该函数的注释部分已经说明了分组的参数
/**
* @brief Configures the priority grouping: pre-emption priority and subpriority.
* @param NVIC_PriorityGroup: specifies the priority grouping bits length.
* This parameter can be one of the following values:
* @arg NVIC_PriorityGroup_0: 0 bits for pre-emption priority
* 4 bits for subpriority
* @arg NVIC_PriorityGroup_1: 1 bits for pre-emption priority
* 3 bits for subpriority
* @arg NVIC_PriorityGroup_2: 2 bits for pre-emption priority
* 2 bits for subpriority
* @arg NVIC_PriorityGroup_3: 3 bits for pre-emption priority
* 1 bits for subpriority
* @arg NVIC_PriorityGroup_4: 4 bits for pre-emption priority
* 0 bits for subpriority
* @retval None
*/
void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)
{
/* Check the parameters */
assert_param(IS_NVIC_PRIORITY_GROUP(NVIC_PriorityGroup));
/* Set the PRIGROUP[10:8] bits according to NVIC_PriorityGroup value */
SCB->AIRCR = AIRCR_VECTKEY_MASK | NVIC_PriorityGroup;
}
举例:如果设置为 NVIC_PriorityGroup_1 表明1个bit位用来表示抢占优先级,3个bit位用来表示次优先级,即抢占优先级只能是0或1,只能进行1级中断嵌套, 次优先级可以是 0~8中的任意数。
在一个工程中只能对中断优先级组设置一次,一般在初始化调用NVIC_PriorityGroupConfig。
2、举例说明中断优先级的设置
设定中断优先级调用函数 NVIC_Init 对中断进行设置
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//设定抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//设定次优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
3、抢占优先级和次优先级
a、只有具备不同抢占式优先级的中断源可以产生嵌套中断,低优先级中断执行过程可以被高优先级中断打断。优先级的值越小,优先级越高。
b、相同的抢占式优先级中断同时发生优先响应次优先级等级较高的中断。
c、抢占式优先级和非抢占式优先级均相同的中断源同时发生时,优先响应中断顺序号较低的中断。