智能车制作

标题: 求解单片机总线时钟周期与指令周期的联系(延时问题上)? [打印本页]

作者: fxk416532131    时间: 2012-12-6 20:14
标题: 求解单片机总线时钟周期与指令周期的联系(延时问题上)?
这个问题 主要出现在延时的时候,我就大概延时个几十毫秒,用for循环,可是我如何根据总线频率,计算大概的初值呢?例如 总线频率10Mhz    while(i--);  每次执行减一操作,大概耗时多少? 我应该如何计算。求解。

作者: Mr_Q    时间: 2012-12-6 20:18
不懂
作者: 夜之音    时间: 2012-12-6 21:44
c语言延时比较难计算,以for为例,除了执行自加之外,还有执行for的时间、判断的时间等等···
建议嵌入汇编,比较好算
作者: tangyinyin123    时间: 2013-4-5 13:27

作者: jifadage11    时间: 2013-4-24 13:24
我们大家平常在单片机开发中经常会使用到延时函数,一般的,我们会使用变量自加循环判断的方法来实现软件延时。但是,
这种方法有个弊端——延时时间不精确。

主要体现在:
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位的寄存器,用来指示当前的计数值。

作者: 仪124    时间: 2014-8-7 11:04
大神,期待继续更新些。
作者: wgw5820974944    时间: 2014-8-7 17:20
学习了




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2