配置 sysTick 计时器

Posted

技术标签:

【中文标题】配置 sysTick 计时器【英文标题】:Configuring sysTick timer 【发布时间】:2021-12-30 19:38:48 【问题描述】:

我正在尝试将 Systick Timer 配置为生成 1ms 中断。我的MCU是STM32F767,我的时钟频率如下图

Oscillator = HSE
No PLL
SYSCLK = 25 MHz
AHB Prescaler = 2
HCLK = 12.5 MHz
APB1 Prescaler  = 2
PCLK1 = 6.25 MHz
APB2 Prescaler  = 2
PCLK2 = 6.25 MHz

我已正确配置时钟并验证频率正确。

现在下一部分是我想配置 SysTick 定时器以每 1 毫秒产生一次中断。据我了解,HAL_Delay() 方法需要将 systick 定时器设置为 1 毫秒的中断。

现在因为我的 HCLK 是 12.5 MHz,所以每个周期持续 0.08 us。要每 1 毫秒获得一次中断,我必须将 SysTick 重载值配置为 12500。我正在这样做。

    HAL_SYSTICK_Config(12500);
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

现在当我调用以下代码时,

    while(1)
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
        HAL_Delay(1000);
        HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
        HAL_Delay(1000);

        counter++;
    

pin 以大约 3 秒而不是 1 秒的速度切换。我在这里做错了什么?

【问题讨论】:

我不认为 systick 来自 hclk,而是来自 sysclk。检查参考手册中的时钟树。 不,SysTick 定时器来自 HCLK。在我的情况下,HCLK 和 SYSCLK 都以相同的频率运行,因为 AHB1 预分频器为 1。 【参考方案1】:

所以,我找到了解决方案,虽然我的 HSE 是 25 MHz,但事实并非如此,在阅读了 MCU 的数据表后(不要依赖 CubeMX 获取此值,因为 CubeMX 上的默认 HSE 显示为 25 MHz 这不是 nucleo-stm32f767zi 板的情况。),我发现 HSE 来自 ST-Link 电路,该信号的频率是 8 Mhz,而不是我最初认为的 25 MHz。这就是为什么我的 Led 切换速度慢了大约三倍。

【讨论】:

以上是关于配置 sysTick 计时器的主要内容,如果未能解决你的问题,请参考以下文章

SysTick系统定时器(功能框图和优先级配置)

SWM181利用SysTick定时器配置延时函数

STM32 学习9 SysTick 定时器

10 . 定时器介绍和应用

10 . 定时器介绍和应用

Cortex-M4 上的 Systick 定时器:它的预分频器是啥?