智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4542|回复: 6
打印 上一主题 下一主题

求解单片机总线时钟周期与指令周期的联系(延时问题上)?

[复制链接]

18

主题

48

帖子

0

精华

高级会员

Rank: 4

积分
948
威望
525
贡献
245
兑换币
246
注册时间
2012-5-17
在线时间
89 小时
跳转到指定楼层
1#
发表于 2012-12-6 20:14:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个问题 主要出现在延时的时候,我就大概延时个几十毫秒,用for循环,可是我如何根据总线频率,计算大概的初值呢?例如 总线频率10Mhz    while(i--);  每次执行减一操作,大概耗时多少? 我应该如何计算。求解。

7

主题

563

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4530
QQ
威望
2516
贡献
1044
兑换币
592
注册时间
2011-9-24
在线时间
485 小时
2#
发表于 2012-12-6 20:18:46 | 只看该作者
不懂
回复 支持 反对

使用道具 举报

12

主题

185

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3413
威望
1741
贡献
998
兑换币
782
注册时间
2011-11-22
在线时间
337 小时
3#
发表于 2012-12-6 21:44:36 | 只看该作者
c语言延时比较难计算,以for为例,除了执行自加之外,还有执行for的时间、判断的时间等等···
建议嵌入汇编,比较好算
回复 支持 反对

使用道具 举报

1

主题

42

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1203
威望
369
贡献
202
兑换币
189
注册时间
2012-7-10
在线时间
316 小时
毕业学校
海河大学
4#
发表于 2013-4-5 13:27:05 | 只看该作者
回复 支持 反对

使用道具 举报

14

主题

97

帖子

0

精华

高级会员

Rank: 4

积分
647
威望
393
贡献
154
兑换币
178
注册时间
2012-9-26
在线时间
50 小时
毕业学校
县一中
5#
发表于 2013-4-24 13:24:14 | 只看该作者
我们大家平常在单片机开发中经常会使用到延时函数,一般的,我们会使用变量自加循环判断的方法来实现软件延时。但是,
这种方法有个弊端——延时时间不精确。

主要体现在:
1, 在C语言编写的延时函数中,每条函数语句的执行时间可能不同,这样,在实现延时的过程中,想通过增加或减少函数语
    句来实现延时的增加或减小控制起来不太方便,时间的精确性当然很难控制;
2, 由于各种不同的控制器运行的主频可能不同,执行相同的延时函数所需要的的时间值可能就不同。这样,使得这种延时函
    数在不同的平台上移植起来时间的精确性就更不可靠。
所以,我们就不使用这样的延时方法。

从ARM Cortex-M0内核开始,一直到现在的ARM Cortex-M4,这些内核中都搭载了systick滴答定时器,它放在了NVIC中,主要
目的是为了给操作系统提供一个滴答中断。当然,毕竟它也是一个定时器,我们就可以利用它来做到精确的软件延时。
systick定时器是一个递减的计数器,如果设定初值并使能它以后,它会在每个系统时钟周期里计数器减1,直到减到0为止。然
后,systick计数器自动重装初值并继续递减计数,如果软件上又使能了systick计数器的中断,那么,在systick计数器减到0的时
候,中断被触发,当然,中断标志位也被置位。那么,每次计数器递减到0,所经过的时间值为:系统时钟周期*计数器初值。
如:我们这里以飞思卡尔Cortex-M4内核的Kinetis为例,系统内核时钟频率初始化为100MHz,则系统内核时钟周期为1/100M,
如果计数器的初值为100000,那么,延时的时间则为:(1/100M)*100000=0.001s=1ms。

systick定时器内部几个常用的寄存器:
1, systick控制及状态寄存器CTRL:
        其中,CTRL[16]位是COUNTFLAG标志位,当systick计数到0的时候,该位置1,如果读取该位,则硬件自动清0,所以我们
    可以用软件判断是否计数到0。
    CTRL[2]位是CLKSOURE标志位,用来指示当前systick定时器的时钟源,CLKSOURCE=1表示时钟源是内核时钟(一般我们
    会选择这种情况,如此处我们使用飞思卡尔Kinetis的内核时钟100MHz);CLKSOURCE=0表示时钟源是外部时钟源。
        CTRL[1]位是TICKINT标志位,用来指示systick计数到0的时候是否产生systick异常请求。CTRL[0]位是ENABLE位,该位是
    systick定时器的使能位。
2, systick重装载计数器LOAD:
        该寄存器是一个24位的寄存器,保存着systick定时器的初值,使得当systick计数到0的时候,将该寄存器中的数据重装载到
    当前计数器中继续递减计数。
3, systick当前数值计数器VAL:
        该寄存器是一个24位的寄存器,用来指示当前的计数值。
回复 支持 反对

使用道具 举报

23

主题

241

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1405
威望
717
贡献
428
兑换币
453
注册时间
2014-2-6
在线时间
130 小时
6#
发表于 2014-8-7 11:04:21 | 只看该作者
大神,期待继续更新些。
回复 支持 反对

使用道具 举报

1

主题

292

帖子

0

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
6297

优秀会员奖章活跃会员奖章论坛元老奖章

威望
4366
贡献
1319
兑换币
617
注册时间
2012-12-2
在线时间
306 小时
7#
发表于 2014-8-7 17:20:44 | 只看该作者
学习了
回复 支持 反对

使用道具 举报

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

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-29 04:15 , Processed in 0.075627 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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