打印
[其他ST产品]

基于STM32中HAL_Delay和中断一起使用经验分享

[复制链接]
1487|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jcky001|  楼主 | 2023-6-15 10:00 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
有关STM32中HAL_Delay和中断一起使用的问题
昨天笔者使用STM32的外部中断EXTI(HAL库。笔者也是第一次用HAL库)配置一个简单的按键控制,因为需要使用HAL_DELAY进行一个短暂的延时,发现使用过程会造成卡死的现象。我们来分析一下原因:
首先,我在调试的过程中是可以进入主函数的。但是当我调试进入到中断回调函数这块,发现到HAL_Delay这里是无法往下进行的。所以问题就出在这里。

1-HAL_Delay
我们先来看看HAL_Delay代码,先根据这里的代码进行分析 :
  • 1/**
  • 2  * @brief This function provides minimum delay (in milliseconds) based
  • 3  *        on variable incremented.
  • 4  * @NOTE In the default implementation , SysTick timer is the source of time base.
  • 5  *       It is used to generate interrupts at regular time intervals where uwTick
  • 6  *       is incremented.
  • 7  * @note This function is declared as __weak to be overwritten in case of other
  • 8  *       implementations in user file.
  • 9  * @param Delay specifies the delay time length, in milliseconds.
  • 10  * @retval None
  • 11  */
  • 12__weak void HAL_Delay(uint32_t Delay)
  • 13{
  • 14  uint32_t tickstart = HAL_GetTick();
  • 15  uint32_t wait = Delay;
  • 16
  • 17  /* Add a freq to guarantee minimum wait */
  • 18  if (wait < HAL_MAX_DELAY)
  • 19  {
  • 20    wait += (uint32_t)(uwTickFreq);
  • 21  }
  • 22
  • 23  while ((HAL_GetTick() - tickstart) < wait)
  • 24  {
  • 25  }
  • 26}

复制代码


上面的注释和代码说HAL_Delay计时器的来源是SysTick定时器,并且在固定的时间内产生中断。对于所有的32位单片机来说,有中断肯定是有优先级的。所以这里有基本上有两个原因:一是优先级的问题,我设置的优先级高于HAL_Delay的优先级造成一直在HAL_Delay中卡死,还有一种就是main函数进不去也是一种原因这种原因就是另外一说了。但是我的是可以进入main函数的,所以,只能是中断优先级的问题。所以我查看了systick优先级。




  • 1/* Tip: To avoid modifying this file each time you need to use different HSE,
  • 2   ===  you can define the HSE value in your toolchain compiler preprocessor. */
  • 3
  • 4/* ########################### System Configuration ######################### */
  • 5/**
  • 6  * @brief This is the HAL system configuration section
  • 7  */
  • 8#define  VDD_VALUE                    3300U /*!< Value of VDD in mv */
  • 9#define  TICK_INT_PRIORITY            0x0FU /*!< tick interrupt priority */
  • 10#define  USE_RTOS                     0U
  • 11#define  PREFETCH_ENABLE              1U

复制代码



从这句#define TICK_INT_PRIORITY 0x0FU /*!< tick interrupt priority */看到,它设置的优先级是最低的。所以是优先级的问题。既然问题找到了现在开始怎样去解决这个问题。

2-问题解决方案1-修改优先级
我们可以在代码中或者STM32CubeMX中重新设置systick的优先级。





2-自己重写延时函数
根据____weak void HAL_Delay(uint32_t Delay)这个我们是可以自己重写演示函数的。__weak 的意思就是自己可以实现定义一个同名的函数。
当然如果不想写网上找一个就行。
但是我个人是建议自己重写一个延时函数,这样容易避免后续由HAL_delay引发的其他问题。



使用特权

评论回复
沙发
V853| | 2023-6-15 18:11 | 只看该作者
HAL_Delay有问题应该是滴答定时器有问题。

使用特权

评论回复
板凳
天天向善| | 2023-6-15 18:11 | 只看该作者
我以为你是中断里面用HAL_Delay函数呢

使用特权

评论回复
地板
软核硬核| | 2023-6-15 18:12 | 只看该作者
自己重写延时函数这个方法不提倡哦。

使用特权

评论回复
5
Bowclad| | 2023-6-15 23:34 | 只看该作者
设置的优先级太高了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1505

主题

4522

帖子

6

粉丝