中断(interrupt):

当中断来临时,系统将先保存现场作为端点(保存当前执行到的语句的地址),再跳入中断要执行函数,完成后又返回断点。
中断要执行函数不需要(也不应该)人为在代码中显式调用,系统会自动调用该函数。
中断可嵌套,高优先级中断可打断低优先级中断。

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°输出。