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

【经验分享】STM32开发项目:如何配置GPIO的外部中断

[复制链接]
STMCU小助手 发布时间:2022-4-15 10:00
如何配置GPIO的外部中断
$ ?2 S# C3 B! i8 i6 B) M/ t* c以STM32F103为例,记录配置GPIO外部中断的一般方法与流程。/ B6 ?2 C6 P# R6 ~6 B6 j
! V  i( p. F+ H) j" w7 U  \
配置RCC时钟! |/ o9 b7 I, I$ u
RCC时钟配置是STM32MCU顺利运行的必备步骤,笔者使用的参考代码如下:2 K" ]9 M( k; t

3 M$ M& y  z( e: k
  1. void RCC_Config(): v: |4 D7 t8 P# l8 }4 `+ b
  2. {4 u4 _1 K- V: y0 u7 p2 `- T7 v
  3.         RCC_DeInit();
    4 D, c) O% q, T
  4.         //使能HSE,并等待 HSE 稳定
    " G) E  R# h' k
  5.         RCC_HSEConfig(RCC_HSE_ON);
    : r4 V) u0 L% Z) S* T
  6.         ErrorStatus HSEStartUpStatus;9 v% i  s! z$ R0 r+ E
  7.         HSEStartUpStatus = RCC_WaitForHSEStartUp();
    / G( h( d1 r1 q
  8.         //HSE启动成功1 e" D- L* L* S6 D, s, m7 s
  9.         if (HSEStartUpStatus == SUCCESS)
    $ k( y: r' `0 I2 L) r( s+ V: b" {
  10.         {
    : r$ T2 X- A- P
  11.                 //使能FLASH预存取缓冲区
    ' Q8 g  P4 b( B
  12.                 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);: c" W; c, c* w- u4 d
  13.                 //SYSCLK周期与闪存访问时间的比例设置
    % O, q$ c3 H: V/ K' p0 n8 Y
  14.                 FLASH_SetLatency(FLASH_Latency_2);
    ! ~, |- M7 o8 x$ d2 G0 F% R
  15.                 //Configures the AHB clock (HCLK): AHB clock = SYSCLK
    1 ]% {# l% F% |
  16.                 RCC_HCLKConfig(RCC_SYSCLK_Div1);1 {0 N/ Z. n& F9 z  f& @
  17.                 //Configures the High Speed APB clock (PCLK2): APB2 clock = HCLK
    " H$ m/ b3 O" J$ f
  18.                 RCC_PCLK2Config(RCC_HCLK_Div1);
    5 z* E, H9 w* D5 s, P# y
  19.                 //Configures the High Speed APB clock (PCLK2): APB1 clock = HCLK/2  t* N" X% L! p8 T) t1 J+ f
  20.                 RCC_PCLK1Config(RCC_HCLK_Div2);
    ! ?0 X% n+ ?/ ], e1 H: E
  21.                 //Configures the PLL clock source and multiplication factor: 5 _* E  c, C, u) R1 x/ U# ]
  22.                 //HSE oscillator clock selected as PLL clock entry
    5 T5 _  M1 B1 h; z- v% @
  23.                 //The PLL multiplication factor is 95 I( ^8 `7 x. |+ Q) x# ~4 v
  24.                 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);& y. u8 W" s/ W3 |! p
  25.                 //Enables the PLL.
    % p' n3 {5 ^& J" d  F  h( l
  26.                 RCC_PLLCmd(ENABLE);
    $ P9 L: _+ H! I" m0 [# q
  27.                 //等待PLL时钟稳定7 L( I4 b. {# ?0 ?! G, O
  28.                 while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    : |  p& Z0 f8 d) ~$ q( Q! V
  29.                         ;
    4 G3 O6 y; V, p$ U2 ^
  30.                 //Configures the system clock (SYSCLK): PLL selected as system clock3 L3 K! u" r. r* ]( D
  31.                 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    8 x) p' Q2 |) t$ y/ O' q. ~# t
  32.                 //读取时钟切换状态位,确保PLLCLK被选为系统时钟
    7 O) t% `- `# u# P- I
  33.                 while (RCC_GetSYSCLKSource() != 0x08)6 Z+ I% K2 b* `8 x( P: A: L3 q3 c. U' u
  34.                         ;
      K$ y$ R1 x% a0 v) W
  35.         }
    - |5 O7 A1 a+ Q4 S6 V3 d
  36.         //HSE启动失败
    & g8 i- H* l% \" [2 L# V
  37.         else
    ) i* @& l9 y# D% L% \, B
  38.         {
    2 c, N9 H3 G- D- ]" D- ^2 b& G
  39.                 while (1)1 h5 K. c& s" @; A& P
  40.                         ;& ^+ y( h4 i: N$ ^
  41.         }- p; Y0 F/ C8 D, w
  42. }
复制代码

& {% Y1 [, w9 Q) XGPIO配置# S2 l. m  m( d5 G; I4 E
以PB10, PB11, PB12, PB13作为外部中断输入口为例:1 Y4 n) t/ F7 h6 P9 j2 G' u$ K

; _8 j! x! i7 }. c+ W, |9 Y2 O
  1. void GPIO_Config()4 Q; H# e. X2 @- |' e7 m
  2. {
    ) B- I, Y: T8 ^8 w' u
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    / B( X; V: w4 e. m2 M
  4.         
    + Z" x1 w) `# g0 _: d
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);% X" b: n& i2 E
  6.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    % U, N* ~5 E  v& g& W! A, a: P
  7.         
    6 W  {: V, S) F9 a- H! ]! E: T
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13;8 w: f0 q- O7 T, _
  9.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;: m( i) W0 M+ V" }& i( O$ {
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;& r' O$ n( g' e, c! J1 p) s( A
  11.         3 H: V7 I& a+ M8 t: e0 d
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);$ q% c5 _- V* j( L2 M' r, N. P' l
  13.         //选择EXTI的信号源
    4 S9 n, |3 T8 Q
  14.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource10);
      \7 C: W) E  }
  15.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);6 r8 D% e* l# K4 a
  16.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource12);. P% M" d# t; ~. d+ I; i7 e
  17.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource13);
    3 Q  \! j2 l& X# r- D0 i5 m

  18. 5 z+ }/ Y4 w# _$ J- o$ o) [$ n- \
  19. }
