在做FREERTOS项目中,发现vTaskDelay延时时间明显较长,解决问题后将问题和解决方案总结,希望对大家有所帮助
1 检查外部晶振软件设置与硬件是否对应
2 检查系统时钟Tick挂在哪个时钟上面
在FREERTOSconfig.h文件中找到configCPU_CLOCK_HZ定义是否挂在总线时钟上,即
#define configCPU_CLOCK_HZ (SystemCoreClock)
3 不要自己手动定义configSYSTICK_CLOCK_HZ,在port.c的文件中系统会设置configSYSTICK_CLOCK_HZ
#ifndef configSYSTICK_CLOCK_HZ
#define configSYSTICK_CLOCK_HZ configCPU_CLOCK_HZ
/* Ensure the SysTick is clocked at the same frequency as the core. */
#define portNVIC_SYSTICK_CLK_BIT ( 1UL << 2UL )
#else
/* The way the SysTick is clocked is not modified in case it is not the same
as the core. */
#define portNVIC_SYSTICK_CLK_BIT ( 0 )
#endif
上述代码中如果手动设置会导致SysTick的第二位状态寄存器清零,也就是使用外部时钟源,这不是总线时钟,而SysTick的第二位状态寄存器为1时,系统使用内部时钟源 也就是总线时钟,所以不要手动定义configSYSTICK_CLOCK_HZ。
4 如果换晶振使用,例如官方默认25MHZ外部晶振,而自己使用8MHZ晶振,更改官方库定义后,运行SystemCoreUpdate()函数