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

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

[复制链接]
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个中断/事件请求包括:
4 R: t0 B" X/ lIO可以做为EXTI线(0…15)【常用】
' p4 _- Y/ J4 V+ r! m# C. O1 W- kEXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出
* Y& |$ {9 S7 I: {2 H" t* tEXTI 线 17 连接到 RTC 闹钟事件8 w3 z3 K3 e: C. `* D! A
EXTI 线 18 连接到 USB OTG FS 唤醒事件
  J+ J3 D! \; V/ LEXTI 线 19 连接到以太网唤醒事件5 i; U5 N, g0 ]( f& `
EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
  k  U% H1 a8 j. `EXTI 线 21 连接到 RTC 入侵和时间戳事件9 x9 V4 v" \/ P: d1 ^) t% r
EXTI 线 22 连接到 RTC 唤醒事件
: h! Z) c; t: |; D2 T( D- o使用外部线中断需要开启AFIO中对应的中断功能
" C4 F3 [' z$ G$ U; y/ X1 W3 r2 \4 F5 G0 K
7~ULLK$N9E~%OHD65}I0F51.png
* y2 t" |, c- `7 q1 u7 Z+ J; d
# V8 H, B9 q! ^3 Z9 Y! n/ }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

% g- p2 l. @. O* h( f$ ~中断产生过程=:
& B6 N' u( I9 s6 q9 c9 Y0 f(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
0 `& q8 U' A* Z1 ^; w% ~4 V* [
$ J% Y6 {0 G4 l! H, T(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,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.
, w: ~$ ]4 z% b5 M) X
5 J: D+ @9 X- D, {事件产生过程:; ^# k& B+ U; l6 ?
(1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变
( H; O# V4 J. ^& O$ s1 M9 w0 ^2 g3 M8 U# G& [9 j9 s$ Q
(2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。
+ E2 |, W" ^9 }. q. m: y3 i7 W5 S* ?6 M7 W5 }8 e
(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1
: l, X/ @. Q+ C; Y. _6 f
; L9 M- a8 k) s5 H(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

& D7 N4 ?6 m9 m8 Z* m2 F& t注:
1 h% N0 m' V3 A(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" |

. ]1 Y0 @5 Y0 ^+ f" Keg :
2 _+ R* C: P5 u4 Y6 F4 V外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;4 [9 _+ {: Z) d3 n

0 n6 q- Q5 s' f& |3 d3 {; v若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果( V" g# v7 v  Z( ^
; V- _. a+ \" c# z, Z( N" J
相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务
& Q1 w. ^' _6 O3 [9 u0 f1 `* j- o+ y1 q: N; \: |  B+ X1 g6 {
二、配置外部中断
  D1 x* X8 H( [: ?3 A/ f" h(1)将PA0配置成外部中断0$ i8 L# d* C. m' V/ J' `8 N
4 F$ j) {/ c: P7 i% c! t, |) n
Y3V1Z8[[V2T)`VY@KQT_WVV.png ! m0 S0 K- s2 q+ _( j$ ~

1 F2 m2 N: b) A- Z. d(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管8 @! }5 \/ O# r$ U. G1 S; J$ k
2 }5 ~$ a/ R. u" f/ S! j6 |/ V
SA30N`MW@MY)61EQDZ94C$S.png ; H' }7 ~3 v! j2 \7 B6 Y
: G  u* B- b6 f2 L" J  `% U% M
(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级
" p& N& ^: A/ i2 M6 g; F
, k2 P- r! M$ x8 f8 R 1[@J_WTYGPS}6LC[_Q8[`R4.png
" h  l7 ]9 |8 V5 s  {6 Z  h
& N; |+ ?, y" {生成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

* n/ I/ Z3 @2 z& j& n6 H Y((F~([GT8B@LP$K9LU%}$X.png 6 _; r+ K% S, Y- i+ n
* J- K5 f; N' ]9 k2 e+ }: }$ U
(5)外部中断的中断服务函数在it.c的文件底部
* |/ h) _) M, X: S, m' V我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可" x! ~5 h9 @: G- f' y

: D/ f" l9 q) p$ t1 u: l' S Z4%ERE2)[{W[UXQ1P~]2K%U.png
2 G% q3 q) y2 ~) f9 A$ w) }6 w8 Y, G5 l2 X( U5 C/ ~
小结% G7 H) n4 v9 f/ s$ D& u4 _

- }2 X6 P# @* p: e3 z% D DROLT2RB9BC8NRY3WZ80PS6.png ; B, d4 G* m$ z7 m; Q

/ s8 K+ P0 H: w' p, d1 R3 b三、部分代码0 q1 l3 D2 Z1 l) ^1 ]5 C
外部中断引脚初始化
9 Y6 q* d4 ^9 r; G, O9 b6 c) B* s
  }6 L* Q+ z9 `# C
  1. void Exit_Init(void)4 _8 W1 _# A7 q5 F& R6 D4 I1 n6 q( S
  2. {
    $ ~3 q' s$ U9 p& y" q
  3.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    8 ^% ?# O! d) b7 |' b: N/ y
  4.         __HAL_RCC_GPIOA_CLK_ENABLE();. w, s7 g1 e' }& o, e
  5.         
    ( ]( h8 y. `) e- M4 \
  6.   /*Configure GPIO pin : PA0 */
    - Q- r$ a& Y9 r, b) C
  7.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    - N  B7 i7 v9 L2 R7 g
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;: k6 A; S+ ?9 L3 g2 V- A
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;- x, M+ Y+ A- L" W# R8 t/ N* |
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    - W' ?6 s1 W. v& t
  11.         # |5 S; P3 S' I, D6 W
  12.          /* EXTI interrupt init*/# h2 P1 Q; R( u: z, x& z
  13.   HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 1);
    , S9 x. }5 r- Q' r' d% G; r
  14.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    . T4 Y" ^5 K" F3 `9 i+ W7 m
  15. }
复制代码
* F. D7 @* X1 y7 d
外部中断处理函数–>回调函数$ r) ^/ N: P" ~3 v- F  B
每按一次按键4,LED4和LED8反转一次; T0 n: J* ]8 z  R2 T% L. {$ f

9 a, w  Y' N" A7 i* m( _
  1. // 外部中断回调函数, 产生外部中断,会跳转到外部中断的中断处理函数6 u) ~9 M, b! [" V3 D* r
  2. // 中断处理函数又调用回调函数,进行中断处理) f+ p) h! v! N9 v. Z% ]
  3. // 每触发一次进入外部中断
    . `$ P. ?: L; {5 I& J: d
  4. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    " s" p) X% k9 x! {# M
  5. {
    3 r, }' F( B$ ~" C
  6.         /* uclde = 0000 0000 ^ 1000 1000 =1000 1000  (1)
    1 U. y& L5 B$ N! a% X! i
  7.            ucled = 1000 1000 ^ 1000 1000 = 0000 0000  (2)
    9 d- a: w9 e, @7 t2 r
  8.                 uclde = 0000 0000 ^ 1000 1000 = 1000 1000  (3)
    % B/ q: U  f, _5 I
  9.          如此下去继续反转
    3 Z0 T" q, y$ J. o7 l( r! R
  10.         与0相异或值不变,与1相异或值变化& k" c3 ^6 ^% R# U4 e
  11.         */
    + P  W* n0 E! |4 |2 H/ M! b
  12.         ucLed ^= 0x88;( y# `6 f5 G( r+ h. ]% Q2 A2 l! K
  13.         LED_Display(ucLed);
    , U% z& F. ~6 Z0 V1 l
  14. }
复制代码
, |) g% b' Z4 I7 G

% R3 \6 Q" X* N6 D
% A7 A: g/ A! R8 v( T+ I  Z
1 h( j' l% S5 Q8 f% u
赞 收藏 评论0 发布时间:2022-7-5 22:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

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