STMCU小助手
发布时间:2022-7-5 22:23
|
一、外部中断原理 STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成; M, ^# s7 P* l, C. V % r- T( O3 C: ]+ L- s* L/ A% _; K 每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求% G. S2 }" v5 S8 Z$ V ' U- T2 V4 f( e8 u 23个中断/事件请求包括: X8 k! P+ Q- }; J4 s1 o IO可以做为EXTI线(0…15)【常用】 EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出* O3 z5 ?+ H/ |' e/ w8 [! q EXTI 线 17 连接到 RTC 闹钟事件2 `$ n4 l+ k( V1 p* ?3 l6 q @+ Z6 r EXTI 线 18 连接到 USB OTG FS 唤醒事件 EXTI 线 19 连接到以太网唤醒事件0 ~ q% s7 i' f4 G3 t EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件$ p# x, {# v) S: S+ M EXTI 线 21 连接到 RTC 入侵和时间戳事件2 t- ]( }, c$ t C# m# c EXTI 线 22 连接到 RTC 唤醒事件 使用外部线中断需要开启AFIO中对应的中断功能 ) j' U7 D" O# W' n( y: `* [. A
2 K; U5 r4 L+ z3 q% x GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上 边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求 / i& s5 W9 L# R 中断产生过程=: (1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变== (2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0! i/ q6 m7 h0 _1 a1 r0 A; s 9 ]3 ?( z/ Q7 i, r8 D (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1" o, ^- @ t" Y% B: k2 ] (4)或门输出的信号1, 输出的信号1发至请求挂起寄存器8 p5 z% L, L8 F/ n: Z (5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1" Z$ H! T1 c& z% K! @ - g- o* s. F& e) d# F: C2 K (6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.! P7 ~9 [: j. U# X7 w( ] 事件产生过程: (1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变 4 F* a7 Z, _4 Q$ f: [& \, K& |% f (2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。 . n5 V9 V4 i" [5 E (3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1$ e8 w! z) _3 X - w6 B9 c' Y$ J6 B' w (4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲& f5 E* ~: ]% i/ d" l1 v " I. D+ O# [/ K 从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好" n O* }1 e: G1 p+ Y 注: (1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数. ?" c* C G1 r) T8 A! C F (2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果, 事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法 % I' a3 C2 t( @( u eg :- `* ~$ C- a6 L1 N9 u 外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果; 5 A; A- x: @4 k7 s6 |$ X# O6 U( x 若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果 h) I5 o* w( e& } 相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务5 p2 F# x% {* H7 v) X 二、配置外部中断 (1)将PA0配置成外部中断0 , s: i5 U1 J6 o9 l# a# K
' p0 t5 F7 j8 V5 }. k: B( X! g (2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管3 V: {0 ]+ C- x0 ?% r" } 5 k, {8 p- ]: `
+ M8 x: U4 \4 W7 Y6 H* N3 b: H (3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级2 a! P; [3 ~' a7 P6 j' C' T
& D( |$ T3 V! W/ x: z 生成CubeMX文件,进行移植需要有关PA0和外部中断的配置; }& P3 }" }3 `: i (4)优先级分组设置一般在msp.c文件的初始化中2 \+ U5 ]6 W: M% W / u( p: ] ?' W" ]$ P1 L
(5)外部中断的中断服务函数在it.c的文件底部$ B+ A0 D; W6 y/ Y( ` 我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可5 r* Y3 l" u( z 8 l, _4 X( l& r
8 M/ ~% ?$ H" c7 H. z5 b* S# q2 d 小结 2 Y) s/ C/ |) F3 S
三、部分代码 外部中断引脚初始化
外部中断处理函数–>回调函数, g! j% o" c; T5 q9 u 每按一次按键4,LED4和LED8反转一次9 a2 Q) P! {$ u% ^# J# }4 t$ }- P
2 K) o( ]. W! u# N# s 2 {' q3 L! Z$ F& J( p |
经验分享 | 基于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分区的影响
微信公众号
手机版