中断包括GPIO口电平变化中断、串口收发数据中断、超声波捕获中断、定时器更新中断等,这里以GPIO口电平变化为例进行介绍

 image

引脚检测到的高低电平信号会从输入线经过边沿检测电路。

 

image

 

 如果我们选择的是下降沿触发选择寄存器,那么下降沿触发选择寄存器中的第12位置1,上升沿触发选择寄存器第12位置0,如果边沿检测到的是低电平信号,那么上升沿触发选择寄存器会发送高电平信号

image

 触发选择寄存器发出的电平信号同软件中断事件寄存器一同进入或门(当程序触发事件中断时,外设会执行一定的操作,这里先不讲,反正是或门)

image

 

 之后请求挂起寄存器收到高电平信号,会将寄存器的第12位置1,如果中断屏蔽寄存器的12位也为1(这里我们在ioc界面将PB12引脚设置为GPIO外部中断的过程就是开启中断屏蔽寄存器的过程),那么会进入与门,同为1发出高电平信号

image

 最后电平信号传入NVIC嵌套向量中断控制器

image

 

 NVIC嵌套向量中断控制器掌管中断向量表,其中外部中断线0-4分别有自己单独的处理函数,外部中断线5-9共享中断处理函数EXIT9_5_IRQHandler,外部中断线10-15共享EXIT15_10_IRQHandler

image

 为了防止一直反复调用中断函数,在调用完成后需要将请求挂起寄存器对应位置清除为0,cubemx封装的IRQHandler函数包含了清楚位操作

image

 

image

 

image

 由于HAL库的时钟基准是SYSTICK,而默认的SYSTICK优先级很低低于中断处理函数,这里要想在中断IRQ函数中使用HAL_DELAY(),需要将SYSTICK的优先级高于外部中断优先级

image

 

image

 这里可以设置抢占优先级的位数,抢占优先级位数相同时比较响应优先级,一般直接设置为4位就可以

image

 

 

image

 

 

image