HAL_GetTick() 总是返回 0

问题描述 投票:0回答:4

我目前正在开发一个具有现有代码库的项目,其中 HAL_GetTick() 在某些地方工作,但是当我尝试在其他文件中调用该函数时,它返回 0。 HAL_Delay() 确实出于某种原因起作用。

我错过了什么明显的东西吗?

stm32 hal stm32cubeide
4个回答
1
投票

在我看来,您的代码库可能覆盖了该功能。请参阅这篇关于 HAL_GetTick() 的帖子: STM32和HAL函数GetTick()

作为替代方案,您可以执行以下操作。如果您知道计时器的频率,您可以使用以下代码片段:

const uint32_t freq = 1000000; // Freq in Hz
uint32_t get_ticks() 
{
    uint32_t ticks = __HAL_TIM_GET_COUNTER(&htim2);
    return ticks;
}
double ticks_to_seconds(uint32_t ticks)
{
    double seconds = (double) ticks/freq;
    return seconds;
}

1
投票

HAL 使用的内部(全局)滴答计数器变量在 ISR 中递增。如果您碰巧禁用了 IRQ,则计数器将不再增加。如果您在启动后根本没有启用中断,这同样适用。

注意:您报告了(可重现的?)结果值

0
,这暗示滴答计数器自上电以来 never 递增。这表明我们假设您忘记了

  • 启用底层中断(
    SysTick
    除非你选择了一些
    TIM
    ,例如,在CubeMX中)
  • 全局启用中断
  • 保留 CubeHAL
    SysTick
    /
    TIMx
    处理程序代码替换为您自己的代码后 (<-- less realistic option...).

1
投票

忘了说我也用LoRaWAN。显然 LoRaWAN 也有像 HAL_InitTick() 和 HAL_Delay() 这样的函数。我得出的结论是 LoRaWAN 以某种方式覆盖了计时器。

我如何通过进入 mlm32I0xx_hal_msp.c 并重新定义 HAL_GetTick() 来解决这个问题:

uint32_t HAL_GetTick(void){
   return HW_RTC_Tick2ms(HW_RTC_GetTimerValue());
}

希望我可以帮助其他人解决这个问题。


0
投票

我重新配置了中断向量,可以用了。可以根据编程手册的SysTick定时器(STK)部分查看寄存器的值是否更新了

© www.soinside.com 2019 - 2024. All rights reserved.