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

第三章:STM32CubeMx 外部中断基本使用方法

[复制链接]
STMCU小助手 发布时间:2021-1-13 15:55
第三章:STM32CubeMx外部中断基本使用方法
第一步:
现在STM32CubeMx 中配置所需要IO口外部中断模式:
单击对应IO口左键-->GPIO_EXTI
5.1.jpg
第二步:
配置中断触发模式
GPIO-->GPIO_mode        
GPIO--> GPIO Pull-up/Pull-down
这里以外部中断模式/下降边缘触发检测,默认上拉( Pull-up) 为例
5.2.jpg
第三步:
配置中断优先级:
NVIC(嵌套向量中断控制器)-->EXTI line interrupts 根据自身需要配置中断优先级
5.3.png
到这里STM32CubeMx  就配置完成了,之下来分析STM32CubeMx生成的源码
先看一下GPIO的初始化函数;
  1. static void MX_GPIO_Init(void)
    2 T* \# \  V) t# z/ n
  2. {
    4 M# o' ?/ p9 D7 z0 S9 b
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    / K) Z3 L9 E; ~

  4. # u% H( U, p" x
  5.   /* GPIO Ports Clock Enable */% G  D' [5 ~. h. }* ~
  6.   __HAL_RCC_GPIOA_CLK_ENABLE();
    - X7 j2 ]3 W% T9 j$ n6 \5 l
  7. 0 F3 _; N4 P$ k2 s/ N9 c
  8.   /*Configure GPIO pin Output Level */
    6 N% H' E& m+ D$ R
  9.   HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高# P/ N$ o, T0 Z* M; U

  10. 3 u5 E3 M( z: l5 B
  11.   /*Configure GPIO pin : PA8 */
    - M) M" ^5 S& s3 H5 I* u' b

  12. 0 b% c8 {9 O9 T1 _' q" k& @
  13.   GPIO_InitStruct.Pin = GPIO_PIN_8;//配置GPIO_PIN_8   l9 t* b1 o7 G. E
  14.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  //外部中断模式/下降边缘触发
    9 Y$ Q' C9 A3 P1 O$ P3 ?  \6 P3 r
  15.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
    ; L  E) q$ g, ^* [# [' N. H
  16.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);- c! R1 |1 f) {& m

  17. 5 e/ ?! ^; q5 e; m; @9 A, x7 ?
  18.   /*Configure GPIO pins : PA9 PA10 */2 @+ X8 ?' _, f+ ~, o( L' V$ }
  19.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//配置GPIO_PIN_9/GPIO_PIN_10: i/ U/ M, }, n4 q+ J: O" r3 u
  20.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;/外部中断模式/下降边缘触发* L6 J1 g' _, j3 w
  21.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉, H4 r" J7 t' X3 u* h* V9 s
  22.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);* Q( O8 j" A0 V! @5 z

  23. ) ^. n/ X6 Z4 j; Y9 V$ r: q. N3 B
  24.   /*Configure GPIO pin : KEY1_Pin */
    2 j- o2 m6 c/ A: D
  25.   GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚
    # O! A7 i" [+ q
  26.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为输入模式) M7 m/ i7 c" g% c4 D" v
  27.   GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉输入2 b0 a# T4 C6 d, B& O
  28.   HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
    0 m! _* }1 U' C  I
  29. ! j% U8 l8 ?5 U! R6 D( J' O5 j
  30.   /*Configure GPIO pin : LED1_Pin */& d+ L* p0 y5 @4 r; i, ?
  31.   GPIO_InitStruct.Pin = LED1_Pin;//初始化LED1引脚
    3 c% A' S8 t. [/ `0 e3 P& {/ Z
  32.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式: d# n2 ^* e% G9 Q* Y8 @! \
  33.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出1 K$ V6 q3 Z! `) j
  34.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式$ h# \: s% Q4 p/ q/ q. ~5 s6 S* |
  35.   HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);! A- s- }3 G; @1 m3 r- O
  36. 8 l4 }/ G/ E3 f. d: |) @
  37.   /* EXTI interrupt init*/
    . g+ D, U; A1 F" ^" j$ F
  38.   HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);
    & Q4 s- Y# p8 ]+ U: }; O
  39.   HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
    6 ?& C& J; C  y3 f' o& g

  40. + v7 p0 T) i$ L2 g* w
  41.   HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
    0 r& D) z4 }& C2 `
  42.   HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);4 m; x8 D, K" v* V$ r# a% w
  43. }
      \' j. n; s  b6 X- h7 k$ [& d
  44. ; g, J6 g  v! R) o3 K
