论坛元老
- 积分
- 3320
- 金钱
- 3320
- 注册时间
- 2016-3-19
- 在线时间
- 816 小时
|
发表于 2023-5-8 09:50:18
|
显示全部楼层
以 cortex-m3 内核为例
如果以系统默认配置的话 systick 使用的是内核时钟
void vPortSetupTimerInterrupt( void )
{
/* Calculate the constants required to configure the tick interrupt. */
#if configUSE_TICKLESS_IDLE == 1
{
ulTimerCountsForOneTick = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ );
xMaximumPossibleSuppressedTicks = portMAX_24_BIT_NUMBER / ulTimerCountsForOneTick;
ulStoppedTimerCompensation = portMISSED_COUNTS_FACTOR / ( configCPU_CLOCK_HZ / configSYSTICK_CLOCK_HZ );
}
#endif /* configUSE_TICKLESS_IDLE */
/* Configure SysTick to interrupt at the requested rate. */
portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL;
portNVIC_SYSTICK_CTRL_REG = ( portNVIC_SYSTICK_CLK_BIT | portNVIC_SYSTICK_INT_BIT | portNVIC_SYSTICK_ENABLE_BIT );
}
此时,如果更改了内核时钟的话 不更改 systick 的配置 不仅仅是延时不准确 系统依靠 系统节拍的相关功能都会不准确
所以 如果更改了系统时钟的话 同时需要更改一下 systick 的计数值
即:portNVIC_SYSTICK_LOAD_REG = ( configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ ) - 1UL; configSYSTICK_CLOCK_HZ 这个宏定义需要改成当前系统时钟的值
|
|