
一、外部中断原理 STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成 每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求 & C! ~7 Z$ N' o* O% r- G* c 23个中断/事件请求包括:- v) ]4 i) m# e( R' R9 `: A6 M2 W IO可以做为EXTI线(0…15)【常用】 C, J( ?9 H0 L0 M# u$ s EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出 EXTI 线 17 连接到 RTC 闹钟事件+ n2 J. t" N# Q, Y0 t) e6 @' b EXTI 线 18 连接到 USB OTG FS 唤醒事件 EXTI 线 19 连接到以太网唤醒事件 EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件6 ]; D) U8 X) V, | k2 W EXTI 线 21 连接到 RTC 入侵和时间戳事件1 A7 y( S. |- i& \' s$ W EXTI 线 22 连接到 RTC 唤醒事件 使用外部线中断需要开启AFIO中对应的中断功能 ![]() , M0 B2 j7 k9 e) d4 F; `. Y GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上! E5 b. F' c Q3 C# S1 T0 N 边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求 : y- Y" Q, W" @* v: Y 中断产生过程=:; T( G/ n0 U' f (1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变== ! L( R+ d s3 c* [9 y- ^; q( I; d (2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0 # }' S1 E! K; d" |' j: c: W (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1# P* L6 h+ X9 J1 C$ N. v; y ! i& j( k0 P( I5 i( y. T3 E- f (4)或门输出的信号1, 输出的信号1发至请求挂起寄存器 (5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1 (6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.8 y% A/ P b. M# [% ^' o3 Y 9 ~( m6 E0 E- L- m( k; |2 b+ h 事件产生过程: (1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变3 u7 h# C0 I+ O * |) |: \, r: m6 k6 O2 c (2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。6 Q, B) _4 H/ s3 Z9 I * P# W: t) z/ `1 P! D4 m& B* G8 p (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1 & Z; x& ]" b. a/ @, b' V) | (4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲 s, Q2 S+ G# I 从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好' ?: T+ c, g- h* S! x' R6 g) D |6 V ?5 a6 Y! n 注: (1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数 8 ~3 S& F1 Q" X (2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果, 4 k2 [, U8 T- z+ H' h7 R( D u1 r 事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法 eg : 外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;/ O/ M% W4 Y v1 i& ~ 若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果0 o6 Q# ~8 P# L7 ?- I9 [) o 相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务5 I' a1 p8 e1 U" T 二、配置外部中断3 [4 s% b# y4 H) [. b l& F (1)将PA0配置成外部中断0" H1 C5 U$ G0 ~! ]# D g) x$ V6 }) n0 Y2 J' x ![]() (2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管; |% Q' w1 o, {" H/ o. d & t! Y' [, Z/ G ![]() (3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级0 R) v, V* h& W C+ ^! f( d4 c9 }0 a ![]() - k3 y3 ~+ @% C9 i 生成CubeMX文件,进行移植需要有关PA0和外部中断的配置 - z2 q2 E4 g/ b4 x. M' t (4)优先级分组设置一般在msp.c文件的初始化中 ![]() 9 a4 G0 x+ _% T# J5 B3 Y (5)外部中断的中断服务函数在it.c的文件底部 我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可# y4 _$ s! S) S # b8 ^8 E3 l; I/ Q- P ![]() 1 W1 W, v! X" ^3 r9 e4 @ ` 小结 - u: T' b8 H: c& R0 |4 c d ![]() J' o7 n6 C# _6 ]2 } 三、部分代码9 B; F& m. J3 o 外部中断引脚初始化% F7 _2 R3 B) P3 r6 U: t2 Q
外部中断处理函数–>回调函数 每按一次按键4,LED4和LED8反转一次 % J4 Y$ f" Y7 U: V: B! {4 `
|
STM32固件库分享,超全系列整理
STM32G系列RS485自动收发控制以及自适应波特率实战
【学习指南】基于STM32G474VET6 开发板实验经验分享(三)
【学习指南】基于STM32G474VET6 开发板实验经验分享(二)
【学习指南】基于STM32G474VET6 开发板基础实验经验分享一
【学习指南】基于STM32G474软件平台安装与使用教程
【学习指南】基于STM32G474VET6 开发板硬件资源解析
STM32 Explore | 基于STM32G474的STM32Cube生态系统线下培训
STM32G47x 双 Bank 模式下在线升级
基于STM32串口中断之缓存区溢出卡死经验分享