TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SysCtlDelay(SysCtlClockGet()/3000);是否是1ms

SysCtlDelay(SysCtlClockGet()/3000);是否是1ms

  • 这个函数是否是延时1ms取决于你的时钟源,如果用的片上30k的振荡器作为时钟源,则延时为1Ms.

  • 你可以在driverlib文件夹下的Sysctl.c文件中,找到SysCtlClockGet()函数的源码,从源码中能看到返回值实际和你的当前系统时钟相关。

    之所以有的例程用     SysCtlDelay(SysCtlClockGet()/3000); 来延时1ms,是因为他们使用30k的内部振荡器作为系统时钟。

  • 那假如我的系统时钟是80M的系统时钟呢?要延时1ms怎么写

  • 那假如我的系统时钟是80M的系统时钟呢?要延时1ms怎么写

  • 一个SysCtlDelay里面执行了 3个时钟周期,SysCtlClockGet() 是当前系统运行的时钟速率, 因此这个速度是固定的,就是1ms  可以自己做延时,对一个GPIO口进行翻转,用示波器量下就可以确定了。

  • SysCtlDelay(SysCtlClockGet()/3000) 这个函数执行的结果就是延时1ms,无论你的系统时钟是多少,当然你的系统时钟是不能低于3K的。

    SysCtlClockGet()函数返回的值是系统的频率,也就是1S钟的CLOCK个数,这个个数/1000就是1ms系统时钟的个数,由于SysCtlDelay函数一个循环判断执行需要3个CLOCK时钟,所以系统时钟/3000就表示系统执行1ms的时间。

    由此可以看出这个函数执行的结果就是延迟1ms. 在不同的系统时钟下,调用该函数都是延迟1ms.

  • SysCtlClockSet(SYSCTL_SYSDIV_2 | SYSCTL_USE_PLL | SYSCTL_XTAL_12MHZ | SYSCTL_OSC_MAIN);

    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
    GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2);

    while(1)
    {

    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, GPIO_PIN_2);//high
    SysCtlDelay( (SysCtlClockGet() / 3000) );
    GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2, 0);//low
    SysCtlDelay( (SysCtlClockGet() / 3000) );

    }

    这边我做了两个尝试。1,改SysCtlDelay( (SysCtlClockGet() / 3000) );为ROM_SysCtlDelay( (SysCtlClockGet() / 3000) );

    2改SYSCTL_XTAL_12MHZ;

    发现这两个改动都对延时有影响。

    所以还是对这个函数有疑惑。新手学习,请多指教

  • 在阅读时钟设置以后,重新设置,发现延时是准确的。理解成需要在一个正确的时钟配置下才能实现。

    SysCtlClockSet(SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
    SYSCTL_OSC_MAIN);

  • 执行一次SysCtlDelay(1)需要3个时钟周期。

    XTAL的参数要根据你的板子上晶振的频率来设置。否则频率会出错。

  • 您好,我在用TM4C123GXL   使用如下配置

    1、SysCtlClockSetS(SYCTL_SYSDIV_1|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); 

    再用SysCtlClockGet()取频率值的时候是12500000,也就是12.5MHZ,若是改成2分频,返回的就是100000000,即100MHZ,这是为什么啊?

    2、还有一个问题是,如果我配置不适用PLL,而是外部晶振16MHZ的话,不分频返回的是16MHZ,这是对的吗?谢谢!!

  • 16MHZ,PLL倍频后就是200MHZ,2分频是后100MHZ应该是对的,至于出现12.5,应该是你16分频后的结果吧,不过TM4C123x系列最大就是80MHZ,你的这个100MHZ只是个单纯的数字,实际应该是80MHZ。至于你说的16MHZ不分频返回的是16,理论上这么算是对的。可是是实际,使用外部晶振的时候,TM4C123x对最小频率好像是有要求的,是20M合适25M来着,这个你具体看看数据手册的说明。