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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:23
一、外部中断原理" s- ]# }3 b( L: o: g$ f
STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成
6 u1 o7 T- D2 B2 ]/ V$ B7 n' B* t* S* z8 M- O6 R
每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求
" L, B( n. ~+ ?) b5 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(可编程电压监测器,用于掉电检测) 输出
# d% E& a- w* @# B1 K% wEXTI 线 17 连接到 RTC 闹钟事件
0 N- z) L6 v' m/ U" T3 T9 a9 {  nEXTI 线 18 连接到 USB OTG FS 唤醒事件
( p* B: `+ D! u1 H! p* tEXTI 线 19 连接到以太网唤醒事件
% D% \0 v7 f4 ?EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
& x7 y" V& G  S0 u/ {EXTI 线 21 连接到 RTC 入侵和时间戳事件" u2 d. I( b; }
EXTI 线 22 连接到 RTC 唤醒事件
  S; |: e& S. p9 g3 E' E7 o) r2 L使用外部线中断需要开启AFIO中对应的中断功能
: Y* }+ n1 H3 X+ h- K0 P9 H4 E
. ~0 _6 Q( D' [4 m' T1 X! | 7~ULLK$N9E~%OHD65}I0F51.png - ?- I- W) i9 W

/ K& W* o2 C. _# kGPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上
+ O% G* h1 P3 w, ?; L& c" x2 p0 H3 e. \. ]
边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求- p2 a9 U. `6 R' S  |4 S0 B

/ d5 r* u# ]5 p中断产生过程=:
# |- K" j; W) p(1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==
+ Q: l$ K4 Y" M1 `2 X1 g: @& h- a8 |$ Q/ d) O
(2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0
. l: O7 \& u) J  f3 e- g
$ a0 D. v* L  ?8 g. Z3 _(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1
* K# o7 T  K  J3 O6 ]8 U% K/ n- {3 d
(4)或门输出的信号1, 输出的信号1发至请求挂起寄存器
2 n( p2 L7 L* H" F  j  r; y4 p  F. @( {( }( `
(5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1
8 U3 q4 U6 L% p3 u. b7 }* O& Z! `
9 p" e4 T! c- N, T8 ~  F( R(6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.  d7 U% ?$ C$ x% }: W

; Q1 o/ `1 _* E9 C- N事件产生过程: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

8 {* @4 [' K+ ~$ k' ^(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1; a3 x* [* R4 C& n
2 r! V" A, Z2 M
(4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲
7 j2 w( Y% S( u3 G
% E9 c$ d  u6 V0 v0 L从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好
2 u  ^  u$ Z7 s# N/ I% c0 a1 n) @- g; A7 c2 F( ]; O/ `/ m! ]9 t
注:
% F* q( c* [" a) ~9 r(1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数4 k, G: ?. B& x8 [8 e: c4 ~9 `' S
) i( G* k9 o" j( a' v8 }; X
(2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果,
7 k% E4 W& {- T  _
/ @/ r5 @# i  [事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法
, ^5 {9 L# [* |5 Z. O
2 Q2 u5 }0 u* T( Eeg :& 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

6 U3 B3 y8 F  R2 Z- G* |相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务
$ w3 ]6 q5 K- Y# r9 B: a, [+ 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
Y3V1Z8[[V2T)`VY@KQT_WVV.png ; `  g7 N4 S4 B9 Z$ O
$ ]) g/ f- V5 Q% Y
(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管
. }7 ~# \- v  X% s' z; Y/ P
% y; i5 Y  ], x0 e# {5 B# @ SA30N`MW@MY)61EQDZ94C$S.png
0 p* x: e) ]# K7 j: _: J( n) _
4 y" H; O* w/ R( V* F- F1 j(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级
1 @& E2 Q6 z9 X9 C5 e- g# Q) F! J9 O
1[@J_WTYGPS}6LC[_Q8[`R4.png
% m7 n: @' z/ Q  d4 `6 E( U6 U3 l7 ?! [- a3 @2 s
生成CubeMX文件,进行移植需要有关PA0和外部中断的配置
, N. T, X3 J  |3 {+ W# P5 {: u+ o4 L# }" X  g- b
(4)优先级分组设置一般在msp.c文件的初始化中
% Y: n2 ~  s5 M8 e6 F! O
9 j  o) }, p# w0 T; p3 m) N  _ Y((F~([GT8B@LP$K9LU%}$X.png
) X7 R: ~% C. o& c# p7 s* |: K5 A9 y  ~1 q8 _# R. E
(5)外部中断的中断服务函数在it.c的文件底部: G, B: _0 \9 w0 p9 b3 Z! G
我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可
8 s* Y! q% j" [% m" h) W
$ L; U8 o* }- t9 W: z- Z! K" _ Z4%ERE2)[{W[UXQ1P~]2K%U.png
8 G, ~8 d& k+ B  [6 N: q" J- Y6 ?7 ]
小结
# h/ x6 X% A8 [+ Q3 h% t; O, u- Q1 `: l4 `+ H6 ^- U& b
DROLT2RB9BC8NRY3WZ80PS6.png $ T: _1 p3 J: X- g1 K. Z2 x2 O

: F/ d' N  O: M; k6 N+ \3 M* f三、部分代码
' f" d$ M9 d. s7 ^' x- P外部中断引脚初始化
) v" M1 D( p" d$ X; c8 G+ Z/ d" l) U% K' J# P, ?1 |# V
  1. void Exit_Init(void)" f0 N, A- W. z
  2. {
    " v# z. ^2 ^. L# V! ~: {8 C% Y
  3.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    " E2 R" B9 x4 o9 [% m
  4.         __HAL_RCC_GPIOA_CLK_ENABLE();
    4 [2 V0 d" @( i5 [* @: R7 t
  5.         1 |9 h* T, D; }3 z( l* @
  6.   /*Configure GPIO pin : PA0 */3 P% ]+ j  G) n
  7.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    1 ?# }% `7 b: S  x& E
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    % J; u) F& k& W5 k/ S
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    : n  S6 ^  u9 o4 F, D2 A0 |
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);4 ]/ C% E; ]9 c
  11.         . b) P; ]& u4 O4 b0 s
  12.          /* EXTI interrupt init*/
    ( k# O( t) h8 a6 f( N
  13.   HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 1);( E3 G- E" y. g* A
  14.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    / X; |  [8 B8 o0 |
  15. }
复制代码

2 F$ ~8 i) l( V% R外部中断处理函数–>回调函数
) Y& x  m! o2 M* g+ N每按一次按键4,LED4和LED8反转一次
  h' Z3 X+ b) ^; S' x& H  d) ^9 j8 U. P/ h4 s) N1 W% B
  1. // 外部中断回调函数, 产生外部中断,会跳转到外部中断的中断处理函数/ e$ O" E6 I+ X  j7 L/ H4 Y5 R4 ^) ^4 @
  2. // 中断处理函数又调用回调函数,进行中断处理
    5 P  Q6 y: z# `" _% @
  3. // 每触发一次进入外部中断# a! u5 u4 \0 z, @$ b
  4. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    : R9 `9 R: n2 w- o
  5. {0 R# K; l* a+ N* I2 Z6 R, l. t
  6.         /* uclde = 0000 0000 ^ 1000 1000 =1000 1000  (1)3 B0 e& w& [" u  H/ m
  7.            ucled = 1000 1000 ^ 1000 1000 = 0000 0000  (2)6 R6 l0 K  ~; L/ m7 Q
  8.                 uclde = 0000 0000 ^ 1000 1000 = 1000 1000  (3)
    6 o7 K9 T" T  E+ n7 F7 y9 f# j
  9.          如此下去继续反转2 n! Z4 i' B( Y/ t. W( N, I
  10.         与0相异或值不变,与1相异或值变化/ Y" D9 ^( G' g
  11.         */
    * V. k  q1 N. I5 C
  12.         ucLed ^= 0x88;
    ( g5 |$ s* A! Z+ H8 H
  13.         LED_Display(ucLed);
    5 K$ C) z8 c& h0 g& m
  14. }
复制代码

% q( Y0 I2 Z0 K- I. o
6 ~9 V6 {, s* k  s; v
+ D8 ?! g, d5 e3 Q, s( x* m( K
1 D3 O* u0 h( V* ^; }- u/ b. X  r
赞 收藏 评论0 发布时间:2022-7-5 22:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

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