STMCU小助手
发布时间:2022-7-5 22:23
|
一、外部中断原理) j& e, t# O: W2 W- [ STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成 S& A8 D8 O% W" l 1 F3 u. V( o, ?$ H* Y' U 每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求, f6 I) M" U- R: u) B* p & O* H k# i2 \ 23个中断/事件请求包括: IO可以做为EXTI线(0…15)【常用】 EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出 EXTI 线 17 连接到 RTC 闹钟事件8 w3 z3 K3 e: C. `* D! A EXTI 线 18 连接到 USB OTG FS 唤醒事件 EXTI 线 19 连接到以太网唤醒事件5 i; U5 N, g0 ]( f& ` EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件 EXTI 线 21 连接到 RTC 入侵和时间戳事件9 x9 V4 v" \/ P: d1 ^) t% r EXTI 线 22 连接到 RTC 唤醒事件 使用外部线中断需要开启AFIO中对应的中断功能 / X1 W3 r2 \4 F5 G0 K
GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上" ~2 T& ^, g: ]& T. V% H) C. l 4 L5 f' K' Y! \5 R" E 边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求4 l; e r7 ?( p 中断产生过程=: (1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==4 N' E9 Q; w0 E' e3 i+ S. } 6 G! r0 Q4 p: o" X( G9 Q9 M4 N (2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号05 J8 \3 ]8 g! |) Z5 t 6 n0 f# C& r& G( ^0 M9 h' }& B" \ (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1 (4)或门输出的信号1, 输出的信号1发至请求挂起寄存器( z% ~- {: K: v9 R, q 0 ~6 d' `) v$ b: _" {, g( r- _ (5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1, w( z+ {$ c3 u% t! K 5 {" T) v [2 p$ c (6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽. 事件产生过程:; ^# k& B+ U; l6 ? (1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变 0 ^2 g3 M8 U# G& [9 j9 s$ Q (2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。 7 W5 S* ?6 M7 W5 }8 e (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1 (4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲 X# M4 _1 Y% ^/ e7 X2 ` # ^! l6 o% @2 `3 R" h9 i3 v, A5 q 从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好8 K: I$ |' y: p, F 注: (1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数* t# t6 L+ ^. n U6 K& n' \3 w ) j8 Q4 v% N. z (2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果,7 \) q8 |7 ^# h * i! i; k% X0 a/ u* _# p0 n 事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法 B2 \# @3 k6 q* w7 h" | eg : 外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;4 [9 _+ {: Z) d3 n 若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果( V" g# v7 v Z( ^ ; V- _. a+ \" c# z, Z( N" J 相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务 - o+ y1 q: N; \: | B+ X1 g6 { 二、配置外部中断 (1)将PA0配置成外部中断0$ i8 L# d* C. m' V/ J' `8 N 4 F$ j) {/ c: P7 i% c! t, |) n
(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管8 @! }5 \/ O# r$ U. G1 S; J$ k 2 }5 ~$ a/ R. u" f/ S! j6 |/ V
: G u* B- b6 f2 L" J `% U% M (3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级
生成CubeMX文件,进行移植需要有关PA0和外部中断的配置 A# R s- ?3 M1 O* y) ~3 C) Z & {3 {" [9 K5 V4 Y1 c (4)优先级分组设置一般在msp.c文件的初始化中" f" `, {1 T) A. `$ Q
* J- K5 f; N' ]9 k2 e+ }: }$ U (5)外部中断的中断服务函数在it.c的文件底部 我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可" x! ~5 h9 @: G- f' y
$ w) }6 w8 Y, G5 l2 X( U5 C/ ~ 小结% G7 H) n4 v9 f/ s$ D& u4 _
三、部分代码0 q1 l3 D2 Z1 l) ^1 ]5 C 外部中断引脚初始化
外部中断处理函数–>回调函数$ r) ^/ N: P" ~3 v- F B 每按一次按键4,LED4和LED8反转一次; T0 n: J* ]8 z R2 T% L. {$ f
|
经验分享 | 基于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分区的影响
微信公众号
手机版