最近使用STM32G030F6P6这款芯片使用STM32 CubleMX生成工程在实际使用调用LL库充LL_mDelay()毫秒延时函数发现LL_mDelay(1)实际延时不是1ms而是2ms。检查时钟配置输出到io测试均没有问题百思不得其解。一度怀疑买了假的芯片。后来无意中看了一眼LL_mDelay()函数原型才发现这个大坑这个LL_mDelay(1)函数实际精度延时是1ms~2ms具体是多少看跳进延时那一刻清Systick的COUNTFLAG标志位的时候SysTick-VAL的值是多少。库函数版本STM32Cube_FW_G0_V1.5.1STM32 CubleMX版本6.3.0LL_mDelay()函数原型void LL_mDelay(uint32_t Delay) { __IO uint32_t tmp SysTick-CTRL; /* Clear the COUNTFLAG first */ uint32_t tmpDelay; /* MISRAC2012-Rule-17.8 */ /* Add this code to indicate that local variable is not used */ ((void)tmp); tmpDelay Delay; /* Add a period to guaranty minimum wait */ if (tmpDelay LL_MAX_DELAY) { tmpDelay ; //问题就出在这里 } while (tmpDelay ! 0U) { if ((SysTick-CTRL SysTick_CTRL_COUNTFLAG_Msk) ! 0U) { tmpDelay --; } } }测试函数(通过反转LED Pin挂示波器测试int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG); LL_APB1_GRP1_EnableClock(LL_APB1_GRP1_PERIPH_PWR); /* System interrupt init*/ /* SysTick_IRQn interrupt configuration */ NVIC_SetPriority(SysTick_IRQn, 3); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_I2C1_Init(); /* USER CODE BEGIN 2 */ LL_SYSTICK_SetClkSource(LL_SYSTICK_CLKSOURCE_HCLK); // /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ LL_GPIO_TogglePin(LED_GPIO_Port ,LED_Pin); LL_mDelay(1); } /* USER CODE END 3 */ }验证实际LL_mDelay(1)LED电平反转是2msLL_mDelay(0)LED电平反转是1ms原因就是 LL_mDelay()为了保证延时至少达到预期以上定时时长自加了1太操蛋了对于需要精确时序控制的场合还是自己写这个顺手的API是大坑if (tmpDelay LL_MAX_DELAY) { tmpDelay ; }