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.

[参考译文] TM4C123GH6PM:延迟时间不正确...

Guru**** 1791630 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1399898/tm4c123gh6pm-delay-time-incorrect

器件型号:TM4C123GH6PM

工具与软件:

您好!

我将我的系统时钟频率设置为80MHz、不知道为什么 SysCtlDelay (10000000);延迟了750ms、而不是375ms。  

我使用逻辑分析仪测试了 SPIWritePacket 函数、如下图所示、延迟为750ms、而不是375ms。   

 

这是用于测试 SPIWritePacket()和 SysCtlDelay(10000000)的代码。

 

我用于设置系统频率的代码是 SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="610792" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1399898/tm4c123gh6pm-delay-time-incorrect "]

    这是用于测试 SPIWritePacket()和 SysCtlDelay(10000000)的代码。

     

    [报价]

    Scott、您好!

     SysCtlDelay()执行需要三个周期。 因此、如果你调用 SysCtlDelay (SysCtlClockGet ())、它将得到1s * 3、等于3s 的延迟。 如果你想获得1s 延迟、你应该调用  SysCtlDelay (SysCtlClockGet ()/3)。 如果你想得到375ms、那么你应该调用 SysCtlDelay (SysCtlClockGet ()/3 * 375/1000)。 尝试对所有三个调用进行实验、以了解延迟是如何工作的。  

    SysCtlDelay (SysCtlClockGet ())

    SysCtlDelay (SysCtlClockGet ()/3)

    SysCtlDelay (SysCtlClockGet ()/3 * 375/1000)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:

    是的、我知道这一点、但我要说的是理论与实验值不匹配、我想知道是什么导致了它。

    理论上、SysCtlDelay (10M)应该是1/ 80MHz * 10M * 3 = 0.375s、但在逻辑分析仪上、我得到的是0.75、而不是0.375

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Scott、您好!

     请使用 ROM_SysCtlDelay、而不是 SysCtlDelay。 当 SysCtlDelay 被执行时、由于编译器优化、延迟可能会变化。 请使用 ROM_SysCtlDelay、因为函数在 ROM 存储器中所用周期的数量是固定的。