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:启用后立即访问 AHB 会引发故障

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1184593/tm4c123gh6pm-accessing-the-ahb-immediately-after-enabling-it-throws-a-fault

器件型号:TM4C123GH6PM

大家好、  

你好。 我代表客户发布此查询。

"我正在使用一个程序、尝试通过 AHB 访问 GPIO 端口。 使用-O0进行编译时、所有内容均按预期工作、且反汇编的伪代码如下所示:

...STR 指令用于启用 GPIO 端口 MOV 指令的 AHB、以准备通过 AHB 读取 GPIO 端口所需的 GPIO 端口存储器地址 nextLDR 指令... 

但是、当使用-O1编译时、执行时会引发一个故障。 我通过调试将故障原因缩小到上述代码部分、发现这次反汇编代码与上述代码相同、除了省略 MOV 指令(而是在代码中提前准备存储器地址)。 因此、启用 AHB 并尝试在下一条指令中立即访问它似乎会导致问题。

我的理解是、这是由于以下两个原因之一:

1) 1)出现指令同步问题、需要适当的存储器屏障来修复、或

2) 2)发生了硬件延迟问题、需要适当的延迟才能转置以解决。

如果1)正确、则应在 STR/LDR 之间插入哪条隔离指令来解决此问题? 《 ARM Cortex -M 存储器边界指令编程指南 》应用手册中的答案无法确定。 如果2)是正确的、那么建议采用什么方法来确保总线在启用时准备好使用? 没有与 GPIO (PRGPIO)类似的用于检查总线的相关就绪位寄存器。

我认为2)这是正确的、因为问题仅在以全速执行程序时发生、而不是在使用调试器单步执行这些指令时发生(如果此评估错误、请纠正我的错误)。 我还在  Tiva TM4C123GH6PM 微控制 器数据表中找不到任何关于总线同步/延迟特性的说明。

感谢您的任何帮助。"

请提供建议。 感谢您的支持。

此致、  

Marvin

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

    Marvin、您好!

    [引用 userid="522868" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1184593/tm4c123gh6pm-accessing-the-ahb-immediately-after-enabling-it-throws-a-fault ]2)出现了一个硬件延迟问题,需要适当的延迟才能转置以解决。

    这就是答案。 启用外设后、外设需要一些时间才能准备好使用。

    在 TivaWare 中 、SysCtlPeripheralReady API 用于检查这一点。 DRM 代码如下所示:

    HWREGBITW (SYSCTL_PRBASE +((ui32Peripheral & 0x0000)>> 8)、 ui32Peripheral & 0xff));

    其中:

    • ui32Peripheral 基于   sysctl.h 中的 SYSCTL_Periph 表-因此对于 GPIOA、它将是  SYSCTL_Periph_GPIOA
    • SYSCTL_PRBASE 在  SYSCTL.c 中定义为 0x400羽毛00

    与它们更相关的可能是整个序列正在检查 寄存器108:通用输入/输出外设就绪寄存器(PRGPIO)、偏移量0xA08 (来自器件数据表)。

    此致、

    Ralph Jacobi

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

    您好、Ralph、  

    感谢您的回答。 请参阅我们客户的反馈。

    请允许我展开我的设置顺序以进行澄清、并显示我第一次应该包括的详细信息:

    (笑声)
    1) 1)通过寄存器** RCGCGPIO**启用 GPIO 端口
    2) 2)忙等待、直到 GPIO 端口通过寄存器** PRGPIO**准备就绪
    3) 3)通过寄存器**GPIOHBCTL**为 GPIO 端口启用 AHB
    4) 4)通过寄存器** GPIODIR**设置 GPIO (AHB)端口的方向
    (笑声)

    换言之、我确认上面的 GPIO 外设在第2行是否就绪、但在第4行全速运行时故障仍然发生。 使用调试器单步执行时不会发生这种情况、这就是我假设它确实是您所说的延迟问题的原因。 然而,我认为,只有 AHB 在第3行启用它之后,才准备好在下一条指令中访问它。 因此、这似乎意味着以下两点之一:

    1) 1)为 GPIO 端口启用 AHB 会清除该端口的 READY 位、然后必须检查该位是否准备就绪、或
    2) 2) GPIO 端口的就绪性和用于访问它的总线的就绪性是不同的、因此还必须执行一些其他操作来确保总线就绪。

    如果1)为 true、则我假设解决方案是切换上面的线路2和3。 如果2)正确、那么启用 AHB 后是否有办法检查它是否准备就绪、这是有保证的、并且不涉及任意长度的忙等待或阻隔/NOP 延迟?

    请提供建议。 感谢您的支持。

    此致、  

    Marvin

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

    Marvin、您好!

    感谢您在此处添加了详细信息。 我对此进行了一些调查。

    [引用 userid="522868" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1184593/tm4c123gh6pm-accessing-the-ahb-immediately-after-enabling-it-throws-a-fault/4465943 #4465943]1)为 GPIO 端口启用 AHB 会清除该端口的就绪位,必须检查该位是否准备就绪,或

    我看不到这种情况的迹象,所以我不会认为这是根本原因,我也不会期望所概述的调整能够正常运作。

    [引用 userid="522868" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1184593/tm4c123gh6pm-accessing-the-ahb-immediately-after-enabling-it-throws-a-fault/4465943 #4465943"] 2) GPIO 端口的就绪性和用于访问它的总线的就绪性是不同的,因此还必须执行一些其他操作来确保总线就绪。

    我认为这是这里的根本原因、但文档并未涵盖任何特定的等待时间。 查看 GPIO 模块通常如何处理更改、我预计它将在几个时钟周期内生效。 对于我们的常规 TivaWare 代码、我们没有遇到任何问题、因此从这种编程方式中增加的开销就足够了。

    遗憾 的是、由于我找不到要提供的任何特定等待时间、并且我们无法访问此器件的设计仿真来尝试指定该持续时间、因此这里唯一的选择是任意 NOP 长度。

    此致、

    Ralph Jacobi