lm3s811例程中的延时程序搞不懂为什么这样写(已解决)

2019-03-24 12:58发布

lm3s811例程中的是这样写的延时voidDelay(unsigned long ulSeconds){    //    // Loop while there are more seconds to wait.    //    while(ulSeconds--)    {        //        // Wait until the SysTick value is less than 1000.        //        while(SysTickValueGet() > 1000)        {        }
        //        // Wait until the SysTick value is greater than 1000.        //        while(SysTickValueGet() < 1000)        {        }    }}为什么要这样写呢,延时的时间是 怎么计算的?程序里有下面这一句SysTickPeriodSet(SysCtlClockGet());那么SysTick的频率是不是跟板上使用的晶振频率一致啊。 [ 本帖最后由 leekuip 于 2012-2-21 13:13 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
shower.xu
1楼-- · 2019-03-24 18:07
SysTickValueGet()这个函数取得当前SysTick counter值,该值介于0和设置SysTick period-1之间;
while(SysTickValueGet() > 1000)和while(SysTickValueGet() < 1000)
的意思就是等待直到systick的计数值小于1000一次,然后再大于1000次;然后ulSeconds减一,作为一次短延时直到ulSeconds为0.
  systick一次的计时时间是由SysTickPeriodSet(SysTick period)函数参数决定的。
官方例程里是这样设置的
    SysTickPeriodSet(SysCtlClockGet());
//这一句设置计时步长,SysCtlClockGet()取得当前时钟频率,所以计时步长为1us;
    SysTickEnable();
//使能systick

[ 本帖最后由 shower.xu 于 2012-2-20 22:43 编辑 ]
leekuip
2楼-- · 2019-03-24 18:33
 精彩回答 2  元偷偷看……
鸵鸟蝈蝈
3楼-- · 2019-03-24 22:14
SysTick的频率与CPU的频率一致
leekuip
4楼-- · 2019-03-24 23:33
CPU使用的是板上的6M晶振,例程中那样写怎么就实现了1S的延时呢?
leekuip
5楼-- · 2019-03-25 04:41
 精彩回答 2  元偷偷看……
shower.xu
6楼-- · 2019-03-25 06:45
我二楼的说明不准确,请无视。今晚我仿真了一下,下面两个图能很好的说明问题 cc.jpg
在两个while()之前加入端口输出做指示,我们把值改为3000000,看的更清楚些。
进一步我们把值改为系统频率的一半,其实也是6M/2=3000000;效果一样。右上角是当前的systick值在内存中的数据,要这样读:0x005B8D75=5999989=6M(这个数在调用Delay()时其实是6M内随机的);实际运行过程是这样的 cc2.jpg
[ 本帖最后由 shower.xu 于 2012-2-20 23:11 编辑 ]

一周热门 更多>

相关问题

    相关文章