关于外部中断
前言:
1:Cortex-M3允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此,STM32吧指定中断优先级的寄存器为减少到4位,即AIRCR的高四位,于是对四位进行分组:
组别 分配情况
第0组 0:4 无抢先式优先级,16 个子优先级
第1组 1:3 2 个抢先式优先级,8 个子优先级
第2组 2:2 4 个抢先式优先级,4 个子优先级
第3组 3:1 8 个抢先式优先级,2 个子优先级
第4组 4:0 16 个抢先式优先级,无子优先级
使用函数:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_n); (n=0,1,2,3,4) 即可完成中断分组,那我们该如何使用分组呢?
例如: 现在选择分组3,也就是说此时芯片可以同时处理8个抢占优先级,2个子优先级,即 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =(0,1,2,3,4,5,6,7根据需要任选一个) ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =0,1(选0或1);
注意:1:只有抢占优先级可以嵌套,响应优先级不可以嵌套。嵌套的意思为打断,0级抢占优先级可以打断 1,2,3,4等抢占优先级;
2:抢占优先级不同时,高优先级的程序首先执行,当抢占优先级相同时,中断按照先来后到执行,若有两 个中断同时到来,则按照响应优先级的高低执行,注意,前提是中断同时到来,若响应优先级也相同, 则根据对应中断在中断向量表中的排位先后执行。
外部中断配置步骤:
1:开启时钟,配置相应的端口(包括中断源的引脚);GPIO_Init();
2:选取中断源:
例:GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource4);
3:配置EXTI寄存器:
typedef struct
{
uint32_t EXTI_Line;
EXTIMode_TypeDef EXTI_Mode;
EXTITrigger_TypeDef EXTI_Trigger;
FunctionalState EXTI_LineCmd;
} EXTI_InitTypeDef;
4:选取中断分组:(整个过程中只能配置一次)
例:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);
5:配置NVIC:
typedef struct
{
uint8_t NVIC_IRQChannel;
uint8_t NVIC_IRQChannelPreemptionPriority;
uint8_t NVIC_IRQChannelSubPriority;
FunctionalState NVIC_IRQChannelCmd;
} NVIC_InitTypeDef;
(以上纯属个人陋见,如有不恰之处,请指点,谢谢!)