
一、外部中断原理" K H. u% i6 r9 T q/ b! I STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成% [: R' ], R, \: w" Q4 B( o9 { 每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求 23个中断/事件请求包括:) l& v+ Z5 L `" L IO可以做为EXTI线(0…15)【常用】 EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出2 m0 f2 G% `7 x1 v( c D) E EXTI 线 17 连接到 RTC 闹钟事件0 s" Z) P& q) V9 ` Z EXTI 线 18 连接到 USB OTG FS 唤醒事件 EXTI 线 19 连接到以太网唤醒事件9 _: W: `1 d8 j% s$ M# |6 l EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件4 C {* F" p3 [, v& o" t' {' s EXTI 线 21 连接到 RTC 入侵和时间戳事件 EXTI 线 22 连接到 RTC 唤醒事件 使用外部线中断需要开启AFIO中对应的中断功能, q2 f0 Z8 |5 w% k9 I+ T; \ F # q" ]3 D- t, ~, _: P ![]() GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上/ m( l, O6 ^5 ^" f 边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求0 j9 w G* o8 D) ? 中断产生过程=: (1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==, w* W7 B7 x* Z (2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0" S W6 B# F4 L3 V Z + ? P6 r0 m% a+ U+ P% t (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1 (4)或门输出的信号1, 输出的信号1发至请求挂起寄存器 (5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1& a Z* y% [* {5 i) D8 `9 u$ { (6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.; q5 n- O* e: {* X ( D8 a" ^+ P- o8 @; ~! e8 S" r0 N 事件产生过程: (1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变( o; G" Z% A/ N* R' P (2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。 (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号13 |1 w; I5 \. `; g$ n0 A3 R$ K , J+ D" b. P, J) r* I (4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲 ; _ g; y7 ?, v, A8 J 从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好 7 u% _6 Q9 z y: s* J 注: (1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数 A v* Z& p5 J4 ] / _+ N$ D# V9 s# e* T (2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果, - k1 v# A/ y Z 事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法 # H$ ^ b8 g1 v7 a' z) _; e8 j eg :: S8 q/ h) p, s2 ?# g 外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;! @; l+ m0 k' Q: \- g) H& q 2 ^4 T! t* j! |) U; h 若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果 相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务 二、配置外部中断 (1)将PA0配置成外部中断0 , [9 D0 I. n! ?5 C1 j- w$ X7 _0 q0 j ![]() * s/ M4 n8 Z [* j0 M6 W+ s* V( W (2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管 ![]() (3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级 9 e' ]/ S; @" q6 s$ W+ o+ b ![]() 生成CubeMX文件,进行移植需要有关PA0和外部中断的配置 7 z9 h8 W2 c$ L (4)优先级分组设置一般在msp.c文件的初始化中 ![]() (5)外部中断的中断服务函数在it.c的文件底部9 X3 L* U0 d7 F1 Y$ K9 J4 } 我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可 ' ]' k. u, [" { ![]() 小结 ![]() . P3 r( C2 M( a4 L" x: | 三、部分代码 外部中断引脚初始化 + F- X* z& i( T; W( `
外部中断处理函数–>回调函数 每按一次按键4,LED4和LED8反转一次& l7 L' [/ E, P- u3 J2 }5 Z
! H" T" h6 D) y" {/ L# b |