复制代码

' F! R/ T1 N$ T: J( c4 I2 _1 EEXTI配置
; F4 C. t9 v: T1 \EXTI (External interrupt/event controller): 外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。6 ?. o. @5 B* w1 r9 r3 @
& M; T: _( k. @8 C% H3 L9 |
  1. void EXTI_Config()
    ! v6 k' ?* t3 S' o& h& u
  2. {9 X: Y( `& O" A+ u
  3.         EXTI_InitTypeDef EXTI_InitStructure;
    - r3 o; W, x, y$ m
  4. # [1 D4 ?0 G: e# Z
  5.         EXTI_InitStructure.EXTI_Line=EXTI_Line10 | EXTI_Line11 | EXTI_Line12 | EXTI_Line13;
    6 C( q# c: k* w) G& a) K& j2 {
  6.         EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    ( h' j  L3 \1 q$ }9 [
  7.         EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
    : O7 ^' a- c7 h0 H, S
  8.         EXTI_InitStructure.EXTI_LineCmd=ENABLE;/ u( G# i+ D6 p) h0 K6 P
  9.         
    7 N8 [& e' G9 j: \/ N
  10.         EXTI_Init(&EXTI_InitStructure);
    1 }9 a% M! M2 M- T& _- {+ E
  11. }
复制代码
& b! p4 c5 @3 G3 Z
NVIC配置+ _6 |! @" @- Z0 l" R( i2 c
NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯片厂商在设计芯片的时候会对 Cortex-M3内核里面的 NVIC进行裁剪,把不需要的部分去掉,所以说 STM32 的 NVIC 是 Cortex-M3 的 NVIC 的一个子集。
; K8 x. x% O1 Z  J* w) Y7 U* B8 o6 g" f3 G9 T
在 NVIC 有一个专门的寄存器:中断优先级寄存器 NVIC_IPRx,用来配置外部中断的优先级,IPR 宽度为 8bit,原则上每个外部中断可配置的优先级为 0~255,数值越小,优先级越高。, c; U  _$ ]3 N, Q

+ j2 {8 X* T/ c但是绝大多数CM3芯片都会精简设计,以致实际上支持的优先级数减少,在F103中,只使用了高 4bit用于表达优先级的这 4bit,又被分组成抢占优先级和子优先级。
# G- u9 {9 O% ?) ?& p# @, X/ M
* o/ f# ^  n3 K# W: i如果有多个中断同时响应,抢占优先级高的就会 抢占 抢占优先级低的优先得到执行,如果抢占优先级相同,就比较子优先级。如果抢占优先级和子优先级都相同的话,就比较他们的硬件中断编号,编号越小,优先级越高。
3 U, e" N* @: v, l
* J2 b) S! z- _; @3 [4 S$ \
  1. void NVIC_Config()
    + @. n( S/ ~# f+ t4 q8 |4 e
  2. {
    - g3 }6 Y5 G& [+ ]3 B( ]" z/ n
  3.         NVIC_InitTypeDef NVIC_InitStructure;8 C& h5 |8 u& G, o1 G
  4.         //NVIC_PriorityGroup_2: 2 bits for pre-emption priority & 2 bits for subpriority
    ! t3 t6 F7 f) d) y# _$ O( V. B2 ?
  5.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
      H6 J8 a# q' c  \7 n  R& A) Z
  6. - \5 g, H4 p) O' M$ b# Z* T
  7.           NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;9 [0 i: ^2 }% O$ q7 ^3 j# v0 T
  8.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; 8 Z% r4 ~7 C7 `; j
  9.           NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;5 I- k4 D$ {7 z! I  P# K
  10.           NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;7 L3 l4 u* e$ z% }& C
  11.           9 W2 r: K; v* L0 p8 o
  12.           NVIC_Init(&NVIC_InitStructure);
    $ k/ ^" Q/ z9 O( ]$ H( |2 l5 e2 ]
  13. }
复制代码
* _: Y4 y7 z) f, R: }' W4 |' l' i- u
中断服务函数 IRQ_Handler  x* D! E6 @) h
在启动文件 startup_stm32f10x_xd.s 中,我们已经初始化了中断向量表。实际的中断服务函数都需要重新编写,为了方便管理,可以把中断服务函数统一写在 stm32f10x_it.c 这个源文件中。关于中断服务函数的函数名必须跟启动文件里面预先设置的一样,否则系统就在中断向量表中找不到中断服务函数的入口,实现不了中断。8 B6 Q( B3 I4 A; D2 J0 m) ]

