您的位置:首页 > 其它

我对STM32F10x NVIC中断优先级的理解

2012-11-05 10:02 155 查看
NVIC中断优先级的理解

CM3支持硬件中断嵌套,分为抢占式优先级和亚优先级,使用规则主要有,抢占优先级高级别的可以打断低级别的,同一级别的抢占优先级同时发生时,亚当优先级高的先发生中断,若是相同,则按硬件排列顺序发生。若是有一个亚优先级正在执行中断,同一级别的其它亚优先级发生时,则先挂起,等此中断执行完再执行!

从库函数中找到优先级分组模式:

#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 */

从中可以看出第一组只有一个级别,16个亚优先级,我可以这样理解,若是分配成这个组里,不能发生嵌套中断,同时发生中断时,亚优先级高的先发生,若有中断执行时,必须等中断执行完才能执行下一个中断。最后一组正好相反,有15个级别,若是执行一个中断,可以最多嵌套15个中断执行一个中断。看下面的例子:

NVIC_InitTypeDef NVIC_InitStructure; //定义中断初始化类型结构体变量

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置优先级分组1 2个两个抢占优先级 8个亚优先级

NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //开口外部中断0

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//配置0号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;//亚优先级配置为0号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置

NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; //开口外部中断5到9

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置

NVIC_InitStructure.NVIC_IRQChannel = ADC1_2_IRQn; //ADC1中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//配置1号抢占式优先级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//亚优先级配置为1号

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能通道

NVIC_Init(&NVIC_InitStructure); //对外部中断0进行初始化配置

从上面的配置来看,外部中断0的优先级最高,可以打断ADC和外部5到9的中断,也就说可以嵌套发生,当ADC中断和外部5到9中断同时发生时,它们的抢占优先级别相同,亚优先级别也相同,因为ADC1硬件排在更靠前,则先发生ADC中断,若是两者任何一个中断正在执行,则等此中断执行完,再去执行另一个中断。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: