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/TM4C1233H6PZ:使用 ROM 函数时进入故障 ISR

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/804289/ccs-tm4c1233h6pz-went-into-fault-isr-when-using-rom-function

器件型号:TM4C1233H6PZ

工具/软件:Code Composer Studio

大家好、

我遇到了一个奇怪的问题。

当系统仍在处理初始工作时、系统"有时"跳转到故障 ISR。 我们使用此 MCU 的时间非常长、这是首次发现此问题。

这个问题出现的几率很低、我必须反复重置系统(无需对代码进行任何修改)、以使这个错误发生。

经过一些调试后、我在函数调用之间添加了一组标志。 最后、我发现它的 ROM_Function 调用没有跳回正确的地址并触发总线故障。

下面显示的代码非常简单。 我不知道是什么会导致这种情况发生。

int main (void){

ROM_FPULazyStackingEnable ();
ROM_FPUEnable ();


ROM_SysCtlClockSet (SYSCTL_SYSDIV_4|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCL_MAIN);

ROM_SysCtlPeripheralEnable (SYSCT_GPIOB_GPIOB_GPIOBJUS_GPIOB_GPIOBJUS_OUT_GPIOBJIN
);ROM_GPIOBJUST_GPIOBJUST_GPIOPTL (SYSC_GPIOBJ_GPIOPT_GPIOPTL GPIO_PIN_3);
ROM_GPIOPadConfigSet (GPIO_PORTB_BASE、GPIO_PIN_3、GPIO_Strength _8mA、GPIO_PIN_TYPE_STD);

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_ADC0); //这两个函数出现问题,不确定哪一个函数。
ROM_ADCReferenceSet (ADC0_BASE、ADC_REF_EXT_3V);//这两个函数出现问题,不确定哪一个函数。

ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOH);
ROM_GPIOPinTypeADC (SYSCTL_Periph_GPIOH、GPIO_PIN_3);

…
…
…


...} 

冷重启更容易发生、因此我认为这可能与某些硬件重启过程有关。

现在、我在开始初始过程之前增加了200ms 的延迟、这个问题就解决了。 (但不确定它是否永远存在、在添加延迟之前、很难重现)

剂量有人对此有什么想法吗?

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

    您好 Jerry、

    尝试在两个有问题的 API 之间添加此内容:

    while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC0))
    {
    } 

    我怀疑 PeripheralEnable 执行速度不够快、然后在下一次调用发生时点击 Fault ISR。 查看此调整是否解决了该问题。

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

    您好、Ralph Jacobi、

    谢谢! 我认为你是对的。

    因为我看到 FAULT_ISR 中的返回地址为0x0100、XXXX。 它仍在 ROM 函数内。

    但我想知道、为什么在所有初始过程都能消除此问题之前添加延迟。 似乎 CPU 已准备就绪、但 ADC 模块需要更多时间。

    是否有任何指南可以告诉我每个 MCU 外设模块的引导时间?

    我看到"while (!ROM_SysCtlPeripheralReady (SYSCTL_Periph_ADC0))}"是最佳解决方案、但我想了解有关引导过程的更多信息。

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

    您好 Jerry、

    根据 SysCtlPeripheralEnable 的注释、这是您应该考虑的关于外设启用的指南

    //! \note 写入后需要五个时钟周期才能启用外设
    //! 外设实际启用之前。 在此期间、尝试
    //! 访问外设会导致总线故障。 注意
    //! 为了确保在这个短暂的时间
    内不访问外设//! 周期。 

    通常、在执行初始启用时、检查外设是否准备就绪是一个良好的软件做法。 我不能确切确定差异的来源、有时它只会导致问题、例如冷启动后、 但无论如何、由于需要五个时钟周期、避免出现任何问题的最佳方法是检查外设是否通过就绪检查。

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

    您好 、Ralph Jacobi、

    谢谢你。 我看到 SYSCTL.c 中的注释

    我还看到驱动程序用户指南还在  SysCtlPeripheralEnable 之后调用 SysCtlPeripheralReady、不知怎么说、我们的工程师忘记了这么做、这个问题在我们售出了数千个产品后发生。  :(

    最后一个问题、"时钟周期"是指 外设的系统时钟还是时钟

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

    它应该是系统时钟周期、因为在外设被正确启用前、外设时钟不应该在运行中。