__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority) { /* Configure the SysTick to have interrupt in 1ms time basis*/ if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U) { return HAL_ERROR; } /* Configure the SysTick IRQ priority / if (TickPriority < (1UL << __NVIC_PRIO_BITS)) { HAL_NVIC_SetPriority(SysTick_IRQn, TickPriority, 0U); uwTickPrio = TickPriority; } else { return HAL_ERROR; } / Return function status */ return HAL_OK; }中断时间计算过程
时间: 2024-04-03 08:32:13 浏览: 186
在这段代码中,中断时间的计算过程如下:
1. `SystemCoreClock`是系统时钟频率,单位为Hz。
2. `1000U`表示1毫秒的时间,单位为微秒。
3. `uwTickFreq`是tick的频率,单位为Hz,可以通过`HAL_InitTick()`函数的参数`TickPriority`来设置。
4. `SystemCoreClock / (1000U / uwTickFreq)`表示在tick频率为`uwTickFreq`的情况下,每个tick的时间,单位为微秒。
5. `HAL_SYSTICK_Config()`函数会将上述计算结果作为参数,用于配置SysTick定时器的计数器自动重载寄存器(reload register)的值,来实现1毫秒的中断时间。
6. 如果成功配置定时器中断,`HAL_SYSTICK_Config()`函数将返回0,否则返回非0值。
7. 如果成功配置定时器中断,则通过`HAL_NVIC_SetPriority()`函数设置中断优先级,并将`uwTickPrio`变量设置为`TickPriority`的值。
8. 如果`TickPriority`的值大于或等于`1UL << __NVIC_PRIO_BITS`,则返回错误状态`HAL_ERROR`;否则,返回成功状态`HAL_OK`。
总之,这段代码通过配置SysTick定时器的计数器自动重载寄存器的值,实现了1毫秒的中断时间。
相关问题
HAL_InitTick()和HAL_IncTick()有什么区别?
`HAL_InitTick()` 和 `HAL_IncTick()` 是STM32Cube库中与System Clock Timer(SysTick)相关的两个函数,它们在嵌入式实时操作系统(RTOS)初始化和时间管理中扮演重要角色。
`HAL_InitTick()` 函数主要用于初始化SysTick定时器,它设置了SysTick的中断周期和优先级。该函数的主要目的是配置定时器以产生大约每1毫秒一次的中断,这对于实现RTOS的时间片轮转和其他定时任务非常重要。参数`TickPriority`用于设置SysTick中断的优先级,这影响到中断响应的顺序。
引用[2]:
```c
__weak HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
// ...
if (HAL_SYSTICK_Config(SystemCoreClock / (1000U / uwTickFreq)) > 0U)
{
return HAL_ERROR;
}
// ...
}
```
相比之下,`HAL_IncTick()` 函数用于简单地递增系统计数器,通常表示进程执行的时间。每当一个进程完成其时间片或有其他需要更新时间戳的地方,这个函数就会增加计数器的值,这样RTOS调度器可以依据此来调整下一次调度的时间点。这个操作本身不涉及中断。
总结来说,`HAL_InitTick()` 设置定时器基础和中断优先级,而 `HAL_IncTick()` 只是用来维护时间流逝记录的辅助功能。
阅读全文