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.

[参考译文] RM48L952:从主振荡器故障中恢复

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631938/rm48l952-recovery-from-main-oscillator-failure

器件型号:RM48L952

您好!

如何从主振荡器故障中恢复?

来自 TRM 的操作(章节"从振荡器故障中恢复")不起作用:GLBSTAT.0在振荡器故障后置1、在移除故障条件后不会复位为零。

一些代码:

静态 bool MainOscillatorFled()
{
const uint32_t* GLBSSTAT_address = reinterpret_cast (0xFFFFFFECUL);
返回(* GLBSSTAT_ADDRESS)和1;
}

静态空 switchToHfLpo()
{
systemREG1->GHVSRC =(UINT32)((UINT32) SYS_LPO_HIGH << 24U)
|(UINT32)(((UINT32) SYS_LPO_HIGH << 16U)
|(UINT32)(((UINT32) SYS_LPO_HIGH << 0U);
systemREG1->VCLKASRC =(uint32)((uint32) SYS_LPO_HIGH << 0U);
systemREG1->RCLKSRC &=~0x0F;
systemREG1->RCLKSRC |= SYS_LPO_HIGH;
}


静态空不可启用主振荡器()
{
systemREG1->CSDISSET = 0x00000001U;
while ((systemREG1->CSDIS & 0x01U)!= 0x01U){
;
}
}

静态空 enableMainOscillator()
{
systemREG1->CSDISCLR = 0x00000001U;
}

静态空 clearOscfail()
{
/*清除全局状态寄存器*/
systemREG1->GBLSTAT = 0x1U;
}

静态空开关到主振荡器()
{
systemREG1->GHVSRC =(UINT32)((UINT32) SYS_OSC << 24U)
|(UINT32)((UINT32) SYS_OSC << 16U)
|(UINT32)((UINT32) SYS_OSC << 0U);
}

void check()
{
if (isMainOscillatorFled()){
switchToHfLpo();
disableMainOscillator();
enableMainOscillator();
clearOscfail();
SwitchToMainOscillator();
}
} 

我不使用 PLL1或 PLL2。 主振荡器频率为12MHz。

函数 clearOscfail()不会复位 GLBSTAT.0,即使主振荡器在删除失败条件(我的示例中为振荡器短路)后仍在工作。 如何复位 GLBSTAT.0?

我出了什么问题?

此致、

 维他利

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

    您好、Vitality、

    是否清除了 GLBSTAT 中的 RFSLIP 和 FBSLIP 状态标志? PLL 跳周位可在 OSCIN 故障时置位。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好。
    是的、我尝试将0x301写入 GLBSTAT。 不管怎么说、位0都不会被清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Vitaliy、

    我运行代码、GLBSTAT 的位0被清除。

    1.加载程序,然后运行到 main

    2.在 switchToHfLpo()处添加断点;

    2.使 OSC 短路以产生 OSC 故障

    3.运行代码,它应该进入 if()循环,并在 switchToHfLpo()处停止

    4.恢复 OSC (移除短线)

    5.运行代码至末尾

    6.检查 GLBSTAT 寄存器、它应该为0x00

    顺便 说一下,清除 clearOSCFail()中的 PFF 转差错误位:

    静态空 clearOscfail()

      /*清除全局状态寄存器*/

      systemREG1->GBLSTAT = 0x301U;

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

    大家好、QJ Wang!

    我的项目仍然无法正常工作。

    您是否使用我的函数 switchToHfLpo()版本?

    我做了一些研究、发现一些有用的东西。 查看代码:

    静态空 switchToHfLpo()
    {
    systemREG1->GHVSRC =(UINT32)((UINT32) SYS_LPO_HIGH << 24U)
    |(UINT32)(((UINT32) SYS_LPO_HIGH << 16U)
    |(uint32)(((uint32) SYS_LPO_HIGH << 0U);
    #if 1 //禁用编译以复位 GLBSTAT.0;否则,如果编译,GLBSTAT.0不会被清除*/
    systemREG1->VCLKASRC =(uint32)((uint32) SYS_LPO_HIGH << 0U);
    #endif
    } 

    如果我禁用 VCLKASRC 寄存器的更改、那么 GLBSTAT.0将被清除。 如果我将 VCLKASRC 更改为 HF LPO、那么 GLBSTAT.0将不会被清除。

    这是我的项目。 它基于 GCC、但没关系。 代码从 RAM 运行、因此在调试会话中、您需要在代码下载后(开始程序之前)将 PC 设置为0x08000000。

    e2e.ti.com/.../7242.civl6.zip