一、异常与中断
- 系统异常体现在内核水平,外部中断体现在外设水平。
STM32F4xx中文参考手册
的向量表中列出了STM32F42xxx所有的系统异常和外部中断。
二、NVIC(Nested Vectored Interrupt Controller)
- 嵌套向量中断控制器,是内核里面的一个外设,用于控制整个芯片中断相关的功能。
1. NVIC寄存器介绍
- NVIC结构体定义如下,位于固件库core_cm4.h文件中
- 在配置中断时,我们通常只使用ISER、ICER和IP这三个寄存器,ISER用于使能中断,ICER用
于失能中断,IP用于设置中断优先级。
三、优先级
NVIC使用中断优先级寄存器NVIC_IPRx
来配置外部中断的优先级,IPR宽度为8bit,原则上每个外部中断可配置的优先级为0~255,数值越小,优先级越高。但绝大多数CM4芯片都会精简设计,以致实际上支持的优先级数减少,在F429中,只使用了高4bit:
- 用于表达优先级的这4bit,又被分组成主优先级( 抢占优先级)和子优先级。
- 在有多个中断同时响应时,抢占优先级高的中断会优先执行。
- 若抢占优先级相同,则比较子优先级,子优先级高的中断会优先执行。
- 若抢占优先级、子优先级均相同,则比较硬件中断编号(即向量表中
位置
列的编号),编号越小,优先级越高。
四、优先级分组
- 优先级分组用于确定抢占优先级与子优先级所占位数
- 如NVIC_PriorityGroup_1表示,分配1bit表示抢占优先级,3bit表示子优先级。
- 在编程中,可通过调用库函数NVIC_PriorityGroupConfig()来设置优先级分组。
- 有关NVIC中断相关的库函数都在库文件misc.c和misc.h中。
五、中断编程流程
1. 使能外设某个中断
- 涉及具体的外设中断使能控制位,如串口发送完成中断、接收完成中断都由串口控制寄存器的相关中断使能位控制。
2. 配置中断优先级分组
3. 初始化NVIC_InitTypeDef 结构体
- 注:中断源已经定义好了,不能自定义或写错,在stm32f4xx.h文件查找即可:
4. 编写中断服务函数
- 启动文件startup_stm32f429_439xx.s 预先为每个中断都编写了一个中断服务函数,但这些中断函数都是空的,尽是为了初始化中断向量表。
- 实际开发中,我们需要重新编写中断服务函数,且通常统一写在stm32f4xx_it.c文件中。