你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32G4之外部中断

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:23
一、外部中断原理
$ h/ y* x0 t4 ~# FSTM32G4 的每个 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)【常用】
7 ]1 z; s7 w0 l; `7 ^3 vEXTI 线 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 唤醒事件
* V& K1 G0 k7 S: Y, G/ lEXTI 线 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 唤醒事件
2 l$ |1 d# j$ |' x$ C使用外部线中断需要开启AFIO中对应的中断功能
" A, c( P8 _( P1 m, c! S/ s) k: G) j' U7 D" O# W' n( y: `* [. A
7~ULLK$N9E~%OHD65}I0F51.png
& K: L- R5 v2 k' p: o6 X2 K; U5 r4 L+ z3 q% x
GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上
% v: w- t3 p, G+ p$ |
1 J5 L- w- H) \; E& z3 o% J边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求
0 i- V- U/ Y! W% H/ i& s5 W9 L# R
中断产生过程=:
' O" D! c% {6 n9 r0 y% h7 L(1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==
" C8 m: l* g/ G' }
4 ?/ ~) S  {& P(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 ]

# ^8 ?) u) `7 `(4)或门输出的信号1, 输出的信号1发至请求挂起寄存器8 p5 z% L, L8 F/ n: Z

" s6 D5 F) i. L, P" f(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( ]

5 j! B+ E( H. w& e事件产生过程:
+ T( W7 V; R. c& y(1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变
5 h( n, M% z; N2 U# ^/ W& O4 F* a7 Z, _4 Q$ f: [& \, K& |% f
(2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。
9 F$ G$ Q6 Z9 p0 F5 k. 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

: F1 X6 u( T/ N- J  c% W- p0 X注:
7 z1 R* F8 W# l$ K2 j(1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数. ?" c* C  G1 r) T8 A! C  F

# G$ ^. P9 G7 i: q; [(2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果,
: D% a+ @6 P( w
- Q3 ~& ]3 o9 H2 K7 E& R* q事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法
( q' W; ^0 n, Q7 n& t* W/ H( d% I' a3 C2 t( @( u
eg :- `* ~$ C- a6 L1 N9 u
外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;
0 ]$ k9 F  P4 c) R5 A; A- x: @4 k7 s6 |$ X# O6 U( x
若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果  h) I5 o* w( e& }

6 `# q+ v  }( {/ e% n, H相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务5 p2 F# x% {* H7 v) X

8 K9 M! ^1 k9 G0 O二、配置外部中断
5 i3 m* b% J# K, |4 Q6 j(1)将PA0配置成外部中断0
0 G7 W! W8 C3 p2 @# @" X, y/ @, s: i5 U1 J6 o9 l# a# K
Y3V1Z8[[V2T)`VY@KQT_WVV.png
  y$ E( E2 I# ^4 @' p0 t5 F7 j8 V5 }. k: B( X! g
(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管3 V: {0 ]+ C- x0 ?% r" }
5 k, {8 p- ]: `
SA30N`MW@MY)61EQDZ94C$S.png
; r# i) [; k3 R5 K3 ^+ M8 x: U4 \4 W7 Y6 H* N3 b: H
(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级2 a! P; [3 ~' a7 P6 j' C' T

2 T* g8 t9 u: P2 H3 R8 l: E 1[@J_WTYGPS}6LC[_Q8[`R4.png
" m, @" h5 A. O$ Y+ m9 B: q" ^: b& D( |$ T3 V! W/ x: z
生成CubeMX文件,进行移植需要有关PA0和外部中断的配置; }& P3 }" }3 `: i

4 o2 U* f5 b! X% Y: H6 X(4)优先级分组设置一般在msp.c文件的初始化中2 \+ U5 ]6 W: M% W
/ u( p: ]  ?' W" ]$ P1 L
Y((F~([GT8B@LP$K9LU%}$X.png , }9 U% b$ u! k8 p

5 }8 M/ \) z6 ]/ G5 F! I8 O; s(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
Z4%ERE2)[{W[UXQ1P~]2K%U.png % |0 k. u! N( Z* ^
8 M/ ~% ?$ H" c7 H. z5 b* S# q2 d
小结
/ ^0 t, v9 G: a& D  j2 Y) s/ C/ |) F3 S
DROLT2RB9BC8NRY3WZ80PS6.png 0 \3 Z" ~+ Y( d0 o9 {

, Y5 m4 S6 k! G  W2 j三、部分代码
) t7 U- l8 T+ \1 J! C) I外部中断引脚初始化
0 L8 T, I7 q6 Q! X
" r& g+ O9 h# \2 o
  1. void Exit_Init(void)
    5 x8 W; p- z% G" R! c& L
  2. {
    ; J  j, F& `$ `. t$ z5 u4 ~
  3.         GPIO_InitTypeDef GPIO_InitStruct = {0};/ g# H0 B/ k* {8 f
  4.         __HAL_RCC_GPIOA_CLK_ENABLE();7 g1 O. I8 u3 A2 ?/ l  D
  5.         
    ) d& z. o3 p9 d; E; j
  6.   /*Configure GPIO pin : PA0 */5 Y* z7 q& o: l
  7.   GPIO_InitStruct.Pin = GPIO_PIN_0;' i7 w: r5 `7 s2 `: E* d
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    1 }, D7 d0 l) {/ I2 V9 _, P
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    " J9 P! o$ u5 ~
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    % G0 a1 q7 \7 R  Y# c+ g
  11.         
    ( H% P8 ]$ R, E! P- z; l& R! t4 B
  12.          /* EXTI interrupt init*/
    % U; R+ Z$ Q) a( {* o
  13.   HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 1);
    9 Y) [( A7 o3 R6 m) _
  14.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    % V. e# w6 A  R, m% p  c
  15. }
复制代码
) c5 ~* N  S7 \2 Z& t
外部中断处理函数–>回调函数, g! j% o" c; T5 q9 u
每按一次按键4,LED4和LED8反转一次9 a2 Q) P! {$ u% ^# J# }4 t$ }- P

  W0 w; e& Y/ t+ X5 @3 t& q# E
  1. // 外部中断回调函数, 产生外部中断,会跳转到外部中断的中断处理函数
    0 u( N. I) D+ ?1 E2 D
  2. // 中断处理函数又调用回调函数,进行中断处理; o. C9 f) e, M; g& ~3 ^- B
  3. // 每触发一次进入外部中断
    9 ^2 f5 _, w7 F% C1 K5 o
  4. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)2 I; Q" N) k  J# {
  5. {+ E3 A. `: m2 }- M
  6.         /* uclde = 0000 0000 ^ 1000 1000 =1000 1000  (1)
    7 z4 a7 X3 D! c* G- a
  7.            ucled = 1000 1000 ^ 1000 1000 = 0000 0000  (2)
    ) f* A8 p" J, C) {$ }& i
  8.                 uclde = 0000 0000 ^ 1000 1000 = 1000 1000  (3)
    2 Y; f& ?) j0 O& _, c: O0 b
  9.          如此下去继续反转2 s1 {' `# z4 ?3 P
  10.         与0相异或值不变,与1相异或值变化' R9 M% [; ~5 J' F2 b
  11.         */
    - P; z' b# @, M4 F
  12.         ucLed ^= 0x88;6 s* ?4 a& C7 K2 A  e
  13.         LED_Display(ucLed);
    ( Y- O' [& t% B
  14. }
复制代码

$ M. E7 Y1 s% m8 k
! q& v( K. h1 @: X# h6 f% K+ N' x9 l2 K) o( ]. W! u# N# s
2 {' q3 L! Z$ F& J( p
赞 收藏 评论0 发布时间:2022-7-5 22:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版