STMCU小助手
发布时间:2022-7-5 22:23
|
一、外部中断原理" s- ]# }3 b( L: o: g$ f STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成 2 ]/ V$ B7 n' B* t* S* z8 M- O6 R 每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求 5 v3 v* q8 j2 l$ { S4 { 23个中断/事件请求包括:4 t7 S4 C4 G- f+ v" L% y IO可以做为EXTI线(0…15)【常用】# T" @7 U1 y9 [1 X, u* _ EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出 EXTI 线 17 连接到 RTC 闹钟事件 EXTI 线 18 连接到 USB OTG FS 唤醒事件 EXTI 线 19 连接到以太网唤醒事件 EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件 EXTI 线 21 连接到 RTC 入侵和时间戳事件" u2 d. I( b; } EXTI 线 22 连接到 RTC 唤醒事件 使用外部线中断需要开启AFIO中对应的中断功能
GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上 2 p0 H3 e. \. ] 边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求- p2 a9 U. `6 R' S |4 S0 B 中断产生过程=: (1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变== & h- a8 |$ Q/ d) O (2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0 (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1 3 O6 ]8 U% K/ n- {3 d (4)或门输出的信号1, 输出的信号1发至请求挂起寄存器 ; y4 p F. @( {( }( ` (5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1 (6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽. d7 U% ?$ C$ x% }: W 事件产生过程:0 X- s2 K; y( i) t (1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变: h, K! c" e; ]' M ' b" m4 K1 p+ @) w: W4 F( G0 } (2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。1 @/ ^" z: v' v& |- ^% T (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1; a3 x* [* R4 C& n 2 r! V" A, Z2 M (4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲 从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好 ; A7 c2 F( ]; O/ `/ m! ]9 t 注: (1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数4 k, G: ?. B& x8 [8 e: c4 ~9 `' S ) i( G* k9 o" j( a' v8 }; X (2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果, 事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法 eg :& Q: {* L6 z" @% W" S# i4 g 外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;) S8 ?! a5 R$ h5 W% } - \- p: s+ s, D* C$ k0 q5 W 若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果/ o, _1 f9 B+ G7 i# h# i 相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务 , [+ y& o/ _( W* [ b' k" [ 二、配置外部中断7 ?9 d: s; r' q0 l1 R (1)将PA0配置成外部中断0 y3 L* x, I7 ^3 v2 k 0 p& d2 o+ o- v! O7 P: s5 e' G
$ ]) g/ f- V5 Q% Y (2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管
(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级 - g# Q) F! J9 O
( U6 U3 l7 ?! [- a3 @2 s 生成CubeMX文件,进行移植需要有关PA0和外部中断的配置 : u+ o4 L# }" X g- b (4)优先级分组设置一般在msp.c文件的初始化中
: K5 A9 y ~1 q8 _# R. E (5)外部中断的中断服务函数在it.c的文件底部: G, B: _0 \9 w0 p9 b3 Z! G 我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可
: q" J- Y6 ?7 ] 小结 ; O, u- Q1 `: l4 `+ H6 ^- U& b
三、部分代码 外部中断引脚初始化 + Z/ d" l) U% K' J# P, ?1 |# V
外部中断处理函数–>回调函数 每按一次按键4,LED4和LED8反转一次 8 U. P/ h4 s) N1 W% B
|
经验分享 | 基于STM32G4芯片TIM+SPI+DMA应用示例
STM32G47x 双 Bank 模式下在线升级
DMA 原理从 0 到 1:为什么它能解放 CPU?一文讲透 DMA 的工作流程
【福利三:雨露均沾·逢7狂欢】之一:STM32F1外部中断异常故障的解决办法
【经验分享】STM32G4之基本定时器
NUCLEO-G474RE 扩展 LSM6DSO 传感器数据融合实操演示全解析
经验分享 | STM32G474 高精度定时器同步功能全解析 从内部互联到多芯片协同的实现方案
经验分享 | STM32G4双BANK启动应用演示
STM32G4 LPTIM+DMAMUX 实现并行输出应用示例
实战经验 | LAT1578 SAU对NSC分区的影响
微信公众号
手机版