返回

超详细!STM32滴答定时器SysTick精准延时方法

闲谈

STM32 SysTick 滴答定时器:精准延时的利器

在嵌入式开发中,精准的延时功能对于许多应用至关重要。STM32 微控制器提供了强大的滴答定时器 SysTick,可用于满足这一需求。本文将深入探讨如何使用 SysTick 进行精确延时,涵盖其配置、编程和拓展应用,让您轻松掌握这一实用功能。

配置 SysTick 时钟源

SysTick 需要一个时钟源才能正常工作。在 STM32 启动文件中,通常会配置 AHB 时钟作为其时钟源,如下所示:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SysTick, ENABLE);
SysTick_Config(SystemCoreClock / 1000);

这行代码将 AHB 时钟使能,并配置 SysTick 的重装值,使它每 1 毫秒产生一个中断。

编写 delay_ms() 函数

为了利用 SysTick 进行延时,我们需要创建一个函数,该函数接受延时毫秒数并执行延时操作。在 delay.c 文件中,我们可以编写以下代码:

void delay_ms(uint32_t ms)
{
  SysTick->LOAD = ms * (SystemCoreClock / 1000) - 1;
  SysTick->VAL = 0;
  SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
  while ((SysTick->CTRL & SysTick_CTRL_COUNTFLAG_Msk) == 0)
  {
  }
  SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}

此函数将 SysTick 的重装值设置为 ms * (SystemCoreClock / 1000) - 1,然后使能 SysTick 并等待 SysTick 中断发生。当中断发生时,函数关闭 SysTick 并返回。

调用 delay_ms() 函数

main() 函数中,我们可以调用 delay_ms() 函数来执行延时操作:

int main(void)
{
  // 初始化 SysTick
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SysTick, ENABLE);
  SysTick_Config(SystemCoreClock / 1000);

  // 使用 delay_ms() 函数进行延时
  delay_ms(1000);

  // ...

  return 0;
}

这样,我们就完成了使用 SysTick 进行延时的所有配置和编程步骤。

拓展应用

SysTick 不仅仅用于延时,它还可以用于以下目的:

  • 定时器中断
  • PWM 输出
  • 时钟测量

通过灵活配置 SysTick 的时钟源、中断优先级和重装值,我们可以定制其行为以满足各种应用需求。

常见问题解答

1. 为什么我的延时不准确?

  • 确保 SysTick 的时钟源和中断优先级已正确配置。
  • 检查重装值计算是否正确。
  • 避免在中断处理程序中进行繁重的计算或操作,这可能会延迟 SysTick 中断。

2. 我可以在 SysTick 中断中执行代码吗?

  • 是的,您可以通过编写 SysTick 中断服务程序并在其中执行所需的代码。

3. SysTick 能否产生子毫秒延时?

  • 否,SysTick 无法产生子毫秒延时。

4. 如何调整 SysTick 的延时精度?

  • 通过修改 SysTick 的时钟源或重装值,您可以调整其延时精度。

5. SysTick 在低功耗模式下的行为如何?

  • SysTick 在停止和待机模式下禁用,在睡眠模式下以低频率运行。