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.

[参考译文] CCS/TM4C123GH6PM:GPIO 响应时间似乎太长...

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/583290/ccs-tm4c123gh6pm-gpio-response-time-seems-too-long

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123

工具/软件:Code Composer Studio

我需要在这里进行彻底检查。  我正在使用 TM4C123G Launchpad。  我将时钟设置为80MHz。

SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);


如果我理解正确、PLL 以200MHz 运行、因此200/2.5 = 80MHz 时钟

我有一个 GPIO 连接到示波器。  我将立即打开和关闭它。

 

GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、GPIO_PIN_3);

GPIOPinWrite (GPIO_Porta_base、GPIO_PIN_3、0);

 

从 GPIO 上升沿到 GPIO 下降沿的时间测量为大约148ns。  对于80MHz 时钟、我觉得这有点慢。  我是不是在搞数学呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brian、
    在80MHz 时、一个时钟周期为12.5ns。 上面的每条指令之间似乎有12个周期。
    这听起来很合理。
    使用 ROM_TivaWare 函数应获得一个或两个周期的增益。
    当然、GPIO 的快速切换不应受软件的限制-如果这是您需要的、请使用 PWM 或计时器硬件外设等其他工具。
    此致
    布鲁诺
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Brian、

    实际上、PLL 以400MHz 运行、但/5提供80MHz 系统时钟。

    使用 C 函数来设置和清除引脚显然会增加一些开销。 如果您查看创建的汇编语言、您将看到如下所示的内容:

    98 GPIOPinWrite (GPIO_PORTG_base、USER_LED、USER_LED);
    $C$L2:
    00000720:2104 MOV R1、#4
    00000722:4620 MOV R0、R4
    00000724:460A MOV R2、R1
    00000726:F000F882 BL 0x82e
    99 GPIOPinWrite (GPIO_PORTG_base、USER_LED、μ~(USER_LED));
    0000072a:4620 MOV R0、R4
    0000072c:2104. MOV R1、#4
    0000072e:22FB MOV R2、#0xfb
    00000730:F000F87D BL 0x82e
    93 while (1)
    00000734:E7F4 B $C$L2 

    子例程很短、如下所示:

    GPIOPinWrite():
    0000082e:F8402021 str.w R2、[r0、r1、LSL #2]
    00000832:4770 BX LR 

    因此、如果您按照流程操作、在第一次写入引脚和第二次写入引脚之间有6条汇编指令。 其中两条指令是分支指令。 有一些方法可以更高效地切换引脚、但通常会以可读性或便携性为代价。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在尝试理解。 那么、Tm4C123上的以下内容将为我提供80MHz 的时钟?

    SysCtlClockSet (SYSCTL_SYSDIV_5 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);

    我将其更改为 SYSCTL_SYSDIV_2_5、希望看到示波器上的 GPIO 时序发生变化、但没有看到任何变化?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很抱歉,我弄错了。 因此、对于 SYSCTL_SYS_DIV_2_5、一个 GPIO 脉冲为140ns。 使用 SYSCTL_SYSDIV_5时、一个 GPIO 脉冲为240ns。
    现在我很困惑。 我本来希望它能成为另一个方向。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    存在固有的2分频、这意味着400MHz PLL 输出200MHz。 除以"2.5"可得到80MHz 系统时钟。 这为您提供了140nS 的脉冲宽度。 除以"5"可得到40MHz 系统时钟、该时钟为240nS 脉冲宽度。 它不是280nS 的原因是、在40MHz 时、闪存在没有等待状态的情况下运行、并且不需要预取缓冲器。 在本例中、它为您节省了一个周期。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    返回到我的原始问题。 我正在控制 ADC 上的转换输入。 转换需要在10ns 的最小时间内保持高电平。 然后在转换期间再次变为高电平、这意味着下降沿需要在初始脉冲之后少于320ns。 我想我用 GPIO 控制这一点的想法是不可行的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Brian、
    这些情况通常需要最小的脉冲宽度。 这并不意味着它必须是10ns、它们在50ns、100ns 下工作正常...
    对于320ns 事件、可能还有其他一些东西可以指示您的代码转换完成、您可以在事件触发后移动 GPIO。 否则、只需使用连接到 GPIO 的计时器。
    布鲁诺