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

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

[复制链接]
STMCU小助手 发布时间:2022-7-5 22:23
一、外部中断原理
  B4 {: B2 o% D7 k% wSTM32G4 的每个 IO 都可以作为外部中断的中断输入口,stm32芯片集成了一个外部中断/事件控制器(EXTI),由23个能产生事件/中断请求的边沿检测器组成
4 c" I  l3 m4 x  }' f! f# b, ^
7 ~: d9 L% J4 K0 J每个输入线可以独立地配置输入类型(事件或中断)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求/ H# _! G# c$ [( d/ ^! p6 z

( L" U" T4 X2 j23个中断/事件请求包括:
- B9 X3 o2 Q2 ~  r0 DIO可以做为EXTI线(0…15)【常用】  R6 A! E# O6 `; N; Q( ]; [2 I
EXTI 线 16 连接到 PVD(可编程电压监测器,用于掉电检测) 输出
' ^. e: `  v: w3 [* p: ?0 {EXTI 线 17 连接到 RTC 闹钟事件$ _3 p8 n1 ^" Z1 l
EXTI 线 18 连接到 USB OTG FS 唤醒事件7 z% j' @6 ~/ M, _/ C7 ]
EXTI 线 19 连接到以太网唤醒事件" \3 I, {+ S& D1 A0 ?
EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
6 }# }1 L' v% `0 U6 m& I, t* MEXTI 线 21 连接到 RTC 入侵和时间戳事件
- T$ }* N9 s. _) M- _9 QEXTI 线 22 连接到 RTC 唤醒事件0 v- s5 _  S. f! J$ \' Q
使用外部线中断需要开启AFIO中对应的中断功能
7 D( S$ Q. |. x+ a+ B
4 j. C8 ?: l! y- P3 g, B 7~ULLK$N9E~%OHD65}I0F51.png * X8 L3 f- `$ `6 \* G1 s
( v) p6 I7 _2 V% v4 {( J
GPIOx.0~GPIOx.15(x=A,B,C,D,E…)分别对应中断线 0~15,中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上# O9 M0 b* H9 l/ T- V2 ~
1 d: u0 Q$ X* ?
边沿检测电路是检测上升沿触发还是下降沿触发或者两者同时触发,检测都产生外部中断请求或者事件请求
! w+ w1 \8 t: ]; K6 w- z' F$ l3 m6 l  Y2 W: i; }  w% H$ x- U8 p
中断产生过程=:
2 Q; h8 b& L  T/ G1 n(1)通过配置上升沿/下降沿触发选择寄存器选择边沿检测电路所要检测的边沿跳变==
. _0 V/ r; J! S% M/ M' h  ~* I. s6 Q( ?
(2)边沿检测电路根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0
( w% F3 L% q" p- ]" _+ R. T$ q! k
(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号1$ i' Y0 ~! v3 Y' `- h3 C" ^
$ w6 L# M: u) X9 \; `) O
(4)或门输出的信号1, 输出的信号1发至请求挂起寄存器
& F& L  d) @2 H/ r; ~* d
+ Y" m# w1 d* F) N- K(5)请求挂起寄存器对应寄存器的位置1,然后请求挂起寄存器会产生一个信号1+ t$ J4 L  I2 v: W% K
2 Q8 _& i" G" A  o6 A
(6)请求挂起寄存器、中断屏蔽寄存器同时输出信号1,则发生信号1到NVIC中断控制器, 如果中断屏蔽寄存器的对应位为0,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽.9 ~, Z. d0 b0 R
3 y+ V. H9 j6 O# y+ J
事件产生过程:
) f  d5 V) O" H. f$ T+ E* h8 C(1)通过配置 上升沿/下降沿触发选择寄存器 选择 边沿检测电路 所要检测的边沿跳变6 t7 b+ ?' H5 U8 K8 Z