6 F2 L6 f0 f. v2 \9 N, q0 s
  1. void EXTI15_10_IRQHandler(void); t/ `* j" [( `# Y! U
  2. {2 ~$ d$ ^" A' b5 h$ S; o' t
  3.         if(EXTI_GetITStatus(EXTI_Line10)!=RESET)& V6 k  L; ?& z* H2 X4 U
  4.         {
    7 H3 v" K( N) P0 W4 i
  5.                 DoSomething_Line10();
    ) {2 A) c6 _! F$ n4 R
  6.                 EXTI_ClearITPendingBit(EXTI_Line10);
    0 l7 ^* G$ [9 ~: ~, H! g
  7.         }2 a/ B; X$ h7 Z9 V" E: W
  8.         else if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
    5 ]2 [5 p& o( l( R/ s
  9.         {1 Q( R6 Z. |; {4 U& R- ~
  10.                 DoSomething_Line11();
    5 @! b- h& U1 }
  11.                 EXTI_ClearITPendingBit(EXTI_Line11);
    6 z, u0 ]" h7 n3 I5 J9 W. Q+ n" {
  12.         }
    ' n9 K  P2 u7 o, L" N3 Y7 e
  13.         else if(EXTI_GetITStatus(EXTI_Line12)!=RESET)* N& w8 f7 a* r) `' C5 q; O' T
  14.         {
    ! w2 l8 `! O7 m$ Y  V+ I- A
  15.                 DoSomething_Line12();
    # X3 @" P% [9 s* G) W* n
  16.                 EXTI_ClearITPendingBit(EXTI_Line12);$ Q0 E- M2 g8 A
  17.         }& S& c0 O* Z, q/ y- w
  18.         else if(EXTI_GetITStatus(EXTI_Line13)!=RESET)5 `! [7 U3 I6 o7 n: A  U
  19.         {# k. s2 q" w- L( u" f/ r
  20.                 DoSomething_Line13();0 X! x9 W& O4 M4 P- C: D+ k% {
  21.                 EXTI_ClearITPendingBit(EXTI_Line13);
    ) {. d0 x! k" ]% l( l8 p
  22.         }' S0 R. A' N+ X2 z
  23.         else if(EXTI_GetITStatus(EXTI_Line14)!=RESET)
    . {: q$ p; ?+ E) u
  24.         {) D! r( z6 k% ?" O; L6 A1 q* v) i
  25.                 DoSomething_Line14();
    ; f0 G' F7 A2 `7 p- B
  26.                 EXTI_ClearITPendingBit(EXTI_Line14);+ @  K# L) p) w) d
  27.         }
    + k  V6 T! [4 X7 y
  28.         else if(EXTI_GetITStatus(EXTI_Line15)!=RESET)
    3 j4 {. O  J: x3 e  ^
  29.         {
    6 N% ~; U2 ~1 \' I. n
  30.                 DoSomething_Line15();
    ! @. n+ ^8 B) q9 O# L& i+ f' v. u
  31.                 EXTI_ClearITPendingBit(EXTI_Line15);
    0 R: F6 ^/ K8 O
  32.         }
    , u% ?4 W4 J  I
  33.         else  g6 K4 Z9 E. M. {: @" }5 R: h# X% W
  34.         {
    # B# |5 N+ P* X; r
  35. 2 N8 i: p1 D3 x" ^; h. @
  36.         }! K% H3 J: E" j" v
  37. }
复制代码
$ C! s3 ?2 \% i/ o& B' p
3 \" c2 y6 t( N
% C* }( ~& E" X& f( w8 }

2 f" C$ h% n5 p. W( n! Z
收藏 评论0 发布时间:2022-4-15 10:00

举报

0个回答

所属标签

相似分享

官网相关资源

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