STM32中断学习个人学习总结

外部中断

NVIC(嵌套向量中断控制器)

NVIC寄存器

ISER[8]:ISER 全称是:Interrupt Set Enable Registers,这是一个中断使能寄存器组

要使能某个中断,必须设置相应的 ISER 位为 1,使该中断被使能(这里仅仅是使能,还要配合中断分组、屏蔽、IO 口映射等设置才算是一个完整的中断设置)

ICER[8]:全称是:Interrupt Clear Enable Registers,是一个中断除能寄存器组。

该寄存器组与 ISER 的作用恰好相反,是用来清除某个中断的使能的。这里要专门设置一个 ICER 来清除中断位,而不是向 ISER 写 0 来清除,是因为 NVIC 的这些寄存器都是写 1 有效的,写 0 是无效的。

ISPR[8]:全称是:Interrupt Set Pending Registers,是一个中断使能挂起控制寄存器组。

每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更 高级别的中断。写 0 是无效的。

ICPR[8]:全称是:Interrupt Clear Pending Registers,是一个中断解挂控制寄存器组。

其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断解挂。写 0 无效。

IABR[8]:全称是:Interrupt Active Bit Registers,是一个中断激活标志位寄存器组。

对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只 读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。

IP[240]:全称是:Interrupt Priority Registers,是一个中断优先级控制的寄存器组。这个寄存器组相当重要!

每个可屏蔽中断占用的 8bit 并没有全部使用,而是只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优 先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB->AIRCR 中的中断分组 设置来决定。

中断优先级

抢占优先级:抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。

响应优先级:抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。

 NVIC 相关函数

HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。其声明如下: void HAL_NVIC_SetPriorityGrouping(uint32_t PriorityGroup);

形参 1 是中断优先级分组号,可以选择范围:NVIC_PRIORITYGROUP_0 到NVIC_PRIORITYGROUP_4(共 5 组)。

HAL_NVIC_SetPriority 函数:HAL_NVIC_SetPriority 是设置中断优先级函数。其声明如下:
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);

形参 1 是中断号,可以选择范围:IRQn_Type 定义的枚举类型,定义在 stm32f103xe.h 。 形参 2 是抢占优先级,可以选择范围:0 到 15。 形参 3 是响应优先级,可以选择范围:0 到 15。

HAL_NVIC_EnableIRQ 函数:HAL_NVIC_EnableIRQ 是中断使能函数。
其声明如下: void HAL_NVIC_EnableIRQ(IRQn_Type IRQn);

函数形参:形 参 IRQn 是 中 断 号 , 可 以 选 择 范 围 : IRQn_Type 定 义 的 枚 举 类 型 , 定 义 stm32f103xe.h。

HAL_NVIC_DisableIRQ 函数:HAL_NVIC_DisableIRQ 是中断除能函数。
其声明如下: void HAL_NVIC_disableIRQ(IRQn_Type IRQn);

用于软件复位系统。

EXIT

EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/中断请求的边沿检测器组成。

每一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。

每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。

当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。

实际上 M3 芯片为了精简设计,只使用了高四位[7:4],低四位取零,这样以至于最多只有 16 级中断嵌套,即 2^4=16。

产生中断线路目的使把输入信号输入到 NVIC,进一步运行中断服务函数,实现功能。而 产生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。

作者:ShaunZ

物联沃分享整理
物联沃-IOTWORD物联网 » STM32中断学习个人学习总结

发表评论