embedded runtime_error ai_generated true

Systick: timer underflow detected, system tick count corrupted

ID: embedded/arm-systick-timer-underflow

Also available as: JSON · Markdown · 中文
90%Fix Rate
85%Confidence
1Evidence
2024-03-12First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
CMSIS 5.9.0 active
FreeRTOS 10.4.6 active
ARM Cortex-M4 r1p1 active

Root Cause

SysTick timer reload value set too low or clock divider misconfigured, causing counter to underflow before interrupt service routine can increment tick count.

generic

中文

SysTick定时器重载值设置过低或时钟分频器配置错误,导致计数器在中断服务程序递增滴答计数之前下溢。

Official Documentation

https://developer.arm.com/documentation/dui0552/a/cortex-m3-peripherals/systick-timer

Workarounds

  1. 92% success Set SysTick reload value to (SystemCoreClock / 1000) - 1 for 1ms tick, and ensure CLKSOURCE bit selects processor clock. Example: SysTick_Config(SystemCoreClock / 1000);
    Set SysTick reload value to (SystemCoreClock / 1000) - 1 for 1ms tick, and ensure CLKSOURCE bit selects processor clock. Example: SysTick_Config(SystemCoreClock / 1000);
  2. 85% success Add a guard in SysTick_Handler to check reload value: if (SysTick->LOAD == 0) { SysTick->LOAD = (SystemCoreClock / 1000) - 1; }
    Add a guard in SysTick_Handler to check reload value: if (SysTick->LOAD == 0) { SysTick->LOAD = (SystemCoreClock / 1000) - 1; }

中文步骤

  1. Set SysTick reload value to (SystemCoreClock / 1000) - 1 for 1ms tick, and ensure CLKSOURCE bit selects processor clock. Example: SysTick_Config(SystemCoreClock / 1000);
  2. Add a guard in SysTick_Handler to check reload value: if (SysTick->LOAD == 0) { SysTick->LOAD = (SystemCoreClock / 1000) - 1; }

Dead Ends

Common approaches that don't work:

  1. 85% fail

    Increasing SysTick interrupt priority does not fix the underflow, as the issue is timer reload value, not priority masking.

  2. 90% fail

    Adding more delay loops in main loop does not prevent timer underflow; the problem is deterministic and timing-independent.