电子产业一站式赋能平台

PCB联盟网

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

STM32CubeMX的外部中断的使用

[复制链接]

397

主题

397

帖子

2463

积分

三级会员

Rank: 3Rank: 3

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

oz2h3bmp2oh64029382638.png

oz2h3bmp2oh64029382638.png
6 d3 N: z9 g! W" p1 M% `0 b

+ B; y( w+ _3 W  g9 S7 @- v$ W) B啥是中断?中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。! C( p# S/ ^, e/ k$ x

st1b1ccmffs64029382738.png

st1b1ccmffs64029382738.png

$ R) Q, C+ f" T( @/ Y4 [$ s+ D举个例子:
: z: h1 K0 R( N0 e  K( e6 D

0tjk4u2byrh64029382838.png

0tjk4u2byrh64029382838.png

# Y& F4 c/ U! ^& ?类比一下' Y$ f% E1 d7 B7 U

lq0fijzlacz64029382938.png

lq0fijzlacz64029382938.png
3 O: s* G. x; ?
在实际的代码中,HAL库的中断处理较为复杂:startup_stm32f103xb.s通过汇编注册了中断处理函数EXTI1_IRQHandler(),在stm32f1xx_it.c中,EXTI_IRQHandler()引用了HAL库的处理函数HAL_GPIO_EXTI_IRQHandler(),其功能主要为判断具体的中断原因,并调用对应的中断回调函数:HAL_GPIO_EXTI_Callback()。用户可以自己重声明中断回调函数(HAL_GPIO_EXTI_Callback()),在其中写入自己的用户逻辑,不出意外的话,你这时候可能会有点懵。上图!
; O- e$ J5 H* [& o

ozgytbbbi5f64029383038.png

ozgytbbbi5f64029383038.png
8 U* Y  e7 V4 A7 g+ R) W+ U
中断处理函数写在EXTI_IRQHandler()或HAL_GPIO_EXTI_Callback()皆可,不过HAL_GPIO_EXTI_Callback()需要重新声明,比如:. p* t- N: I; Y2 w! @0 r% R
  • 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();}
    ! T) u" e4 @, G9 E; |对于代码的意思不必理会,只需知道这些是自己按需求写的,下面开始连接硬件:# P8 i' z% w9 e  Z

    z4ewrj4o1te64029383138.png

    z4ewrj4o1te64029383138.png

    : w2 W( r% S6 I# I1 z3 S以下是实操工程:1,配置引脚4 Y/ \# C) R5 @5 T) Q% S

    inwbqvj4put64029383238.png

    inwbqvj4put64029383238.png
    4 B# I) C+ I) ~
    4 F! \4 q. r; I. C5 s8 T6 d
    2,使能外部中断
    1 w3 o! T7 |" y) P- p: i) t  K0 K

    5zpqaemybnk64029383338.png

    5zpqaemybnk64029383338.png

    ) _. R8 F8 y5 [: X8 w3 [& M9 T7 n
    3,点击右上角GENERATE CODE生成代码
    ( b7 {1 w% g% o4 ^7 o

    r4fvxkvgai164029383439.png

    r4fvxkvgai164029383439.png

    4 t3 g. W9 e' c. D$ ]+ v5 B, K- Q) |# [+ Y7 ^$ e: R; R; R
    Hal_GPIO_TogglePin()这个函数可以反转引脚电平,以控制小灯亮灭,多加的那几行代码用来做一个简单的消抖,然后编译,下载。如果没出问题的话,每按一次按键,灯都会改变一次亮灭状态,上面用的是xxxit.c中的Handler函数,下面试一试Callback函数,注释掉刚才加的代码,在main.c中添加如下代码:
    . ~7 x) ^/ q: l* Q/ w+ J" o& _  V* L: z' s

    gxniya0ysww64029383539.png

    gxniya0ysww64029383539.png
    ' y& N" S  p1 t9 ~% }4 U
    编译,下载,运行,效果应该跟刚才一样,下面试一下TIM。
    / y- X; K5 a6 `. m8 H

    0zgwy2ry4v164029383639.png

    0zgwy2ry4v164029383639.png

    + k6 c! ]/ P' b* z, G6 A8 U) \, X. |
    搞完后,小灯应该每秒闪烁5次。注意:
  • 中断里不要使用延时函数Hal_Delay()
  • TIM中断要手动开启(Hal_TIM_Base_Start_IT())% q, z% C8 J. p
    ' ]# V9 F" ^2 l% P7 @' N% E, r
    ==========
    4 C) X! D$ c0 g0 I往期回顾:  J7 J% S: z0 c) j( B& ]& f7 x: H
    ADC的低功耗和阻抗问题
    9 g6 t& Y- N" F; j& j8 w8 q利用STM32CubeMX解读时钟树
    : s# N3 v- ?  [# q; X% R付费项目介绍& N& v0 H! X/ n. a9 ], z9 J
    有源晶振和无源晶振的区别
    - V6 [! d5 z8 ~2 @& EC语言求数组长度的5种方法
    5 m7 I8 _( |  Q+ n7 y, c+ O==========' V( V2 [' D% r. S5 {4 e- A/ e5 ?. n7 b
    原文来源:请点击阅读原文作者:(#_#)平台:博客园/ G6 h# V" O' R8 C! P
    : i5 \# A' w6 p8 K, @

    1z2f2ysn1bf64029383739.png

    1z2f2ysn1bf64029383739.png

    , i) t0 H! I* q2 S) {. Y& I9 w- Q2 J9 q" g

    a2df0mlpgqm64029383840.png

    a2df0mlpgqm64029383840.png

    0 k. k( O; j& S2 E9 Y- ~# T- n/ d0 J' f$ }( s

    oxxf2lipwaa64029383940.png

    oxxf2lipwaa64029383940.png
  • 回复

    使用道具 举报

    发表回复

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

    本版积分规则


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