外部中断
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);
用于软件复位系统。