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.

[参考译文] MSP430FR2476:时钟系统 ISR

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

https://e2e.ti.com/support/clock-timing-group/clock-and-timing/f/clock-timing-forum/1624588/msp430fr2476-clock-system-isr

器件型号: MSP430FR2476

大家好:

我目前正在处理一个使用 MSP430FR2xx/4xx 的项目、并实现了时钟系统故障 ISR。

根据 MSP430FR2xx/4xx 系列用户指南、我对故障逻辑的理解如下:

DCO 故障 (DCOFFG): 当 DCO 抽头在 DCO 解锁期间达到 0 或 511 时、会设置该标志。 这可能在两种情况下发生:

  • 配置不正确或温度漂移不正确 - N 倍频器对于选定的 DCO 范围设置得太高,导致抽头达到上限 (511 ),或 FLL 失去锁定,抽头达到下限 (0)
  • 用作 FLL 基准时的 XT1 HF 晶体故障 -当 XT1 作为 FLL 基准源在 HF 模式下运行时,晶体故障会导致不生成 FLLREFCLK 信号。 FLL 尝试锁定时继续向下计数至零、DCO 抽头移动到最低位置(DCO 位已清除)、并设置 DCOFFG。 这与 XT1 LF 模式不同、在该模式下、晶体故障会自动将 FLLREFCLK 切换至 REFO

XT1 振荡器故障 (XT1OFFG): 如果 XT1 振荡器停止、则设置 XT1OFFG。 每个振荡器都有一个硬件故障计数器、该计数器在发生故障时复位、并在故障条件消除后开始计数。 仅当计数器达到其最大值时、才会清除故障标志:

  • XT1 LF 模式下 8192 个周期
  • 1024 个周期、在 XT1 HF 模式下

我计划的 ISR 行为如下:

DCO 故障处理:如果设置了 DCOFFG 且 DCO 抽头等于 0 或 511、我会将其解读为 DCO 由于配置问题、温漂或 XT1 HF 晶体故障而达到其调整限值。 在本例中、我计划触发 DCO 重校准例程。 如果故障在多次重试后仍然存在、我将执行软件 POR 作为最后的解决方法恢复机制。

XT1 故障处理:如果设置了 XT1OFFG、则 ISR 将尝试清除故障标志并实施重试循环、反复清除 XT1OFFG 并检查 OFIFG、以便让振荡器硬件计数器有时间达到其最大计数并确认振荡器已稳定。 如果多次尝试后故障仍然存在、则会采取其他恢复措施。

我的问题是:此方法是否与 MSP430FR2xx/4xx 器件的预期时钟故障处理机制一致? 具体来说、是否建议在抽头达到其限值时重新校准 DCO、并使用重试回路让 XT1 振荡器的内部故障计数器在采取进一步措施之前清除?

任何指导或建议的执行模式都将受到极大的赞赏。

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=UNMI_VECTOR
__interrupt void UNMI_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(UNMI_VECTOR))) UNMI_ISR (void)
#else
#error Compiler not supported!
#endif
{
    switch(__even_in_range(HWREG16(__MSP430_BASEADDRESS_SYS__ + OFS_SYSUNIV), SYSUNIV__OFIFG))    {

        case SYSUNIV__NONE: //OFFSET 0
            break;
       
        case SYSUNIV__NMIIFG: //OFFSET 2
            break;

        case SYSUNIV__OFIFG:{  //OFFSET 4

            uint8_t csctl7 = HWREG8(CS_BASE + OFS_CSCTL7_L);
            if(csctl7 & DCOFFG) {
               
                HWREG8(CS_BASE + OFS_CSCTL7_L) &= ~DCOFFG;
                HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;
               
                count_DCO_fail++;
               
                if(!(HWREG8(SFR_BASE + OFS_SFRIFG1) & OFIFG)) {
                    count_DCO_fail = 0; // Reset consecutive counter if fixed
                }
               
                if(count_DCO_fail >= 10) {
                    HWREG16(PMM_BASE + OFS_PMMCTL0) = PMMPW | PMMSWPOR; // 10-strike POR
                }
            }

            else if (csctl7 & XT1OFFG){

                if ((HWREG16(CS_BASE + OFS_CSCTL4) & SELMS) == CS_XT1CLK_SELECT){
                    HWREG16(CS_BASE + OFS_CSCTL4) &= ~SELMS;
                    HWREG16(CS_BASE + OFS_CSCTL4) |= CS_REFOCLK_SELECT;
                }
                if ((HWREG16(CS_BASE + OFS_CSCTL4) & SELA) == SELA__XT1CLK){
                    HWREG16(CS_BASE + OFS_CSCTL4) &= ~SELA;
                    HWREG16(CS_BASE + OFS_CSCTL4) |= SELA__REFOCLK;
                }

                HWREG8(CS_BASE + OFS_CSCTL7_L) &= ~XT1OFFG;
                HWREG8(SFR_BASE + OFS_SFRIFG1) &= ~OFIFG;

            }

            break;
        }

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

    尊敬的 Ahlam:

    我认为您当前处理时钟故障有什么意义。  

    请参阅 MSP430FR4xx 和 MSP430FR2xx 系列用户指南(修订版 I)的 3.2.13、 如果软件清除 DCOFFG 或 XT1OFFG 故障位、并且故障条件仍然存在、则故障位会自动再次设置;否则、故障位会保持清除状态。 因此、“重试“步骤是尝试检查时钟故障是否由任何瞬态问题引起、如果时钟在几次后无法恢复(再次设置故障位)、则需要执行其他操作、例如 POR 复位。   

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

    谢鹏飞

    感谢您的答复。

    您是否建议我在实现中显式考虑内置 XT1 振荡器故障计数器? 根据用户指南的理解、一旦故障条件消失、硬件计数器就会开始计数、只有达到最大计数时、XT1OFFG 标志才会清除。

    在我的 ISR 中、我打算反复清除 XT1OFFG 并在循环中检查 OFIFG、以便让振荡器时间稳定下来并让内部计数器完成。 我还在考虑前面提到的其他变化、例如当 DCO 抽头达到其限值 (0 或 511) 时触发 DCO 重新校准。

    您是否会建议以这种方式实现逻辑、或者是否有更合适的方法来处理固件中的这些时钟故障?

    再次感谢您的指导。

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

    谢鹏飞

    我附上了我的更新 时钟系统 ISR 以下内容。 如果您能让我知道此方法是否符合针对的建议故障处理策略、我将不胜感激 MSP430FR2xx/4xx 或者、如果有任何改进建议、也可以使用这种方法。

    再次感谢您的指导。

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

    尊敬的 Ahlam:

    对于您的当前实施、它看起来很合适。  

    我前面提到的是、如果振荡器在清除故障标志后恢复、但在一段时间后再次发生故障、我们可以通过软件监测故障时间、以在监测到特定的故障时间后提供更强大的恢复操作(如 POR)。