1,中断的定义
中断执行流程
NVIC 就是STM32中用来管理中断,分配优先级的,NVIC的中断优先级总共有16个等级,可以设置抢占优先级,和响应优先级
灰色部分为内核中断,其他部分就是stm32外设中断。
NVIC嵌套中断向量控制器
NVIC是一个内核外设,是CPU的小助手,用来管理中断优先级和中断,
n的意思是一个外设同时占用多个中断通道,所以有n条线,NVIC只有一个输出口,NVIC根据每个中断的优先级分配中断的先后顺序。之后右边这个输出口告诉CPU,你该处理哪个中断。
分为抢占优先级和响应优先级
区别,响应优先级紧急的病人可以插队提前看病
这种绝定是不是可以中断嵌套的优先级,就叫抢占优先级(比如来了非常紧急的病人而医生还在看病,那么可以直接去看病不管前面在看病的那个人)
4位二进制可以表示0到15的数,对应16个优先级,这个优先级的值越小,优先级越高,0就是最高优先级。这4位可以进行切分,分为高 n位优先级和低4-n位优先级,抢占优先级和响应优先级都相同的按中断号排队 (中断号就是上面那个中断表的序号)
有上面的5种分组方式04,13.22.31.40
分组0就是0位的抢占等级,取值只能为0,4位的响应等级,取值可以为0-15
分组1是1位的抢占等级,取值是0-1,3位的响应等级,取值是0-7
分组方式是我们自己选择的,我们在配置优先级的时候,就要注意抢占优先级和响应优先级的取值范围,
EXTI外部中断(引脚电平变化,申请中断)
GPIO_Pin相同的不能同时触发中断,比如PA1,PB1,PC1,这几个GPIO_Pin是一样的不能同时触发中断。只能选择一个
外部中断总共加起来一共有20个中断线路,16个GPIO_Pin是主要功能,其他4个是用来“蹭网”的(外部中断有个功能,就是从低功耗的停止模式下唤醒stm32)对于PVD电源电压监测,当电源从电压过低恢复时,就需要PVD借助一下外部中断退出停止模式,对于RTC闹钟来说就是为了省电,RTC定一个闹钟之后,STM32会进入停止模式,等到闹钟响应的时候再唤醒,这也需要借助外部中断,其他几个也是类似的。
最后外部中断的触发响应方式可以是中断响应和事件响应
中断响应就是申请中断,让CPU执行中断
事件响应,当外部中断检测到引脚变化时,正常流程是选择触发中断,但在STM32中,也可以选择触发一个事件,如果选择触发事件,那外部中断的信号就不会通向CPU了;而是通向其他外设,用来触发其他外设的操作,比如触发ADC转换,触发DMA等
总结,中断响应式正常流程,引脚电平变化触发中断,事件响应不会触发中断,而是触发其他外设,属于外设之间的联合工作。
外部中断的基本结构
AFIO就是一个数据选择器,它可以在前面3个GPIO外设的16个引脚里选择其中一个链接到后面的EXTI通道里,这就是所有的GPIO口都能够触发中断但相同的GPIO_Pin不能够同时触发中断的原因。
然后通过AFIO选择之后16个通道,就接到了EXTI边沿检测及控制电路上,同时,下面4个“蹭网”
的外设也是并列进来的,这些加起来,就组成了EXTI的20个输入信号。
然后经过EXTI的电路之后,分为两种输出,其中,上面的这些,接到了NVIC,是用来触发中断。
本来20路输出,应该有20路中断输出,但是可能ST公司觉得这个20个输出太多了,比较占用NVIC的通道资源,所以把其中外中断的9-5和15-10,给分到一个通道里,也就是说,外部中断的9-5会触发同一个中断函数,15-10也会触发同一个中断函数,所有需要再根据标志位来区分到底哪个中断进来,下面这里有20条输出线路到了其他外设,这就是用来触发其他外设操作的,也就是我们上面所说的事件响应。
AFIO复用IO口和EXTI的内部电路