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:简单的代码片段在80MHz 下似乎不起作用

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/615955/tm4c123gh6pm-simple-code-snippet-does-not-seem-to-work-at-80-mhz

器件型号:TM4C123GH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

您好!

我正在使用 TM4C123G Launch Pad 和 Keil 开发软件。

在启动时、恰好在设置系统时钟 并初始化 GPIO 端口 F 后、我执行以下循环:

//等待 SW1或 SW2变为低电平
执行{
swData = GPIO_PORTF_DATA_R 和0x11;

while (swData = 0x11);

if ((swData & 0x01)==0){

我观察到、当时钟频率为40MHz 时、其工作方式与预期一致。 但如果使用80MHz 时钟、它最终将退出 while 循环、如果我中断 if 语句、swData 将设置为0x11。  如果我在环路中插入一个短延迟、它在80MHz 时也能正常工作。 我在两个单独的 LaunchPad 上试用了它、因此它不会损坏硬件。 这个芯片上是否存在已知的竞争情况、我正在运行或者是否犯了一些错误?

提前感谢

Joe Carbone

PS:这是创建的汇编代码 Keil

185://等待 SW1或 SW2变为低电平
0x00000BD0 1D08添加了 r0、R1、#4
0x00000BD2 6800 LDR r0、[r0、#0x00]
0x00000BD4 F4204070 BIC r0、r0、#0xF000
0x00000BD8 1D09添加了 R1、R1、#4
0x00000BDA 6008 STR r0、[R1、#0x00]
186:执行{
0x00000BDC BF00 NOP
187:swData = GPIO_PORTF_DATA_R 和0x11;
188:}
0x00000BDE 487E LDR r0、[PC、#504];@0x00000DD8
0x00000BE0 1F00 subs r0、r0、#4
0x00000BE2 6800 LDR r0、[r0、#0x00]
0x00000BE4 F0000011和 r0、r0、#0x11
0x00000BE8 4984 LDR R1、[PC、#528];@0x00000DFC
0x00000BEA 6008 STR r0、[R1、#0x00]
189:while (swData = 0x11);
190:
191://SW2 =>录制
0x00000BEC 4608 MOV r0、R1
0x00000BEE 6800 LDR r0、[r0、#0x00]
0x00000BF0 2811 CMP r0、#0x11
0x00000BF2 D0F4 BEQ 0x00000BDE

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Joe、您好!
    我只想确保在代码从 while 循环中跳出之前、是否曾按过 SW2按钮? 或者、您绝不会按下 SW2、但代码将从 while 循环中跳出。

    我认为您需要的是去抖电路。 按下机械开关时、它会在稳定前稍微反弹、从而导致反弹。 去抖是为了去除回弹。 去抖可在硬件或软件中完成。 对于软件解决方案、您可以使用 Google 或在中找到去抖示例 /examples/boards/ek-tm4c123gxl/drivers/buttons.c
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不按任一开关,并且   在我进入该环路之前很久就已打开上拉电阻器(GPIO_PORTF_PUR_= 0x11;)。 我只需在 Keil 等待几秒钟、就会到达 if 语句。 奇怪的是,我以为只对端口进行一次 CPU 寄存器读取,但我从汇编代码中看到,它实际上读取了两次,即使它已经具有 R0中的值! 我想 launchpad 的噪声足够大、以至于其中一个 PF 引脚向下漂移到地面?  

    Joe

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Joe、您好!
    如果您将这两个 PF 引脚连接到80MHz 时的3.3V、您能重复同样的问题吗? 此外、您能否将断点放置在与"if"相对应的汇编代码中、而不是将断点放置在 C 代码上。 有时、在进行代码优化时、C 代码中的断点可能与汇编代码不对应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    感谢您的建议。 当我将3.3绑定到 PF0和 PF4时、代码运行数小时没有问题、因此我确信必须将噪声耦合到这些引脚中的一个引脚上、从而使弱内部上拉电阻过大。 此时、我将接受环路中的延迟、因为它对我尝试的内容并不重要。

    再次感谢您的帮助
    Joe Carbone
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请允许我注意、怀疑供应商/朋友 Charles 建议通过上拉电阻器将这两个引脚连接到3V3。 GPIO 与任一电源轨直接连接(始终如此)是一种"风险主张"、并且不属于"最佳实践"。 4k7-10K 应该具有相同的性能-但事实证明、您的 MCU 更安全...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    感谢您建议添加串联电阻器、以限制在开关确实按下时消耗的电流。 我的错误建议是尝试将引脚直接连接到电源。 我以为海报上已经有一个上拉电阻器、但重新阅读过的帖子却是内部弱上拉电阻器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    查尔斯、您是最受欢迎的人。 (我们知道您的意思/意图)

    随着 MCU 速度的提高、尤其是(任何)电源控制/快速开关电路在附近时、"非常弱"的内部上拉/下拉电阻器的责任变得越来越明显。

    请注意、这种"内部电阻器短路"-适用于多个 ARM MCU 供应商、而不仅仅是驻留在这里的供应商...