STM32CubeMX的外部中断的使用

efb78b0730933c02a9082ccdd7c83188.png

啥是中断?中断是指计算机运行过程中,出现某些意外情况需主机干预时,机器能自动停止正在运行的程序并转入处理新情况的程序,处理完毕后又返回原被暂停的程序继续运行。

d4b6fa97e0ca2690b6ede39cdd28d916.png

举个例子:

04074eb1f3d81ef76bf71881ca2718b4.png

类比一下

df30f2ae9457ae6e3cd306ed893af57c.png

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

5d00e321c0740b11c3b980cbc1a02ba2.png

中断处理函数写在EXTI_IRQHandler()或HAL_GPIO_EXTI_Callback()皆可,不过HAL_GPIO_EXTI_Callback()需要重新声明,比如:

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();
}

对于代码的意思不必理会,只需知道这些是自己按需求写的,下面开始连接硬件:

5d3343d802ce4a06ad824ef2b4559974.png

以下是实操工程:

1,配置引脚

ff93b6be746ff17b149c5ec24874e3b0.png

2,使能外部中断

ed4fd4281d61e1eb847a212c6298742a.png

3,点击右上角GENERATE CODE生成代码

7be68eab520a37ea2dbcdb8bb613f512.png


Hal_GPIO_TogglePin()这个函数可以反转引脚电平,以控制小灯亮灭,多加的那几行代码用来做一个简单的消抖,然后编译,下载。如果没出问题的话,每按一次按键,灯都会改变一次亮灭状态,上面用的是xxxit.c中的Handler函数,下面试一试Callback函数,注释掉刚才加的代码,在main.c中添加如下代码:

fde28c0a4a3e00a4f9c450660219f89d.png

编译,下载,运行,效果应该跟刚才一样,下面试一下TIM。

7b82776949b282682be34a64ce92e620.png


搞完后,小灯应该每秒闪烁5次。注意:
  • 中断里不要使用延时函数Hal_Delay()

  • TIM中断要手动开启(Hal_TIM_Base_Start_IT())

==========

往期回顾:

ADC的低功耗和阻抗问题

利用STM32CubeMX解读时钟树

付费项目介绍

有源晶振和无源晶振的区别

C语言求数组长度的5种方法

==========

原文来源:请点击阅读原文

作者:(#_#)

平台:博客园

2278d105a900e90e7c73a4bc63564cf0.png

4d7de96205d0d8210aced4309abd0ae9.png

878f3f0028eb5b52f892ff715952b7c2.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值