From ad47719110dec137d58fdb12c095e4231f738d19 Mon Sep 17 00:00:00 2001 From: say Date: Mon, 11 May 2026 22:24:09 -0700 Subject: [PATCH] [boards] Fix off-by-one in SysTick cyclesPerTick reload values Cortex-M SysTick reloads every (LOAD + 1) cycles, so cyclesPerTick must be (clock / ticks_per_second) - 1 to produce the intended period. All ten board configs were one cycle high, causing systick to run slightly slow. Closes #38 --- boards/pic32cz_curiosity_ultra/board.c | 2 +- boards/stm32c031_nucleo/board.c | 2 +- boards/stm32f091rc_nucleo/board.c | 2 +- boards/stm32f302r8_nucleo/board.c | 2 +- boards/stm32f411_blackpill/board.c | 2 +- boards/stm32h563zi_nucleo/board.c | 2 +- boards/stm32l152re_nucleo/board.c | 2 +- boards/stm32n657a0_nucleo/board.c | 2 +- boards/stm32wb55xx_nucleo/board.c | 2 +- boards/stm32wba55cg_nucleo/board.c | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/boards/pic32cz_curiosity_ultra/board.c b/boards/pic32cz_curiosity_ultra/board.c index 10ab949..18496b1 100644 --- a/boards/pic32cz_curiosity_ultra/board.c +++ b/boards/pic32cz_curiosity_ultra/board.c @@ -76,7 +76,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M7_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 300000000 / 1000, + .cyclesPerTick = (300000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32c031_nucleo/board.c b/boards/stm32c031_nucleo/board.c index 76e4e7a..e4b12d1 100644 --- a/boards/stm32c031_nucleo/board.c +++ b/boards/stm32c031_nucleo/board.c @@ -92,7 +92,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M0PLUS_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 48000000 / 1000, /* 48 MHz / 1 kHz = 1 ms tick */ + .cyclesPerTick = (48000000 / 1000) - 1, /* 48 MHz / 1 kHz = 1 ms tick (SysTick reloads every LOAD+1 cycles) */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32f091rc_nucleo/board.c b/boards/stm32f091rc_nucleo/board.c index 804509a..ddc7d75 100644 --- a/boards/stm32f091rc_nucleo/board.c +++ b/boards/stm32f091rc_nucleo/board.c @@ -104,7 +104,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M0_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 48000000 / 1000, + .cyclesPerTick = (48000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32f302r8_nucleo/board.c b/boards/stm32f302r8_nucleo/board.c index e8d0eb8..4e37cf2 100644 --- a/boards/stm32f302r8_nucleo/board.c +++ b/boards/stm32f302r8_nucleo/board.c @@ -107,7 +107,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M4_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 48000000 / 1000, + .cyclesPerTick = (48000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32f411_blackpill/board.c b/boards/stm32f411_blackpill/board.c index 6cebb64..60551ff 100644 --- a/boards/stm32f411_blackpill/board.c +++ b/boards/stm32f411_blackpill/board.c @@ -98,7 +98,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M4_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 100000000 / 1000, /* 100 MHz / 1 kHz = 1 ms tick */ + .cyclesPerTick = (100000000 / 1000) - 1, /* 100 MHz / 1 kHz = 1 ms tick (SysTick reloads every LOAD+1 cycles) */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32h563zi_nucleo/board.c b/boards/stm32h563zi_nucleo/board.c index 3076af8..3827a14 100644 --- a/boards/stm32h563zi_nucleo/board.c +++ b/boards/stm32h563zi_nucleo/board.c @@ -148,7 +148,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M33_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 168000000 / 1000, /* 168 MHz / 1 kHz = 1 ms tick */ + .cyclesPerTick = (168000000 / 1000) - 1, /* 168 MHz / 1 kHz = 1 ms tick (SysTick reloads every LOAD+1 cycles) */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32l152re_nucleo/board.c b/boards/stm32l152re_nucleo/board.c index 5ec167d..66b3200 100644 --- a/boards/stm32l152re_nucleo/board.c +++ b/boards/stm32l152re_nucleo/board.c @@ -119,7 +119,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M3_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 32000000 / 1000, + .cyclesPerTick = (32000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32n657a0_nucleo/board.c b/boards/stm32n657a0_nucleo/board.c index b5deafa..8ccbadd 100644 --- a/boards/stm32n657a0_nucleo/board.c +++ b/boards/stm32n657a0_nucleo/board.c @@ -195,7 +195,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M55_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 64000000 / 1000, /* 64 MHz / 1 kHz = 1 ms tick */ + .cyclesPerTick = (64000000 / 1000) - 1, /* 64 MHz / 1 kHz = 1 ms tick (SysTick reloads every LOAD+1 cycles) */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32wb55xx_nucleo/board.c b/boards/stm32wb55xx_nucleo/board.c index 132689e..56a70de 100644 --- a/boards/stm32wb55xx_nucleo/board.c +++ b/boards/stm32wb55xx_nucleo/board.c @@ -136,7 +136,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M4_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 64000000 / 1000, + .cyclesPerTick = (64000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, }, diff --git a/boards/stm32wba55cg_nucleo/board.c b/boards/stm32wba55cg_nucleo/board.c index 41c1678..b0886bb 100644 --- a/boards/stm32wba55cg_nucleo/board.c +++ b/boards/stm32wba55cg_nucleo/board.c @@ -144,7 +144,7 @@ whal_Timer g_whalTimer = { .driver = WHAL_CORTEX_M33_SYSTICK_DRIVER, .cfg = &(whal_SysTick_Cfg) { - .cyclesPerTick = 100000000 / 1000, + .cyclesPerTick = (100000000 / 1000) - 1, /* SysTick reloads every LOAD+1 cycles */ .clkSrc = WHAL_SYSTICK_CLKSRC_SYSCLK, .tickInt = WHAL_SYSTICK_TICKINT_ENABLED, },