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函数的问题

Other Parts Discussed in Thread: TM4C123GH6PM

我使用的板子是TIVA TM4C123GH6PM。

SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);这是时钟频率的配置,80MHZ。

然后我要实现延时,SysCtlDelay(20000000/3);   我计算的延时时间应该是(3*20000000/3)/80000000=0.25s,可是实际测量却是0.5s。

然后我将时钟频率改成了40MHZ.     SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_16MHZ);

SysCtlDelay(20000000/3);  发现延时是0.5s这个结果是对的。请问这是什么原因呢,我猜测会不会是因为,芯片内部Flash的读取频率最大只能达到40MHZ,当工作频率大于40MHz时,通过预取两个字的指令来达到80MHZ的运行主频。但是,当遇到SysCtlDelay函数这种短跳转时这个特性并不能很好的工作,每次都需要读取指令,所以时间就延长了

请问大家是这样吗?

  • 实际测试了一下,超过40Mhz的话,还真和楼主说的一样,一直没注意这个问题。原因也大概同意楼主的。
  • SysCtlDelay这个函数以前用过,测试是没有问题的,可是用最新的库版本测试,和楼主的结果一模一样。果断抛弃驱动库,用ROM_SysCtlDelay测试,是没有问题的,倾向于最新的驱动库的问题,或者其他配置问题。

  • 以前旧版本的库中测试,SysCtlDelay()是没有问题的,在这个库中经网友测试,主频超过40MHZ的话,实际延时是理论的2倍,用ROM_SysCtlDelay()正常。

    SysCtlDelay(SysCtlClockGet()/3)
    正好是1s钟
    要想延时1/10s,也就是100ms,参数是SysCtlDelay(SysCtlClockGet()/10/3)
    要想延时1/100s,也就是10ms,参数是SysCtlDelay(SysCtlClockGet()/100/3)
    最新的库TivaWare_C_Series-2.1.4.178中,主频超过40MHZ的话,用驱动库,实际延时是理论的2倍,用ROM_SysCtlDelay()是没有任何问题的。

  • 那看来大概是库的问题了,谢谢解答!