短文标题SysTick内核自带“心跳”HAL_Delay和RTOS都靠它你有没有想过一个问题HAL_Delay(1000)为什么能延时1秒FreeRTOS的vTaskDelay(100)又是怎么知道100ms到了答案SysTick。一个集成在Cortex-M内核里的24位递减定时器在所有Cortex-M芯片上都有地址固定。SysTick的三个寄存器CMSIS定义配置方法SysTick_Config(SystemCoreClock / 1000); // 每1ms中断一次为HAL_Delay提供“心跳”HAL_Delay的底层是uwTick变量由SysTick中断每1ms加1。__weak void HAL_Delay(uint32_t Delay){uint32_t tickstart HAL_GetTick();uint32_t wait Delay;if (wait HAL_MAX_DELAY) wait; // 补偿一个tickwhile ((HAL_GetTick() - tickstart) wait);}SysTick停HAL_Delay就停。调试时在SysTick中断设断点会导致时间停滞。RTOS的心跳FreeRTOS的configTICK_RATE_HZ通常100或1000Hz对应SysTick的中断频率。SysTick中断里调用xTaskIncrementTick()检查任务延时、时间片轮转等。没有SysTickRTOS就没有时间基准任务无法切换。时钟频率改变后必须重配SysTick上电默认用HSI8MHz配置SysTick。执行SystemClock_Config切换到PLL72MHz后SystemCoreClock更新为72000000但SysTick的LOAD值仍是8000。72MHz下8000个时钟周期≈111μs不是1ms。HAL_RCC_ClockConfig会自动调用HAL_InitTick重配SysTick手动改时钟时别忘调用。SysTick中断优先级SysTick中断优先级通常设为最低15确保高优先级中断串口接收、外部急停能随时打断SysTick不增加中断延迟。FreeRTOS的最低优先级可设为configLIBRARY_LOWEST_INTERRUPT_PRIORITYSysTick设为此值。微秒延时的替代方案SysTick的1ms分辨率不适合微秒延时。方案硬件定时器TIM2微秒级PWM或单脉冲模式DWT外设Cortex-M内核自带DWT-CYCCNT 72MHz下1 tick≈13.9nsvoid delay_us(uint32_t us) {uint32_t start DWT-CYCCNT;uint32_t cycles us * (SystemCoreClock / 1000000);while ((DWT-CYCCNT - start) cycles);}这个故事的启示SysTick不是“又一个定时器”它是系统软件的时间基石。HAL_Delay、RTOS、软件定时器都依赖它的心跳。没有SysTickSTM32的软件生态会塌掉一半。写在最后SysTick不起眼但它是整个嵌入式软件的“脉搏”。HAL_Delay靠它RTOS靠它软件定时器靠它。一个1ms的心跳撑起整个系统的时间线。本文灵感源于于振南《新概念ARM32单片机》教程第6.1节、第6.2节、第6.3节。觉得有用点赞、转发让更多人看懂SysTick的“心跳”智慧。