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.

[参考译文] TM4C123BH6PGE:SysCtlDelay 延迟量加倍

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1322366/tm4c123bh6pge-sysctldelay-delays-for-double-the-amount

器件型号:TM4C123BH6PGE

大家好!

我正在进行一个使用 TM4C123BH6PGE 微控制器的项目、遇到了一个奇怪的时序延迟问题。 我正在利用`SysCtlDelay`执行一个简单的延迟函数、但我观察到、在我注释掉了一些 LED 闪烁代码后、延迟持续时间意外增加了一倍。 我希望获得一些有关可能导致此行为的见解或建议。

时钟配置:
我的系统时钟配置如下:

SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
```

系统时钟初始化:
g_ui32SysClock = SysCtlClockGet ();//这获取了系统时钟速率

延迟功能:

void Timer_Simple ay(Uint32_t 毫秒)
{
uint32_t sleep =(g_ui32SysClock / 3000)*毫秒;
SysCtlDelay (睡眠);


我`此函数来创建一个延迟、例如、`í n Timer_Simple (3000); í n 为3秒的延迟。 但是、测量结果显示等待时间为6秒、而不是3秒。


当我注释掉 LED 闪烁代码时、这种计时差异开始、代码如下所示:

void MainLoopLedRunner()
{
if (u8LedDelayCount % 40 == 0)
{
if (!bLedStatus)
{
GPIOPinWrite (GPIO_PORTK_BASE、GPIO_PIN_1、GPIO_PIN_1);
bLedStatus = true;

否则
{
GPIOPinWrite (GPIO_PORTK_BASE、GPIO_PIN_1、0x0);
bLedStatus = false;

u8LedDelayCount = 0;

u8LedDelayCount++;



有人能解释`SLED 闪烁函数为什么会导致` ysCtlDelay 时序加倍? 乍一看,这似乎是不相关的,但问题始终是可重复的。 我在这里遗漏了什么?

提前感谢您提供任何建议或见解!

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

    您好!

     请注意 SysCtlDelay ()需要3个周期来执行。 对  SysCtlDelay (g_ui32SysClock) 的简单调用将创建3秒的延迟。  SysCtlDelay (g_ui32SysClock / 3) 将给出1秒。  

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

    你好,所以它应该给我一个3秒的延迟与:

    void Timer_Simple ay(Uint32_t 毫秒)
    {
    uint32_t sleep =(g_ui32SysClock / 3000)*毫秒;
    SysCtlDelay (睡眠);


    Timer_Simple 4552 (3000)

    但它给了我6。


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

    您好!

    但结果是我6.
    [/报价]

    您如何测量6? 您需要测量整个 LED 周期吗? 请记住、您的 LED 将在3 s 低相和3 s 高相之间切换。 如果您正在测量周期、这将为您提供6s。 应使用示波器测量 PK1引脚上高相位的下降沿或低相位的下降沿。  

    您还可以查看反汇编、其中可以看到 SysCtlDelay 在一个循环中花费了三个周期。 您在自己的电脑上看到了什么?

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

    您好!
    6秒是 LED 亮起的时间、    SysCtlDelay  周期 也是3个步骤。




    我还注意到、如果我提供 MAP_SysCtlClockGet 至中的值(50mghz) SysCtlDelay 显示为字面值   LED 在6秒内亮起、但如果 使用  
    Timer_Simple 4552 (3000) 它会在3秒内打开。

    Timer_Simple Studiay  执行情况如下:

    void Timer_Simple ay(Uint32_t 毫秒)
    {
    uint32_t sleep =(g_ui32SysClock / 3000)*毫秒;
    SysCtlDelay (睡眠);



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

    变量 sleep 返回什么?

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

    它返回  49998000。  

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

    这毫无意义。 如果 sleep 返回~50000000、则表示您的  g_ui32SysClock  必须等于以下表达式中的150000000。  

    uint32_t sleep =(g_ui32SysClock / 3000)*毫秒;

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

    是的、这就是为什么我会不喜欢的原因、因为 g_ui32SysClock 在调试过程中的噪声为50 mgz。  

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

    为什么只尝试 前面提到的 SysCtlDelay (SysCtlClockGet)。 这应该会为您带来3秒的延迟。 请在设置时钟后立即进行尝试。