OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6875|回复: 7

请教ministm32例程freertos中的系统滴答时钟的问题

[复制链接]

91

主题

170

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2015-9-22
在线时间
101 小时
发表于 2018-4-11 09:32:31 | 显示全部楼层 |阅读模式
1金钱
代码在:2个地方定义初始化了系统滴答时钟1、delay.c中
[mw_shl_code=applescript,true]void delay_init()
{
        u32 reload;
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK
        fac_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   
}                                                                    
[/mw_shl_code]

2、port.c中也定义了,通过vTaskStartScheduler-->xPortStartScheduler-->vPortSetupTimerInterrupt
[mw_shl_code=applescript,true]#if configOVERRIDE_DEFAULT_TICK_CONFIGURATION == 0

        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 );
        }

#endif /* configOVERRIDE_DEFAULT_TICK_CONFIGURATION */[/mw_shl_code]

按说用其中一个就可以了,但是为什么取消delay中的系统滴答初始化时候,系统跑不起来?
谢谢指教

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

24

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2017-4-12
在线时间
48 小时
发表于 2018-4-11 13:09:06 来自手机 | 显示全部楼层
FreeRTOSConfig没有定义嘀嗒定时器
回复

使用道具 举报

91

主题

170

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2015-9-22
在线时间
101 小时
 楼主| 发表于 2018-4-11 16:15:20 | 显示全部楼层
xiaokai 发表于 2018-4-11 13:09
FreeRTOSConfig没有定义嘀嗒定时器

你好 能否说仔细
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-11 17:35:50 | 显示全部楼层
本帖最后由 wen619 于 2018-4-12 16:22 编辑

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);”,因为任务开启任务调度器里也这么写了一句。

回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-11 20:08:49 来自手机 | 显示全部楼层
        SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-11 20:11:57 来自手机 | 显示全部楼层
本帖最后由 wen619 于 2018-4-12 16:24 编辑
wen619 发表于 2018-4-11 20:08
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK);//选择外部时钟  HCLK

把这段代码注释掉,调用delay_ini(),开启任务调度器,然后看看delay_us()是否正常可以使用?
我试过了注释掉后,delay_us()正常工作。
回复

使用道具 举报

91

主题

170

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2015-9-22
在线时间
101 小时
 楼主| 发表于 2018-4-16 10:15:14 | 显示全部楼层
谢谢楼上各位回复。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2018-4-20 23:14:16 | 显示全部楼层
你用那个最简单那个例程(移植实验观察LED灯那个)肯定可以跑起来的,你之所以会出现跑不起来是因为你在开启调度器也就是初始化systick前,调用了延时函数 比如在LCD_Init()里面,而这时你的滴答定时器还没有初始化。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 23:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表