首先赞一个原子提供的延时函数很准。
因为项目问题,参照了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)也是一闪而过。不知有没有谁遇到过这种问题。请大家指教!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>