当中断来临时,系统将先保存现场作为端点(保存当前执行到的语句的地址),再跳入中断要执行函数,完成后又返回断点。 中断要执行函数不需要(也不应该)人为在代码中显式调用,系统会自动调用该函数。 中断可嵌套,高优先级中断可打断低优先级中断。
stm32的中断:
stm32f103有60个可屏蔽中断通道(中断源),包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设。 使用NVIC(nested vector interrupt controller,嵌套向量中断控制器)来统一管理中断和分配优先级。 每个中断通道都有16个可编程优先级,还可以对优先级分组,进一步还能设置抢占优先级和响应优先级。 中断向量表:(中文手册p132,灰色部分是内核中断,通常用不到。白色部分是外设中断。) 中断地址列表:由于硬件限制,中断只能跳转到固定位置,而用户写的中断执行函数的地址是不固定的,故需要用终端地址作为中转。 存储用于跳转到用户写的中断执行函数的代码(由C语言编译器自动写上),故中断地址列表又被称为中断向量表。
NVIC和AFIO:
NVIC接收多个外设输入,只有一个输出给CPU(最高优先级中断)。 看下图2,EXTI5到9和EXTI10到15接到同一个NVIC中断里,执行同一个中断函数(为了节省NVIC引脚)。
AFIO除了用于中断引脚选择,还用于复用功能引脚重映射。
NVIC优先级分组:
抢占优先级:如果现在正在中断中,立刻停止当前中断,执行此中断。(优先级高的抢占优先级低的,可做中断嵌套)(形象比喻:患者直接插队到诊室) 响应优先级:如果现在正在中断中,继续当前中断,在当前中断结束后立即执行此中断。(形象比喻:患者插队到队伍前面) 值越小,优先级越高,0优先级最高,15最低。 当两个函数的抢占优先级和相应优先级都相同时,看下表中的第二列优先级进行,同样值越小,优先级越高。
EXTI(外部中断):
外部中断还有一个功能:从低功耗的停止模式下唤醒stm32切换到正常模式。(下图“通道数”的后四个) 下图“相同的pin不能同时触发中断”:即GPIO_Pin_x,x相同的引脚不能同时触发中断。如PA3,PB3,PC3不能同时触发。而PA3,PA4,PB2可以。 解释:看NVIC结构图2,GPIO先通过AFIO(中断优先级选择),再接到EXTI。PA3,PB3,PC3经过AFIO后,只有一个pin能进入EXTI的3脚输入。
EXTI结构图:(输入线一共20脚,16来自AFIO选择的GPIOpin+4特殊通道)
Q:什么时候用外部中断? A:当想要获取的信号是有外部驱动的很快的突发信号。(如旋转编码器输出、红外计次输出)
这种常见的旋转编码器,中间的轴可以按下,由上侧引脚输出。支持识别正反转和速度。 识别正反转:这种旋转编码器有特制的轴下金属片阵列,产生90°的相位差(相位差90°的波形也叫正交波形)。正转时,A比B先90°输出。反转时,B比A先90°输出。