/ K. N1 |0 f+ G(2)边沿检测电路 根据输入线是否有相应的边沿跳变,检测到则输出信号1,否则输出信号0。
6 O0 D- t0 r: |
- n9 r6 G! O1 k(3)通过一个或门,以边沿检测电路和软件中断事件寄存器(中断事件可以通过软件产生) 作为输入。只要有一个产生信号1,或门就输出信号12 w, ?2 {2 s' S: n  i5 L
0 n$ S% \; y/ ^' w& `
(4)或门输出的信号1, 若事件屏蔽寄存器也产生信号1,则产生一个信号1发至脉冲发生器,脉冲发生器产生脉冲
- R/ h6 f3 H) [, [: V: e7 g
" g9 V& Q# g# t从外部激励信号来看,中断和事件的产生源都可以是一样的。分成2个部分,是由于中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好# x* b; w( a' A( x8 \

: B5 [! L* I+ [8 v注:5 F/ B* y+ s4 M
(1)中断是需要经过芯片内部程序处理,然后跳转的中断服务函数0 |9 _0 R9 y: s# z1 R( Q
3 O2 l  S. R5 {% s
(2)事件是检测到某一动作(电平边沿)触发事件发生了,进而由提前设置好的相应的联动硬件自动完成产生的结果,: r* C4 _% Q( c, z, J& a

. u. _9 G) p7 j事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道, 不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法8 C5 X$ Y* s9 c2 H
2 z( h' ]+ O) A+ ?* c/ Y
eg :
2 i( {. l9 ?# a3 [9 Q4 ?, }) w外部I/O触发AD转换,来测量外部物品的重量,如果使用中断通道,需要I/O触发产生外部中断,外部中断服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;
- C- e* Y# e7 K9 O
+ r8 i1 J& p  ^- X: \# v; T6 k若使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果7 W2 R2 N! F+ x8 q: m

( E0 _5 |% k7 O7 r1 b相比之下,后者不要软件参与AD触发,并且响应速度也更块;要是使用事件触发DMA操作,就完全不用软件参与就可以完成某些联动任务% T% ?# S$ V1 h8 S1 |9 P# R2 E( u8 r
5 F6 D$ d5 e8 C. \2 r
二、配置外部中断
# M4 q: L& A, t: l2 X) v(1)将PA0配置成外部中断09 @  n- u+ K: i0 R3 ?7 B

! J5 p- p- q. \ Y3V1Z8[[V2T)`VY@KQT_WVV.png
  n. _0 p$ U! i; I/ X2 q  Q
/ Z% a7 x1 J  J( ~! Y4 Q9 m(2)配置外部中断的触发方式,就是配置边沿检测电路,配置成下降沿触发(PA0接有上拉电阻)上下拉可以不管1 [8 J, {: o* O' f

6 a2 S/ |' q$ n$ } SA30N`MW@MY)61EQDZ94C$S.png
$ C; ?! D3 L# b# m! ^5 t# e3 P9 `9 j* `* F( `% |( y8 o
(3)在NVIC里面配置中断优先级分组和抢占式优先级与响应优先级, H5 W7 ~4 U" D6 c# n  t& X, S( V

( A, M! o$ S$ a) j, B 1[@J_WTYGPS}6LC[_Q8[`R4.png 1 m4 E" t: l0 h+ F+ M2 S
( C2 U  O  ?6 G) m" Z9 {: \0 K
生成CubeMX文件,进行移植需要有关PA0和外部中断的配置- H6 n) |, r6 P
; J8 M, o- l8 m- N* z; H
(4)优先级分组设置一般在msp.c文件的初始化中
+ A$ m: R3 j/ M3 A0 h' g" k' B/ \
Y((F~([GT8B@LP$K9LU%}$X.png ' Z- o8 l+ U5 Z! b3 U8 r' ^4 `
/ C- l% P9 ?8 _; e1 P- q- F
(5)外部中断的中断服务函数在it.c的文件底部
0 V  I" e2 N$ o+ P1 c+ T+ D6 V' C我们不需要修改这个服务函数,因为在里面他调用了HAL_GPIO_EXTI_Callback这个弱定义函数,所以我们要写的代码应该写在这个函数里面,可以在main里面重新定义一个一样的函数即可# \3 w" p" k7 s' O

* w* T& P& S# }/ q( g  h Z4%ERE2)[{W[UXQ1P~]2K%U.png
; X6 f# Z( m, M) ]0 N( v
2 y% o4 Y8 J5 n4 G" \小结% J7 r7 ?7 @- U: T, j

, g) C  G  Y7 H( e* s7 v DROLT2RB9BC8NRY3WZ80PS6.png 6 R; d1 h% R7 D: m6 s8 o
( ~% ]! ~) ?9 e# S3 ?( K& Z
三、部分代码# l+ }+ a2 k: V4 A
外部中断引脚初始化
0 A- m, p2 T- ], @% m0 @5 y9 A' j* L* c/ Y6 ?$ u, L- U# K
  1. void Exit_Init(void)8 B/ {$ q% N( c" W$ l6 O* n$ o* S
  2. {
    - f7 A- J9 M( Z* o+ F
  3.         GPIO_InitTypeDef GPIO_InitStruct = {0};
    # R+ s! P6 D% R, O2 n
  4.         __HAL_RCC_GPIOA_CLK_ENABLE();* c0 p# t8 F4 m0 T$ w" f) _
  5.         
    1 d7 K& {& ~( o7 }2 e# d! A# j
  6.   /*Configure GPIO pin : PA0 */& N! Y# }5 b! M/ u
  7.   GPIO_InitStruct.Pin = GPIO_PIN_0;
    1 _! k0 r9 C' j8 k( G# R
  8.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;2 M- e7 A; ~, F  U8 a# R4 N
  9.   GPIO_InitStruct.Pull = GPIO_NOPULL;
    # K0 u1 n8 S# g
  10.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    0 r" e* q# d0 v+ M& f# j
  11.           g/ o6 G; f$ n$ X7 w  K
  12.          /* EXTI interrupt init*/& [- g* G( ~# ^" O$ z
  13.   HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 1);* J( @3 o" V& D
  14.   HAL_NVIC_EnableIRQ(EXTI0_IRQn);
    ! Z* @4 g& V. W5 K
  15. }
复制代码
$ C' }+ e; U. I9 h9 y. \, t
外部中断处理函数–>回调函数, N/ `, v. e, U9 ~* W% C, Q( S+ y
每按一次按键4,LED4和LED8反转一次
) }# _4 r) G7 P- ~6 x3 h4 k/ x  _5 U0 X
  1. // 外部中断回调函数, 产生外部中断,会跳转到外部中断的中断处理函数/ H- P8 g9 ^' Y5 S  ~
  2. // 中断处理函数又调用回调函数,进行中断处理5 Y  Q" {/ i5 m( g( H
  3. // 每触发一次进入外部中断# @( _9 Q' \( W& W2 _% M4 O' H
  4. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    ; x+ V  q4 {4 o9 N  i9 x
  5. {
    " t9 Z# N0 t) A, J/ |- i$ ~; \$ X+ D
  6.         /* uclde = 0000 0000 ^ 1000 1000 =1000 1000  (1)% J2 P8 D7 B9 y* W0 O; h
  7.            ucled = 1000 1000 ^ 1000 1000 = 0000 0000  (2)3 s" o( o/ @. A+ @/ P
  8.                 uclde = 0000 0000 ^ 1000 1000 = 1000 1000  (3)
      ]4 Q$ T* |* K3 o5 ^
  9.          如此下去继续反转6 G1 C1 Q' e' z5 r- m$ }5 E' w' S1 {- Z4 V
  10.         与0相异或值不变,与1相异或值变化, F" |/ s( m  {. C1 }  W
  11.         */
      N* u) l, X* T$ r
  12.         ucLed ^= 0x88;
    - y% P/ O0 H% w# d( X! c* z2 O) q
  13.         LED_Display(ucLed);
    9 Q. V; f# q( L% d" K; @" [
  14. }
复制代码
1 |+ Q/ f! _. V6 k3 s- f5 F
0 V8 t' v0 u+ ^: r6 ~+ i

' \- Q2 Q0 ?2 U# w; d2 d3 I% V6 X: x& W3 E9 s( Z
收藏 评论0 发布时间:2022-7-5 22:23

举报

0个回答

所属标签

相似分享

官网相关资源

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