嵌入式学习小组
直播中

李咏华

7年用户 190经验值
私信 关注

ministm32例程freertos中的系统滴答时钟?

代码在:2个地方定义初始化了系统滴答时钟1、delay.c中
[AppleScript] 纯文本查看 复制代码
void delay_init(){u32 reload;Systick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLKfac_us=SystemCoreClock/1000000;//不论是否使用OS,fac_us都需要使用reload=SystemCoreClock/1000000;//每秒钟的计数次数 单位为M  reload*=1000000/configTICK_RATE_HZ;//根据configTICK_RATE_HZ设定溢出时间//reload为24位寄存器,最大值:16777216,在72M下,约合0.233s左右fac_ms=1000/configTICK_RATE_HZ;//代表OS可以延时的最少单位   SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk;   //开启SYSTICK中断SysTick->LOAD=reload; //每1/configTICK_RATE_HZ秒中断一次SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk;   //开启SYSTICK    }   
2、port.c中也定义了,通过vTaskStartScheduler-->xPortStartScheduler-->vPortSetupTimerInterrupt
[AppleScript] 纯文本查看 复制代码
#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0void 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 );}#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */
按说用其中一个就可以了,但是为什么取消delay中的系统滴答初始化时候,系统跑不起来?
谢谢指教

回帖(4)

刘红

2020-7-20 09:50:55
你好 能否说仔细
举报

秦涌安

2020-7-20 10:00:58
FreeRTOS使用了系统时钟SystemCoreClock(F103板子就是72M)做为滴答定时器的时基,所以做为用户的我们就只能在自己编写的delay.c中也使用SystemCoreClock,而不是1/8;因此需要将裸机版本的delay.c中的滴答定时器时基改为SystemCoreClock!,这样我们就可以使用裸机下的那些delay_us()函数了。
在main函数开始的时候使用delay_init()的目的是为了初始化函数delay_xms(u32 nms)和delay_us(u32 nus)所需要的某些因子(这两个函数不是用的系统延时函数),这样你就可以在你的工程里像使用裸机一样使用这两个延时函数了。 也可以把delay_init()函数里的这行注释掉”SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);”,因为任务开启任务调度器里也这么写了一句。
举报

肖舒

2020-7-20 10:37:01
谢谢楼上各位回复。
举报

乔丽娜

2020-7-20 10:54:50
你用那个最简单那个例程(移植实验观察LED灯那个)肯定可以跑起来的,你之所以会出现跑不起来是因为你在开启调度器也就是初始化systick前,调用了延时函数 比如在LCD_Init()里面,而这时你的滴答定时器还没有初始化。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分