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.

[参考译文] TM4C1294KCPDT:调用 SysCtlClockFreqSet()时、TM4C1294KCPDT 转到 FaultISR

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1223676/tm4c1294kcpdt-tm4c1294kcpdt-goes-to-faultisr-when-sysctlclockfreqset-called

器件型号:TM4C1294KCPDT
主题中讨论的其他器件: TMDSEMU200-U

我正在 尝试 使用对 TM4C1294KCPDT 进行编程  TMDSEMU200-U 调试器进行编程。

当我调试代码时、它成功下载映像、然后在运行代码后、它进入 FaultISR。

单步执行代码我发现、当代码尝试使用"SysCtlClockFreqSet ()"函数设置时钟频率时、它进入 faultISR。

我已附上代码和原理图。

这就是晶体的连接方式

下面是我的代码:

#include <stdint.h>
#include <stdbool.h>
#include "Config.h"

//
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "inc/hw_gpio.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"


uint32_t clockFreq = 0;
uint32_t counter = 0;

int main(void)
{
    uint8_t state = 0;

    clockFreq = SysCtlClockFreqSet
                        (
                            (SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240),
                            120000000
                        );


    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
    GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_2);

    while(1)
    {
        counter++;


        if (state)
        {
            state = 0;
            GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_2, GPIO_PIN_2);    // Logic LOW is shut down asserted
        }
        else
        {
            state = 1;
            GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_2, 0);    // Logic LOW is shut down asserted
        }

        SysCtlDelay(clockFreq / (10000 * 3));
    }
}

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

    您好!

     我真的认为您的原理图和代码没有问题。 如果您在 LaunchPad 上运行同样的代码、我认为您不会遇到问题、对吧? 这意味着该问题很可能是由您的硬件造成的。  

     我在这篇文章中看到了类似的问题。  https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1178485/tm4c1294ncpdt-tm4c1294ncpdt/4438261#4438261。 问题是晶振焊接不正确。 检查晶振并查看晶振是否为连接至 OSC0和 OSC1的引脚(引脚1和3)正确焊接。 如果您认为您有正确的晶体焊接、请检查是否可以在不同的电路板上重复同样的问题。 我建议您进行 ABA 交换测试。 将另一个已知正常的 MCU 更换到您的板上。 您可以重复同样的问题吗? 如果已知良好的 MCU 在电路板上无法正常工作、则表示存在板级问题。  

     只是一个平视。 我将从5/8-5/10休假。 我的回答将会延迟。  

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

    尊敬的 Charles:

    感谢你的帮助。

    可以、如果我在开发套件上运行该代码、则可以正常运行。

    我浏览了您提供的链接、我仔细检查了晶振焊接、引脚方向正确
    与开发套件相比、它是完全相同的。

    我已将晶振通孔器件更改为16 MHz。
    现在,当我运行代码时,行为基本上是相同的,它会停留在 faultISR()。
    但是我发现、当我单步执行代码时、如果进入 SysCtlClockFreqSet()
    函数、然后单步执行该函数、它便可以顺利通过
    它会返回正确的频率。 之后、我已验证 LED 准确地闪烁。
    在代码运行正常之后、我使其在调试模式下运行了一段时间。

    但是、它在复位后无法正常运行、或者我只是编程并持续运行。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将晶振通孔器件更改为16 MHz。

    在调用 SysCtlClockFreqSet ()时, SYSCTL_XTAL_25MHz 选项是否更改为 SYSCTL_XTAL_16MHz 以匹配外部晶体频率的变化?

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

    是的,我做了如下所述

    clockFreq = SysCtlClockFreqSet
    (
    (SYSCTL_XTAL_16MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_240),
    120000000
    )

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

    您好!

     您有多少个定制电路板? 您可以在所有板上还是仅在一个板上重复同样的问题吗?

     您可以在 LaunchPad 上运行代码吗? 您可以在 LauchPad 上重复同样的问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在当我运行代码时,行为基本相同,它会卡在 faultISR()。

    复位时、PLL 被禁用、并且来自 PIOSC (精密内部振荡器)的系统时钟频率将为16 MHz。 当 调用 SysCtlClockFreqSet ()以将系统时钟频率设置为120 MHz 时、由于系统时钟频率更高、器件的电流消耗将增加。

    如果代码在启动板上运行正常、但  在调用 SysCtlClockFreqSet()时滞留在定制板上的 faultISR ()中,则可能是定制板上的电源有问题。 可能要检查的事项:

    1.  去耦电容器的使用是否符合 Tiva C 系列微控制器 TM4C129x 系列的系统设计指南
    2. 您可以直接升高或降低输入电压