复制代码

- x/ t+ `; t$ K) l/ ^
接下来开始编写中断服务函数:
  1. //这里中断服务函数写在BEGIN 4,也可以写在其他可编辑的代码区域中,这里不明白的可以看前面几章的说明' R& G1 m: k( `& ~* X2 X
  2. /* USER CODE BEGIN 4 */ 4 o" t2 E4 S( c* Z  @, X
  3. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin); U: F, w: {: o; p. s7 {! o
  4. {/ P; ?" ?7 t, }( C8 F- {1 `
  5.   switch(GPIO_Pin)    //扫描是哪个中断源触发的中断
    # O" o) }+ P+ ^+ i% c- U% r* j
  6.   {7 |6 y7 ?8 ?7 X7 N9 i2 {
  7.     case GPIO_PIN_8:  //如果是GPIO8' n" j0 _2 W+ P# m; X6 w, ]
  8.     {& p  D+ d( n6 d7 X: U& w
  9.       for(uint16_t i=0;i<2000;i++);  //消抖一下
    ' k; }6 Z# V0 g
  10.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))  //再次确认一遍GPIO8是否拉低;% Q$ ^* _) y" O' f9 y
  11.       {- c8 |7 I3 ^7 O. c+ `. I2 t
  12.         HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);  //如果是,LED1 输出高电平,+ V+ P) r" Y, p7 z' @4 D
  13.       }
    6 j1 S2 k+ r/ Q1 _, y
  14.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);  //清除外部中断标志位0 s5 x" b) K/ ^: M% U
  15.       break;, ^/ @  ], D# G4 f
  16.     }
    , v3 Z3 [( g# b( U9 J4 S
  17.     case GPIO_PIN_9:  //如果是GPIO9
    9 `# U) j/ V1 J$ O- C8 V
  18.     {. i8 k4 P% K$ S/ W, s: M7 p0 _9 x
  19.       for(uint16_t i=0;i<2000;i++);  //消抖一下# |! g5 I' m# i$ J0 x7 f2 n8 }1 V  O
  20.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9))  //再次确认一遍GPIO9是否拉低;
    7 x2 U8 s  {3 G9 z0 o
  21.       {6 h9 t; i/ e' B
  22.         HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);  //如果是,LED1 输出低电平,' u( G' v6 A0 U2 g  Y
  23.       }: J( e! V" I/ }# m4 X# I2 C
  24.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);  //清除外部中断标志位$ P: z: O8 k1 Z
  25.       break;
    & f- j0 Y, T) K- L
  26.     }
    $ T5 C8 E& j- N" D
  27.     case GPIO_PIN_10:  //如果是GPIO10
    5 R4 R* m; ~' N& a6 r
  28.     {3 D" [7 h3 u8 x. M' K! W
  29.       for(uint16_t i=0;i<2000;i++);  //消抖一下& ^  s: O% l9 Z* ~) a
  30.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10))  //再次确认一遍GPIO10是否拉低;& C1 [1 w6 z( C
  31.       {1 N6 J& g) d7 i1 V* z
  32.         HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);   //如果是,翻转LED1输出电平,6 P7 F  q  B0 o. J3 o% _
  33.       }
    % r/ ~" b2 w5 G' ?; w8 ^
  34.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10);  //清除外部中断标志位* T; d: y) B: v  d. T
  35.       break;
    9 l2 w6 q. F, u) _0 R' L
  36.     }
    . B! F, Y: Q* x  O2 b3 \. S
  37.     default:break;6 l! J6 F5 N; Q1 l! l
  38.   }
    5 ^+ b# c- O6 ]5 m( c+ R7 g, x
  39. }
      `* _5 f7 R1 p& G
  40. /* USER CODE END 4 */
复制代码

4 G  z( f3 ]/ p4 G' u7 T. R
5.4.jpg

& i" L4 |0 L# C  [/ u! h% W$ s
如果能理解到这里,恭喜你已经学会了外部中断的基本操作!
文章出处: 电子爱好者

. r( p1 J5 J$ y, B( S" [) \3 S
收藏 评论0 发布时间:2021-1-13 15:55

举报

0个回答

所属标签

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