电子产业一站式赋能平台

PCB联盟网

搜索
查看: 49|回复: 0
收起左侧

STM32CubeMX的外部中断的使用

[复制链接]

395

主题

395

帖子

2304

积分

三级会员

Rank: 3Rank: 3

积分
2304
发表于 2023-11-25 21:02:00 | 显示全部楼层 |阅读模式

oz2h3bmp2oh64029382638.png

oz2h3bmp2oh64029382638.png

1 H! Y6 s6 ?6 W% D/ J' F* S! y5 g* E  |5 c  z
啥是中断?中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。- K5 l+ Q0 X, R- q

st1b1ccmffs64029382738.png

st1b1ccmffs64029382738.png

! I1 K% r7 d7 T0 P4 F7 q* ~( p举个例子:
  i. W/ D* e) o. ~& Z' {2 E

0tjk4u2byrh64029382838.png

0tjk4u2byrh64029382838.png
( g! s9 f) _: H' K. \* B
类比一下# y6 M* k+ X& @7 [1 t; K

lq0fijzlacz64029382938.png

lq0fijzlacz64029382938.png
" _& ]( e' k5 i- K
在实际的代码中,HAL库的中断处理较为复杂:startup_stm32f103xb.s通过汇编注册了中断处理函数EXTI1_IRQHandler(),在stm32f1xx_it.c中,EXTI_IRQHandler()引用了HAL库的处理函数HAL_GPIO_EXTI_IRQHandler(),其功能主要为判断具体的中断原因,并调用对应的中断回调函数:HAL_GPIO_EXTI_Callback()。用户可以自己重声明中断回调函数(HAL_GPIO_EXTI_Callback()),在其中写入自己的用户逻辑,不出意外的话,你这时候可能会有点懵。上图!" t2 \) _7 @$ \! D

ozgytbbbi5f64029383038.png

ozgytbbbi5f64029383038.png
1 q6 d: @8 A7 H; d7 ^
中断处理函数写在EXTI_IRQHandler()或HAL_GPIO_EXTI_Callback()皆可,不过HAL_GPIO_EXTI_Callback()需要重新声明,比如:8 z, O4 N: P/ ?
  • void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){  if(HAL_GetTick()-t>30)  {      if(GPIO_Pin == GPIO_PIN_1)      {        duty_cycle=duty_cycle+100;        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle);      }      if(GPIO_Pin == GPIO_PIN_2)      {        duty_cycle=duty_cycle-100;        __HAL_TIM_SetCompare(&htim1,TIM_CHANNEL_4,duty_cycle);      }  }  t=HAL_GetTick();}; H1 }  D& s) a/ T$ Z
    对于代码的意思不必理会,只需知道这些是自己按需求写的,下面开始连接硬件:
    , D8 `. M3 r. ]5 S

    z4ewrj4o1te64029383138.png

    z4ewrj4o1te64029383138.png

      p. \+ a% H1 f( B* t, s+ M, b以下是实操工程:1,配置引脚! e" Z! \1 X8 d4 m9 w

    inwbqvj4put64029383238.png

    inwbqvj4put64029383238.png
    # a. X4 E7 Z& N( B
    : |/ Z; i0 N  z- _% o
    2,使能外部中断
    ! P* q4 C" Z6 ^! w9 C

    5zpqaemybnk64029383338.png

    5zpqaemybnk64029383338.png

    0 k+ R: X) \7 k5 V" H3 O
      p# }6 P: V6 ?0 }( M3 U! [# B' k3,点击右上角GENERATE CODE生成代码# \4 [; h0 h$ ]- \0 Y( j

    r4fvxkvgai164029383439.png

    r4fvxkvgai164029383439.png
    . V3 M" f% T! u5 e) j: N0 `

    : |& H% i: |# n3 o! i$ aHal_GPIO_TogglePin()这个函数可以反转引脚电平,以控制小灯亮灭,多加的那几行代码用来做一个简单的消抖,然后编译,下载。如果没出问题的话,每按一次按键,灯都会改变一次亮灭状态,上面用的是xxxit.c中的Handler函数,下面试一试Callback函数,注释掉刚才加的代码,在main.c中添加如下代码:8 {! q2 K3 j' y! S. T
    : \$ K) l2 g0 k" g$ N  j. H

    gxniya0ysww64029383539.png

    gxniya0ysww64029383539.png
    ( w8 H. P( V  V; L9 X
    编译,下载,运行,效果应该跟刚才一样,下面试一下TIM。( Z9 `7 P! h- g& k

    0zgwy2ry4v164029383639.png

    0zgwy2ry4v164029383639.png
    9 W/ G& t/ m0 _& V, G2 M& g3 F& M

    / }; t- m) v5 w搞完后,小灯应该每秒闪烁5次。注意:
  • 中断里不要使用延时函数Hal_Delay()
  • TIM中断要手动开启(Hal_TIM_Base_Start_IT())9 Z9 \) X2 h/ F7 ^  N

    * E  {( J6 }4 Y5 t) O4 y# o==========" D+ y) \* d; z* Q1 Q! c
    往期回顾:
    ; M" L  Z! j* i. MADC的低功耗和阻抗问题$ p4 l3 l9 i- L5 h( n4 h7 H0 L6 V! g# D
    利用STM32CubeMX解读时钟树) j& C5 h2 f9 H& N# d8 t" F
    付费项目介绍3 I3 A7 o- B/ g8 ?( Y3 V
    有源晶振和无源晶振的区别, m& V* j2 m2 w& q; C3 |
    C语言求数组长度的5种方法, h* E: K2 e- U) z, t7 I
    ==========
    ) M8 E& q" z" H* j+ V- M原文来源:请点击阅读原文作者:(#_#)平台:博客园4 g" e, h) \% B1 E8 K! m6 X
    ) [5 l2 c5 {9 M0 H( M7 V, v7 p; y+ p

    1z2f2ysn1bf64029383739.png

    1z2f2ysn1bf64029383739.png
    % @- Z' V" V# I6 m' \  W0 Y

    9 s2 P8 z( }2 J# m* Q

    a2df0mlpgqm64029383840.png

    a2df0mlpgqm64029383840.png

    - l+ M2 h6 ?  T: x! ~0 R) a  G" r3 x' i$ |$ o

    oxxf2lipwaa64029383940.png

    oxxf2lipwaa64029383940.png
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表