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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:23
一、外部中断原理" K  H. u% i6 r9 T  q/ b! I
STM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成% [: R' ], R, \: w" Q4 B( o9 {

# I2 F. P# K1 {5 J$ b, t! Z. v! ^每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求
0 I+ j2 I- F# V
. |& `3 g; F( y% j) Z% `8 ^2 h23个中断/事件请求包括:) l& v+ Z5 L  `" L
IO可以做为EXTI线(0…15)【常用】
* _. h- B! o! n9 D0 k4 ~( iEXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出2 m0 f2 G% `7 x1 v( c  D) E
EXTI 线 17 连接到 RTC 闹钟事件0 s" Z) P& q) V9 `  Z
EXTI 线 18 连接到 USB OTG FS 唤醒事件
8 i9 F, c2 J/ W# {% c' a+ aEXTI 线 19 连接到以太网唤醒事件9 _: W: `1 d8 j% s$ M# |6 l
EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件4 C  {* F" p3 [, v& o" t' {' s
EXTI 线 21 连接到 RTC 入侵和时间戳事件
- S3 H9 y9 f: u) x7 zEXTI 线 22 连接到 RTC 唤醒事件
) m1 z* \' m5 v& m/ [使用外部线中断需要开启AFIO中对应的中断功能, q2 f0 Z8 |5 w% k9 I+ T; \  F
# q" ]3 D- t, ~, _: P
7~ULLK$N9E~%OHD65}I0F51.png
& @5 D9 B4 Z' `1 W! |
+ W, l" {; N) c, ?% D- }" C) K$ nGPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上/ m( l, O6 ^5 ^" f

6 H  a* P+ ]- g+ ]8 t边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求0 j9 w  G* o8 D) ?

