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.

[参考译文] TM4C123GH6PGE:关于系统控制延迟功能

Guru**** 2455560 points
Other Parts Discussed in Thread: TM4C123GH6PGE

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/639840/tm4c123gh6pge-regarding-the-system-control-delay-function

器件型号:TM4C123GH6PGE

每个人都能享受到美好的早晨

我正在使用 TM4C123GH6PGE 微控制器为嵌入式应用开发一些代码。 我正在使用以下函数设置时钟频率。

SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

 


根据上述指令、我要设置延迟1秒延迟、1毫秒延迟1微秒延迟。

我请求您可以将上述说明以以下形式发送给我   

SysCtlDelay (SysCtlClockGet () / Number);  

SysCtlDelay (160000);  

 

 


提前感谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Srinu、
    我想您已经回答了自己的问题。

    SysCtlClockGet ()将返回当前的工作频率。 使用你在 SysCtlClockSet 中配置的内容、工作频率将为80MHz。 SysCtlClockGet ()将返回8000000。 如果你想创建一个接近1的延迟、那么你将只使用 SysCtlDelay (SysCtlClockGet ()/ 1)。 如果您需要创建一个接近1ms 的延迟、那么您将使用 SysCtlDelay (SysCtlClockGet ()/1000)。 请注意、这是一种创建延迟的软件方法。 它将不会是精确的。 例如、如果你在中间得到一个中断、那么它将中断 SysCtlDelay 的执行时间。 换言之、SysCtlDelay 将取决于应用程序的中断环境。 为了实现精确的延迟、您需要使用计时器模块等硬件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SysCtlDelay (SysCtlClockGet ()/3);将产生1秒延迟。
    SysCtlDelay (SysCtlClockGet ()/3000);将产生1 ms 延迟。
    SysCtlDelay (SysCtlClockGet ()/3000000);将产生1us 延迟。

    如您所见 SysCtlDelay(number);导致 number* 3个周期的延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    SysCtlClockGet 返回什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SysCtlClockGet ()返回时钟频率。 这是正确的、但 SysCtlDelay()会使周期延迟=作为参数传入的数字的3倍。 因此、要获得1秒的延迟、您可以使用 SysCtlDelay (SysCtlClockGet ()/3);。
    SysCtlDelay (SysCtlClockGet ()/1);将产生3秒延迟。

    我认为这是由于 SysCtlDelay()中的循环实现; 每次迭代需要3个时钟周期才能完成。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我认为我同意您的意见。 SysCtlDelay 使用一个3线汇编指令来实现。 要获得1s、您将执行 SysCtlDelay (SysCtlClockGet ()/3)。 我认为 SysCtlDelay 可能在函数内首先除以3、但它不是。 无论如何、请注意、根据我之前给出的解释、软件延迟环路并不精确。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。
    我在这里
    SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

    用于设置时钟(即我使用的时钟)(SYSCTL_SYSDIV) 200/4 = 50MHz PLL 时钟和16MZ 外部时钟。
    那么、您能否向我解释一下您如何计算上述延迟函数1、1毫秒、1微秒。


    提前感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因此、如果你将时钟配置为50MHz、那么 SysCtlClockGet ()将返回50000000。 这意味着在1个安全条件下有50000000个时钟周期。 由于执行 SysCtlDelay 函数需要3个周期、因此您需要执行 SysCtlDelay (SysCtlClockGet ()/3)或 SysCtlDelay (50000000 / 3)来实现1秒的软件延迟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    没有文书的海报可以采用一种简单的引导方法来确定这种拖延的"粗略"衡量标准。

    " LED 打开"
    "延迟"
    "指示灯熄灭"

    您可能会注意到、"自助"证明了"最佳帮助!"   (LED 在"运行该代码"后保持亮起的时间反映了延迟)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的解释。
    从上面你的解释中我了解的是 SysCtlDelay (SysCtlClockGet ()/ 3) 表示 SysCtlDelay (3*(SysCtlClockGet ()/3)),因此它给出 SysCtlDelay (SysCtlClockGet ())值,它被当作1秒延迟。
    我请求您、回答是否正确、请验证我的答案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Srinu、
    您的理解尚不正确。 SysCtlDelay()执行需要3个周期。 例如、如果你调用 SysCtlDelay(1)、这将花费3个周期。 如果你调用 SysCtlDelay(2)、这将花费6个周期。 如果您以50MHz 运行、则在一秒内有50m 周期。 您需要调用 SysCtlDelay (50000000 / 3)以获得1秒。 SysCtlDelay (16666666)将花费50000000个周期来执行。 如果每个周期为20ns (@50MHz)、则50000000 * 20ns = 1秒。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,非常感谢你的解释。