超详细!STM32滴答定时器SysTick精准延时方法
2023-04-15 13:22:55
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 在停止和待机模式下禁用,在睡眠模式下以低频率运行。