我刚开始使用HAL函数。函数的描述 of HAL_GetTick()说,它“提供了一个以毫秒为单位的刻度值”。
我不明白这个函数是返回滴答还是毫秒。当然,要将滴答转换为毫秒,我需要知道一毫秒内有多少滴答滴答,这是特定于CPU的。
那么,HAL_GetTick()到底返回了什么呢?
编辑:
我真正的问题是知道如何用微秒来测量时间。所以我想从HAL_GetTick()上得到滴答,然后把它们转换成微秒。这是在评论中提到的,至少在其中一个答案中,所以我在这里也提到了这一点,我编辑了标题。
发布于 2017-03-12 12:20:24
两者都是。大多数情况下,增加HAL滴答计数器的函数被连接到SysTick中断,该中断被配置为每1ms勾选一次。因此,HAL_GetTick()将返回SysTick中断配置后的毫秒数(基本上是自程序启动以来)。这也可以说是“SysTick中断‘滴答’的次数”。
发布于 2019-08-29 13:30:30
虽然这个问题已经得到了回答,但我认为看看HAL如何使用HAL_GetTick()来计算毫秒是有帮助的。这可以从HAL的函数HAL_Delay(uint32_t Delay)中看出。
HAL_Delay(uint32_t Delay)在stm32l0xx_hal.c中的实现
/**
* @brief This function provides minimum delay (in milliseconds) based
* on variable incremented.
* @note In the default implementation , SysTick timer is the source of time base.
* It is used to generate interrupts at regular time intervals where uwTick
* is incremented.
* @note This function is declared as __weak to be overwritten in case of other
* implementations in user file.
* @param Delay specifies the delay time length, in milliseconds.
* @retval None
*/
__weak void HAL_Delay(uint32_t Delay)
{
uint32_t tickstart = HAL_GetTick();
uint32_t wait = Delay;
/* Add a period to guaranty minimum wait */
if (wait < HAL_MAX_DELAY)
{
wait++;
}
while((HAL_GetTick() - tickstart) < wait)
{
}
}发布于 2020-09-08 00:15:25
我也遇到了同样的问题,但是在PlatformIO中找到了一个库函数,它返回微秒。
uint32_t getCurrentMicros(void)
{
/* Ensure COUNTFLAG is reset by reading SysTick control and status register */
LL_SYSTICK_IsActiveCounterFlag();
uint32_t m = HAL_GetTick();
const uint32_t tms = SysTick->LOAD + 1;
__IO uint32_t u = tms - SysTick->VAL;
if (LL_SYSTICK_IsActiveCounterFlag()) {
m = HAL_GetTick();
u = tms - SysTick->VAL;
}
return (m * 1000 + (u * 1000) / tms);
}它位于~/.platformio/packages/framework-arduinoststm32/libraries/SrcWrapper/src/stm32/clock.c
但是它看起来好像STM32CubeIde没有它,所以我只是从PlatformIO复制它。此外,我还必须复制LL_SYSTICK_IsActiveCounterFlag()函数:
static inline uint32_t LL_SYSTICK_IsActiveCounterFlag(void)
{
return ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == (SysTick_CTRL_COUNTFLAG_Msk));
}https://stackoverflow.com/questions/42747128
复制相似问题