stm32学习笔记(2)
中断和异常的区别
- 外中断——就是我们指的中断——是指由于外部设备事件所引起的中断,如通常的磁盘中断、打印机中断等;
- 内中断——就是异常——是指由于 CPU 内部事件所引起的中断,如程序出错(非法指令、地址越界)。内中断(trap)也被译为“捕获”或“陷入”。
- 异常是由于执行了现行指令所引起的。由于系统调用引起的中断属于异常。
- 中断则是由于系统中某事件引起的,该事件与现行指令无关。
NVIC
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设
在配置中断的时候我们一般只用ISER、ICER 和IP 这三个寄存器,ISER 用来使能中断,ICER 用来失能中断,IP 用来设置中断优先级。
中断的优先级在中断中非常重要,那么事件的优先级是在哪里进行定义的呢。在stm32中有一个寄存器叫做中断优先级寄存器NVIC_IPRx
,是用来做这件事情的。IPR长度为8bits但是F103中只有高4位来表达优先级。在F103中,对四个bits进行了分组,总共分为两种优先级,抢占优先级
和子优先级
。先比较抢占优先级,然后比较子优先级。
中断编程
配置中断的时候一般有三个步骤
- 使能外设某个中断
- 配置
EXTI中断源
,配置中断优先级 - 编写
中断服务函数
这里出现了几个新的概念,首先解释一下什么是中断服务函数
在启动文件startup_stm32f103xe.s 中我们预先为每个中断都写了一个中断服务函数,只是这些中断函数都是为空,为的只是初始化中断向量表,实际的中断服务函数都需要我们重新编写。attention:关于中断服务函数的函数名必须跟启动文件里面预先设置的一样
(个人理解为产生中断后会发生的事情)
EXTI:外部中断/事件控制器
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的20 个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
EXTI功能框图:
EXTI 可分为两大部分功能,一个是产生中断(红),另一个是产生事件(绿),这两个功能从硬件上就有所不同。
我们从右往左来看这个框图首先①为输入线,这个没什么特别需要说明的。②为边缘检测电路,用于检测高电平,低电平,或者电平的变化。③为一个或门,表示着软件和外部输入都能够产生中断。④是一个与门,它代表着如果要产生中断那么中断屏蔽寄存器和另一个输入都需要为1,这也从结构的角度说明了中断屏蔽寄存器是在起作用的。⑥ 电路是
一个与门,它一个输入来自编号3 电路,另外一个输入来自事件屏蔽寄存器(EXTI_EMR),这个和④门有极其相似的地方。⑦ 是一个脉冲发生器电路,当它的输入端,即编号6 电路的输出端,是一个有效信号1 时就会产生一个脉冲;如果输入端是无效信号就不会输出脉冲。
参考: 野火stm32库开发指南