uint32_t HAL_SYSTICK_Config(uint32_t TicksNumb);
时间: 2023-08-05 18:11:12 浏览: 110
`HAL_SYSTICK_Config()` 是一个函数,用于配置 SysTick 定时器的时间间隔。它的参数 `TicksNumb` 是一个 32 位无符号整数,表示 SysTick 定时器的计数器每经过多少时钟周期就会加一。该函数返回一个 32 位无符号整数,表示 SysTick 定时器的时钟频率。在调用该函数之前,需要先初始化 SysTick 定时器的时钟源和中断优先级。
相关问题
__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; }中断时间计算过程
在这段代码中,中断时间的计算过程如下:
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毫秒的中断时间。
【STM32HAL库学习】SysTick延时
在STM32 HAL库中,SysTick(系统定时器)常用于实现精确的微秒级延时。这里有一个基本的示例[^1]:
1. **启用SysTick**:
```c
// 启用SysTick
HAL_InitTick(1); // 设置SysTick周期为1us (1kHz)
```
2. **配置SysTick Reload值**:
```c
uint32_t tick_period_us = 1000; // 指定1ms延时,即Reload值等于周期数 * 周期长度
SysTick_Config(SystemCoreClock / tick_period_us);
```
3. **等待指定时间**:
```c
while (SysTick_GetCounter() < tick_period_us); // 循环直到达到设定的时间间隔
```
注意,`SystemCoreClock`是STM32芯片的CPU时钟频率,你需要根据具体的STM32型号来替换。
对于更复杂的延时需求,如STM32MP157[^2],可能需要利用其特定的驱动程序和配置选项。该项目提供了预编译的驱动程序以简化开发过程。
阅读全文