我目前正在开发一个具有现有代码库的项目,其中 HAL_GetTick() 在某些地方工作,但是当我尝试在其他文件中调用该函数时,它返回 0。 HAL_Delay() 确实出于某种原因起作用。
我错过了什么明显的东西吗?
在我看来,您的代码库可能覆盖了该功能。请参阅这篇关于 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;
}
HAL 使用的内部(全局)滴答计数器变量在 ISR 中递增。如果您碰巧禁用了 IRQ,则计数器将不再增加。如果您在启动后根本没有启用中断,这同样适用。
注意:您报告了(可重现的?)结果值
0
,这暗示滴答计数器自上电以来 never 递增。这表明我们假设您忘记了
SysTick
除非你选择了一些TIM
,例如,在CubeMX中)SysTick
/TIMx
处理程序代码替换为您自己的代码后 (<-- less realistic option...).忘了说我也用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());
}
希望我可以帮助其他人解决这个问题。
我重新配置了中断向量,可以用了。可以根据编程手册的SysTick定时器(STK)部分查看寄存器的值是否更新了