diff --git a/Marlin/src/HAL/HAL_STM32/HAL.cpp b/Marlin/src/HAL/HAL_STM32/HAL.cpp
index 67765300049108b212869c7567f9ff81fc3e33cc..1bddf77f48a446e46b1d1fd1897ef32ddbcf1b6c 100644
--- a/Marlin/src/HAL/HAL_STM32/HAL.cpp
+++ b/Marlin/src/HAL/HAL_STM32/HAL.cpp
@@ -78,14 +78,20 @@ uint16_t HAL_adc_result;
// Public functions
// --------------------------------------------------------------------------
-// HAL initialization task
-void HAL_init(void) {
- // Needed for DELAY_NS() / DELAY_US() on CORTEX-M7
- #if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7
+// Needed for DELAY_NS() / DELAY_US() on CORTEX-M7
+#if (defined(__arm__) || defined(__thumb__)) && __CORTEX_M == 7
+ // HAL pre-initialization task
+ // Force the preinit function to run between the premain() and main() function
+ // of the STM32 arduino core
+ __attribute__((constructor (102)))
+ void HAL_preinit() {
enableCycleCounter();
- #endif
+ }
+#endif
+// HAL initialization task
+void HAL_init(void) {
FastIO_init();
#if ENABLED(SDSUPPORT)