systick用于管理延时函数的精度问题

2019-07-21 01:08发布

首先赞一个原子提供的延时函数很准。
因为项目问题,参照了ST官方提供的源码。代码中将systick设置为优先级最高,10ms一个节拍。
[mw_shl_code=c,true] /* Configure Systick clock source as HCLK */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* SystTick configuration: an interrupt every 10ms */ RCC_GetClocksFreq(&RCC_Clocks); SysTick_Config(RCC_Clocks.HCLK_Frequency / 100); /* Set Systick interrupt priority to 0*/ NVIC_SetPriority (SysTick_IRQn, 0);[/mw_shl_code] 以下为延时函数:
[mw_shl_code=c,true]/** * @brief Inserts a delay time. * @param nCount: number of 10ms periods to wait for. * @retval None */ void Delay(uint32_t nCount) { /* Capture the current local time */ timingdelay = LocalTime + nCount; /* wait until the desired delay finish */ while(timingdelay > LocalTime) { } } /** * @brief Updates the system local time * @param None * @retval None */ void Time_Update(void) { LocalTime += SYSTEMTICK_PERIOD_MS; }[/mw_shl_code] 以下为中断文件stm32f4xx_it.c中的中断函数:
[mw_shl_code=c,true]/** * @brief This function handles SysTick Handler. * @param None * @retval None */ void SysTick_Handler(void) { // /* Update the LocalTime by adding SYSTEMTICK_PERIOD_MS each SysTick interrupt */ Time_Update(); }[/mw_shl_code] 从原理上讲Delay(100)应该是1s。但实际效果却并没有那么久,即使Delay(1000)也是一闪而过。不知有没有谁遇到过这种问题。请大家指教!



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。