您的位置:首页 > 其它

STM32 嵌套向量中断控制器NVIC学习

2016-12-10 13:27 253 查看
STM32中有两个优先级的概念:抢占式优先级和响应优先级(也叫副优先级)。
他们的特性是:

1:高抢占式优先级的中断可以嵌套在低抢占式优先级的中断中:,即低抢占式优先级的中断可以被高抢占式优先级的中断打断;

2:当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。

3:如果两个具有相同抢占式优先级的中断同时到达,那么系统给先处理高响应优先级的中断;

3:如果两个中断的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪一个。

总的来看,它们的级别关系是: 抢占式优先级 > 响应优先级 > 中断表中的排位顺序。只有在上一级优先级相同时下一级优先级才会起作用。

在stm32系统中使用 抢占式优先级(NVIC_IRQChannelPreemptionPriority)和响应优先级(NVIC_IRQChannelSubPriority)
共同构成了一个 中断优先级,每个中断优先级共有4bit数据来表示其使用的抢占优先级和响应优先级,而中断优先级又被分成了四组,每一组使用一种抢占优先级数据位和响应优先级数据位的组合方式。

#define NVIC_PriorityGroup_0 ((uint32_t)0x700) /*!< 0 bits for pre-emption priority
4 bits for subpriority */
#define NVIC_PriorityGroup_1 ((uint32_t)0x600) /*!< 1 bits for pre-emption priority
3 bits for subpriority */
#define NVIC_PriorityGroup_2 ((uint32_t)0x500) /*!< 2 bits for pre-emption priority
2 bits for subpriority */
#define NVIC_PriorityGroup_3 ((uint32_t)0x400) /*!< 3 bits for pre-emption priority
1 bits for subpriority */
#define NVIC_PriorityGroup_4 ((uint32_t)0x300) /*!< 4 bits for pre-emption priority
0 bits for subpriority */如上述代码,第0组 NVIC_PriorityGroup_0 使用0bits表示抢占式优先级------NVIC_IRQChannelPreemptionPriority无效,4bits表示响应优先级--NVIC_IRQChannelSubPriority值可为0~15。因此,在这一组中的中断没有抢占式优先级,只有响应优先级,它们互相不可打断。
第2组  NVIC_PriorityGroup_2 使用2bits表示抢占优先级------NVIC_IRQChannelPreemptionPriority值可为0~3,使用2bits表示响应优先级NVIC_IRQChannelSubPriority值可为0~3。

无论使用哪一组,其优先级总数(抢占优先级*响应优先级)都是16.

stm32使用NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)来设置使用的中断优先级组。

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //使用中断优先级组1 -- 1bit表示抢占优先级,3bits表示响应优先级
// 设置先占优先级0~1,响应优先级0~7
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择中断线0
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级为 1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //中断使能
NVIC_Init(&NVIC_InitStructure);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM32 中断