embedded
runtime_error
ai_generated
true
Systick: timer underflow detected, system tick count corrupted
ID: embedded/arm-systick-timer-underflow
90%Fix Rate
85%Confidence
1Evidence
2024-03-12First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| 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-timerWorkarounds
-
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);
-
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; }
中文步骤
Set SysTick reload value to (SystemCoreClock / 1000) - 1 for 1ms tick, and ensure CLKSOURCE bit selects processor clock. Example: SysTick_Config(SystemCoreClock / 1000);
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:
-
85% fail
Increasing SysTick interrupt priority does not fix the underflow, as the issue is timer reload value, not priority masking.
-
90% fail
Adding more delay loops in main loop does not prevent timer underflow; the problem is deterministic and timing-independent.