: U/ q' Q2 A4 B& o. [' U中断产生过程=:
6 ]+ n9 g2 f% |8 R(1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==, w* W7 B7 x* Z

3 ?- {, h+ P6 \7 ?, W+ F9 {(2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0" S  W6 B# F4 L3 V  Z
+ ?  P6 r0 m% a+ U+ P% t
(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1
0 r2 D6 c! m9 F6 @- S3 M7 t& z6 z
- W& `* I3 S: P2 [& G(4)或门输出的信号1, 输出的信号1发至请求挂起寄存器
" H0 C- M4 A4 H: S# V' r0 @
2 d; s7 w: W* Z(5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1& a  Z* y% [* {5 i) D8 `9 u$ {

! U6 b+ S! Q4 n* L+ {( \(6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.; q5 n- O* e: {* X
( D8 a" ^+ P- o8 @; ~! e8 S" r0 N
事件产生过程:
( O9 E+ R: ?; k; E(1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变( o; G" Z% A/ N* R' P

* S( n$ U& V% W5 {& d0 u* i+ s(2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。
6 @; K) L/ f; D* x
1 `) o0 D! z4 m* l) A$ a1 s(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号13 |1 w; I5 \. `; g$ n0 A3 R$ K
, J+ D" b. P, J) r* I
(4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲
+ ?1 J; H$ b. ]1 [; _  g; y7 ?, v, A8 J
从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好
- \& W1 i% _# Z) u% T7 u% _6 Q9 z  y: s* J
注:
  Q. J$ Y- s- O- u; D(1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数  A  v* Z& p5 J4 ]
/ _+ N$ D# V9 s# e* T
(2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果,
7 e8 {$ C+ j$ ~0 X; r* G" H  S/ G! g- k1 v# A/ y  Z
事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法
, X; N( Z7 n- @, P" D4 ?- H# H$ ^  b8 g1 v7 a' z) _; e8 j
eg :: S8 q/ h) p, s2 ?# g
外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;! @; l+ m0 k' Q: \- g) H& q
2 ^4 T! t* j! |) U; h
若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果
4 Y/ F# N9 C; A4 d$ \4 H6 }, L
* g7 G4 o: k$ i+ T相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务
4 k% z/ Z2 v  N! A3 T: V
$ p: z! {/ X" O% j, o3 X& A二、配置外部中断
- y* y0 ?+ M$ d, W" |(1)将PA0配置成外部中断0
+ x" j% j* e# t# x/ _& C$ x! ~, [9 D0 I. n! ?5 C1 j- w$ X7 _0 q0 j
Y3V1Z8[[V2T)`VY@KQT_WVV.png # `9 `$ p  v+ K" A$ e
* s/ M4 n8 Z  [* j0 M6 W+ s* V( W
(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管
* h3 P7 _0 x. R: c6 K. ^# T( \
8 Z% T; E1 p& ~* Z7 b3 C! y SA30N`MW@MY)61EQDZ94C$S.png " T0 T6 y2 [) C$ x

1 d- C7 y% j2 k- m; u/ J9 u8 O% q(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级
" J2 f+ b4 i9 x  Y1 }7 K9 e' ]/ S; @" q6 s$ W+ o+ b
1[@J_WTYGPS}6LC[_Q8[`R4.png
* }8 m( |  @- @+ e$ v- C
2 L- b/ R) ~- w/ G! b# e3 C, i生成CubeMX文件,进行移植需要有关PA0和外部中断的配置
4 X* X' U' f* B/ r2 K# G7 z9 h8 W2 c$ L
(4)优先级分组设置一般在msp.c文件的初始化中
1 s5 B- N% O7 R# R5 z
( L' a! T- Y2 }. k* T: Z# i Y((F~([GT8B@LP$K9LU%}$X.png
, E; p4 _* e* J$ a4 @: g
; ~- ?* U' R4 C4 W+ a6 q(5)外部中断的中断服务函数在it.c的文件底部9 X3 L* U0 d7 F1 Y$ K9 J4 }
我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可
$ j. ^. [7 p: Y% X! e2 F7 n' ]' k. u, [" {
Z4%ERE2)[{W[UXQ1P~]2K%U.png . j( c& r- |! F! u: L2 I

6 O/ h9 M& A/ ~: c" j) o小结
6 g3 Z5 T& T4 ?/ S
9 {+ I! H3 S9 M# B2 O DROLT2RB9BC8NRY3WZ80PS6.png
/ e& _- f" z2 x! U" C7 F5 b. P3 r( C2 M( a4 L" x: |
三、部分代码
6 z/ l5 F3 ~1 f4 o# _$ D0 N- w外部中断引脚初始化
% w0 R/ a  V+ D7 I3 Z/ b) r+ F- X* z& i( T; W( `
  1. void Exit_Init(void)2 [/ ~' H- ~" S- g2 q! t' ?
  2. {
    $ f. \  v6 x( ~  Q/ ~( F
  3.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    , \) s( k( j3 Q
  4.         __HAL_RCC_GPIOA_CLK_ENABLE();
    $ M* E( \% x0 e9 S9 d
  5.         ; H& a. L$ m+ }
  6.   /*Configure GPIO pin : PA0 */; X+ x5 p% j! i! l. [8 i' k9 l1 V
  7.   GPIO_InitStruct.Pin = GPIO_PIN_0;3 ^4 P. Q3 a. v- ~, e+ J
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    # ^, v% r& ^; z: L# _. ], G* @+ I
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;9 [; r# b" L) J2 B6 P5 A8 J' h4 q
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    ) |! @; L* }8 ?3 S& Y
  11.         6 V* g5 e. Z- b3 s$ X1 B
  12.          /* EXTI interrupt init*/
    . y2 T5 a( p9 T, u
  13.   HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 1);9 g% B8 P9 v( B: f! f9 i! a
  14.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);1 i5 C* Q+ F# ^- @" P
  15. }
复制代码
- n9 F) F/ y- v* z6 v, [1 i+ e, T
外部中断处理函数–>回调函数
) O" x% P- n0 f# {& m每按一次按键4,LED4和LED8反转一次& l7 L' [/ E, P- u3 J2 }5 Z

" W3 v1 u1 q4 B% l4 K4 P
  1. // 外部中断回调函数, 产生外部中断,会跳转到外部中断的中断处理函数
    ! m0 Q8 f0 b1 Q2 n
  2. // 中断处理函数又调用回调函数,进行中断处理
    + O, F9 Q* i8 j( O
  3. // 每触发一次进入外部中断
    : ]$ ?: ^0 r: @. _( n& O6 z$ a$ l
  4. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)& r# q; ]* {0 k5 g6 t
  5. {# _$ H5 f  D, \4 P4 b
  6.         /* uclde = 0000 0000 ^ 1000 1000 =1000 1000  (1)
    6 {2 Z, Q- \8 K
  7.            ucled = 1000 1000 ^ 1000 1000 = 0000 0000  (2)
    - |5 R- |' U6 |% c& f) ^4 u
  8.                 uclde = 0000 0000 ^ 1000 1000 = 1000 1000  (3)
    + e7 [/ J) N7 A- o
  9.          如此下去继续反转* [" T; D2 }- E
  10.         与0相异或值不变,与1相异或值变化
    ; L: _* ~, Y5 V  Q) w- O) a
  11.         */
    ; W4 H2 M9 K, F2 q
  12.         ucLed ^= 0x88;
    & {1 N' t7 [, ?. Q
  13.         LED_Display(ucLed);7 s$ Z$ O! i! k. W7 V
  14. }
复制代码
3 p7 b' e2 j6 w# d

6 _7 c' ~6 ~* b% r0 P8 P! H" T" h6 D) y" {/ L# b

/ n) W( R, R8 g$ ~' ^
收藏 评论0 发布时间:2022-7-5 22:23

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版