STM32外部中断笔记(一)
2018-02-02 13:16
246 查看
关于外部中断
前言:
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;
(以上纯属个人陋见,如有不恰之处,请指点,谢谢!)
前言:
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;
(以上纯属个人陋见,如有不恰之处,请指点,谢谢!)
相关文章推荐
- STM32学习笔记4:外部中断
- STM32学习笔记-外部中断
- STM32学习笔记整理之(2)——外部中断
- stm32学习笔记——外部中断的使用
- STM32学习笔记一一外部中断
- stm32学习笔记 F1系列外部中断EXTI
- STM32学习笔记整理之(2)——外部中断
- stm32学习笔记:GPIO外部中断的使用
- STM32-外部中断学习笔记
- STM32学习笔记:外部中断的使用
- stm32学习笔记——按键(外部中断)
- STM32学习笔记之外部中断实验
- cortex_m3_stm32嵌入式学习笔记(十五):待机唤醒实验(WK_UP外部中断)
- STM32-外部中断学习笔记
- STM32学习笔记:外部中断的使用
- STM32学习笔记——外部中断EXTI
- STM32学习笔记:外部中断的使用
- STM32学习笔记之EXTI(外部中断)
- STM32_外部中断_笔记
- stm32学习笔记——外部中断的使用