OpenEdv-开源电子网

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

systick滴答时钟初始化问题

[复制链接]

1

主题

2

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-4-20
在线时间
6 小时
发表于 2018-4-20 11:29:46 | 显示全部楼层 |阅读模式
1金钱
FreeRTOS内核默认会初始化systick;原子哥的视频教程里的例程也会使用delay_init初始化systick。
请问是否是必须,有无影响?

最佳答案

查看完整内容[请看2#楼]

对FreeRTOS系统而言不是必须的,因为正如wen619所言,在开启调度器的时候会初始化systick,但是你在开启调度器前 是不是需要进行各种外设的初始化,你如果需要调用原子的延时函数,你就必须对systick初始化,要不然就会卡死在你调用延时函数的地方。比如在LCD_Init()就需要调用延时函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2018-4-20 11:29:47 | 显示全部楼层
对FreeRTOS系统而言不是必须的,因为正如wen619所言,在开启调度器的时候会初始化systick,但是你在开启调度器前 是不是需要进行各种外设的初始化,你如果需要调用原子的延时函数,你就必须对systick初始化,要不然就会卡死在你调用延时函数的地方。比如在LCD_Init()就需要调用延时函数
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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);” 因为任务开启任务调度器里也有这样的设置(包括systick的相关寄存器设置)。
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-20 12:03:46 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2018-4-20
在线时间
6 小时
 楼主| 发表于 2018-4-20 13:20:12 | 显示全部楼层
wen619 发表于 2018-4-20 12:03
http://www.openedv.com/forum.php?mod=viewthread&tid=269180&extra=page%3D1

如果不需要使用裸机延时函数delay_xms(u32 nms)和delay_us(u32 nus)的话,是不是就不需要delay_init,系统也是正常的?
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-20 14:29:32 | 显示全部楼层
vTaskStartScheduler()
    ---->>>xPortStartScheduler()
         ------->>>vPortSetupTimerInterrupt()    Setup the SysTick timer to generate the tick interrupts at the required frequency.
理解时钟.png
        //delay_init();         
主函数里注释掉,系统一样运行。
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-20 14:31:03 | 显示全部楼层
dyfeng2018 发表于 2018-4-20 13:20
如果不需要使用裸机延时函数delay_xms(u32 nms)和delay_us(u32 nus)的话,是不是就不需要delay_init,系 ...

可以不需要delay_ini.
回复

使用道具 举报

16

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
563
金钱
563
注册时间
2018-4-16
在线时间
76 小时
发表于 2018-4-21 23:49:17 | 显示全部楼层
wen619 发表于 2018-4-20 14:31
可以不需要delay_ini.

这位道友,我一直有一个疑问。之前我也是有和楼主一样的问题。我之前是没有用原子的delay。sys。usart。这三个文件。我直接移植的官方例程,先用系统点了个灯。成功后,让灯闪烁我用到了延时,起初我用的是系统提供的延时vTaskDelay(),灯也开始拿着这个延时开始闪烁了。直到后来,学到后面的系统中断测试实验。
                while(1)
                {
                        printf("¹Ø±ÕÖжÏ.............\r\n");
                        portDISABLE_INTERRUPTS();               
                        delay_xms(5000);                                               
                        printf("´ò¿ªÖжÏ.............\r\n");
                        portENABLE_INTERRUPTS();
                        delay_xms(5000);
                }
这个就是任务具体实现;程序中延时用vTaskDelay()函数不行。只能用原子的delay_xms()
我比对了一下区别。说是vTaskDelay会导致任务调度。我不明白怎么回事。或者说这两个延时函数到底什么时候用vTaskDelay(),什么时候用delay_xms()。道友能帮我解惑嘛?
回复

使用道具 举报

22

主题

203

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2017-11-29
在线时间
135 小时
发表于 2018-4-22 15:34:36 来自手机 | 显示全部楼层
portDISABLE_INTERRUPTS();   为什么要在这里关中断?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

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

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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