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

第三章: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)+ H, U3 r4 h6 E: z
  2. {2 l) K2 n( z' ?' S& e8 o; R9 o
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
    ( t2 M8 I4 i# h* q- G

  4. 9 X6 M! w. k+ k9 e6 u$ S/ C
  5.   /* GPIO Ports Clock Enable */
    " T" a4 _; `$ Q4 N1 s) l' V
  6.   __HAL_RCC_GPIOA_CLK_ENABLE();
    9 b% Y( w) W% h; Z4 O
  7. 5 F) ^# x( N9 z  r
  8.   /*Configure GPIO pin Output Level */
    + j; h+ V, ?5 _; a
  9.   HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);//默认输出高! _/ t' _, I# E, @4 l
  10. 3 j0 `6 v3 ]/ ?: K* f
  11.   /*Configure GPIO pin : PA8 */' ^/ z# M% D$ a  {! T

  12. * ^+ Y: X4 x/ x  L" d
  13.   GPIO_InitStruct.Pin = GPIO_PIN_8;//配置GPIO_PIN_8 ) c. V2 U/ E, J
  14.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;  //外部中断模式/下降边缘触发
    , j" i8 \) h; V3 d7 U
  15.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
    9 B( k) ?; D4 O/ @6 e/ E( G
  16.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);0 K% \$ _: R7 I6 Q' Z8 A
  17. ) r. R- [$ Q& O$ l
  18.   /*Configure GPIO pins : PA9 PA10 */
    8 a. u" ^& V" e/ H4 m4 W9 ^
  19.   GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//配置GPIO_PIN_9/GPIO_PIN_106 h# V4 P9 b% |7 E. G
  20.   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;/外部中断模式/下降边缘触发
    ! N) U& @6 `1 I8 x' [
  21.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉
    6 A' F7 \3 g* j& y
  22.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    6 V# S2 x* R3 P8 M: z

  23. 9 k; P' I7 D  z7 \( I3 O% G% q* N3 `
  24.   /*Configure GPIO pin : KEY1_Pin */
    ! D2 S' ~$ O0 c
  25.   GPIO_InitStruct.Pin = KEY1_Pin; //初始化KEY1引脚
    , x4 k' @9 ~# }1 H9 n0 c8 W
  26.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;//配置为输入模式
    3 o# p3 K: S; ^8 `+ f1 S
  27.   GPIO_InitStruct.Pull = GPIO_PULLUP;//上拉输入2 C6 }4 L( K* e' |
  28.   HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);; |. d! ]) f3 @4 j+ Y- i6 i

  29. 0 W9 `, |8 t3 p$ j6 L' W2 b0 O/ c
  30.   /*Configure GPIO pin : LED1_Pin */
    - k2 R2 ?" W/ H& E$ G
  31.   GPIO_InitStruct.Pin = LED1_Pin;//初始化LED1引脚- A  q* |+ @$ w: R9 _# {
  32.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //配置为输出模式
    ) ^" {, V! ], h- k1 x
  33.   GPIO_InitStruct.Pull = GPIO_PULLUP;//默认上拉输出
    ' W: ?$ R5 y4 {+ Q8 R: c9 F3 d- W3 f
  34.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;//低速模式
    3 P& o  T% f# q" J1 ~5 O
  35.   HAL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
    . |3 Y  l, b! l# x1 p2 }

  36. 2 h- }* r/ R! Y2 m. j" }! ~
  37.   /* EXTI interrupt init*/
    / W+ l: b/ ]5 _! F; |  q
  38.   HAL_NVIC_SetPriority(EXTI9_5_IRQn, 1, 0);6 s3 k* N0 V  P5 ]: P+ t% E% w' J
  39.   HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
    3 T3 g5 @/ V* c1 w- \. f
  40. 0 X: F+ M) f% u% S7 z6 ]8 V; |9 [5 Z
  41.   HAL_NVIC_SetPriority(EXTI15_10_IRQn, 2, 0);
    & M* m8 |2 L8 I5 }2 I* X. v" M$ ~
  42.   HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
    / q3 h& t9 z& X/ R
  43. }; j6 o' ^- e0 t4 n% M7 Q
  44. , T/ I7 Z/ n. l. I
复制代码

: D# \$ `( S( \; E/ T+ m
接下来开始编写中断服务函数:
  1. //这里中断服务函数写在BEGIN 4,也可以写在其他可编辑的代码区域中,这里不明白的可以看前面几章的说明2 Z% J2 B2 A" k0 e& w) l8 C2 N- _
  2. /* USER CODE BEGIN 4 */
    * v2 {+ \4 w3 W( ~0 i. y
  3. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    $ D" t; d# Z" g& b2 B, f( O) T
  4. {: U) b* A( W# D1 z2 C
  5.   switch(GPIO_Pin)    //扫描是哪个中断源触发的中断
    ) M, O* ?7 {! g6 y2 \
  6.   {
    " d( Z% w8 S) \
  7.     case GPIO_PIN_8:  //如果是GPIO8
    ) S- U3 d& t) l& ~3 P. I3 z
  8.     {
    / y4 h  B1 I: i. Y/ i
  9.       for(uint16_t i=0;i<2000;i++);  //消抖一下
    " ?" V8 M5 M! ~! I4 X1 X
  10.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_8))  //再次确认一遍GPIO8是否拉低;
    ! o8 }; J% t' O
  11.       {
    4 y2 V% l! a$ G3 y
  12.         HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);  //如果是,LED1 输出高电平,
    + t8 [$ p0 ]: {" f$ A- `
  13.       }9 N$ b+ A" e9 I& y, }7 V, d
  14.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_8);  //清除外部中断标志位. v3 z6 q$ v3 Q+ R2 M
  15.       break;
    ' R) T3 I3 ]0 o7 @0 U. u
  16.     }$ C$ y4 S% N) b& i; G1 N+ M2 g
  17.     case GPIO_PIN_9:  //如果是GPIO92 v) k8 W, M6 S1 |9 O
  18.     {
    9 b. k; k8 X- t) I1 l
  19.       for(uint16_t i=0;i<2000;i++);  //消抖一下& r/ y7 `! I# X0 m/ ?
  20.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_9))  //再次确认一遍GPIO9是否拉低;/ @9 c' `0 ^% C
  21.       {$ O! S$ |  l; k
  22.         HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);  //如果是,LED1 输出低电平,8 ~& l8 E( ], q2 X& D) G6 E$ H) m4 W
  23.       }
    2 m$ r# _0 R0 _( X# U
  24.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_9);  //清除外部中断标志位
    8 ?0 @7 \1 y3 ]1 @6 C8 u
  25.       break;
    1 Z5 [5 r2 R  e# t
  26.     }
      z2 D6 b* h6 K/ K- D+ x# b) @
  27.     case GPIO_PIN_10:  //如果是GPIO10
    / g. P  N7 q# G5 b; ^0 J
  28.     {% o6 s7 A1 U& ?$ m8 V% O
  29.       for(uint16_t i=0;i<2000;i++);  //消抖一下0 _6 [2 B- L- v3 N  G
  30.       if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_10))  //再次确认一遍GPIO10是否拉低;
    & O. a9 E7 b3 v  x/ v3 \9 M! Z/ y
  31.       {
    9 ^8 N% g* W9 b: p4 P* d6 h
  32.         HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);   //如果是,翻转LED1输出电平,) s7 Y- ^) E; F- o3 i5 y% \
  33.       }# j2 ]7 D8 q% s- N
  34.       __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_10);  //清除外部中断标志位
    & |6 z0 Z7 P  @7 p' o
  35.       break;! i% E7 h8 E; b- M) j
  36.     }
    . {6 Y+ D' S  P, e& `
  37.     default:break;9 i6 C, i2 I: `' q2 T: H
  38.   }) `6 h- s! j. d) l! a& X' {
  39. }
    * r* Q9 k7 j3 H6 Z2 P, ^) P/ B
  40. /* USER CODE END 4 */
复制代码
9 w$ n& D5 M) q9 _3 W' X2 `
5.4.jpg
! g0 {8 j, D" u6 ?: p% g" }
如果能理解到这里,恭喜你已经学会了外部中断的基本操作!
文章出处: 电子爱好者

5 w' k2 c& v1 f7 `" r1 }
赞 收藏 评论0 发布时间:2021-1-13 15:55

举报

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