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.

[参考译文] MSP430F5171:统一时钟系统模块问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/678856/msp430f5171-unified-clock-system-module-problem

器件型号:MSP430F5171

您好!

我的统一时钟系统模块有问题。 当我唤醒 MCU 进入低功耗状态时、有时 FLL 环路无法获得正确的频率、并且 UCSCTL7寄存器中的 DCOFFG 标志被置位。 这可能是由寄存器 UCSCTL0 (值为0x00F8)中不正确的 DCO 和 MOD 设置引起的。 我打开来自 UCS 模块的中断并在 ISR 中复位 DCOFFG 标志、但不会发生任何情况。 UCSCTL0值仍然为0x00F8、NMI 中断挂起整个器件。 此错误极少发生、仅在器件通过继电器从电池切换到主电源时发生。

我在 occured.e2e.ti.com/.../5165.registers.txt 上创建了所有 MCU 寄存器的 shapshot

此致、

Pawel

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

    UCSCTL0中的值由 FLL 自动修改、所以报告该值不是很有帮助。 如果您提供了用于配置 UCS 模块的代码片段、并让我知道您的系统频率、电源电压、VCORE 电平以及任何外部晶振的值、那将会更有帮助。 获得这些信息后、更容易帮助诊断问题。

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

    非常感谢您的回复。  

    下面是配置 UCS 模块的代码片段:

    void init_SetVcoreUp (无符号 int 电平)
    {
    //打开 PMM 寄存器以写入
    PMMCTL0_H = PMMPW_H;
    //设置 SVS/SVM 高侧新电平
    SVSMHCTL = SVSHE + SVSHRVL0 *电平+ SVMHE + SVSMHRRL0 *电平;
    //将 SVM 低电平设置为新电平
    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *电平;
    //等待 SVM 稳定
    时间((((PMMIFG & SVSMLDLYIFG)=0);
    //清除已设置的标志
    PMMIFG &=~(SVMLVLRIFG + SVMLMRYIFG)
    
    = 0;//将 PMMCL0设置为新电平
    //如果
    ((PMMIFG & SVMLIFG))、则等待达到新的电平
    while (((PMMIFG & SVMLVLRIFG)=0);
    //将 SVS/SVM 低电平设置为新的电平
    SVSMLCTL = SVSLE + SVSLRVL0 *电平+ SVMLE + SVSMLRRL0 *电平;
    //锁定 PMM 寄存器以进行写访问
    PMMCTL0_H = 0x00;
    }
    
    void (void)
    init_SetVcoreUp (0x01);
    init_SetVcoreUp (0x02); //将 Vcore 更改为 LEV 2以支持高达20Mhz 的 CPU 速度
    UCSCTL3 = SELREF_2; //设置 DCO FLL 基准= REFO
    UCSCTL6 &=~XT1OFF; //打开 xtal1
    UCSCTL6 |= XTS;// XTAL1处于 HF 模式。
    UCSCTL0 = 0x0000; //设置可能的最低 DCOx、MODx --这些将被自动修改
    执行{ //循环、直到 XT1、XT1和 DCO 稳定
    UCSCTL7 &=~(XT1HFOFFG | XT1LFOFFG | DCOFFG);//循环、直到 XT1、XT1和 DCO 稳定
    SFRIFG1 &=~OFIFG; //清除故障标志
    }
    while (SFRIFG1和 OFIFG); //测试振荡器故障标志
    UCSCTL4 = SELESS_XT1CLK | SELA_DCOCLKDIV | SELM_DCOCLKDIV;// XTAL1时钟用于 SMCLK 和 ACLK DCOCLKDIV
    _bis_SR_register (SCG0); //禁用 FLL 控制环路
    UCSCTL1 = DCORSEL_6; //选择 DCO 范围以支持16MHz 运行
    UCSCTL2 = FLLD_1 | DCO_MULTIER; //将 DCO 乘法器设置为16.384MHz
    //(N + 1)* FLLRef = Fdco
    //(499 + 1)* 32768 = 16.384MHz
    
    _BIC_SR_register (SCG0); //启用 FLL 控制环路
    // DCO 范围位已经存在时、DCO 的最坏情况稳定时间
    //已更改 n x 32 x 32 x f_MCLK / f_FLL_reference。 请参阅5xx 中的 UCS 一章
    // UG 进行优化。
    // 32 x 32 x 8 MHz/32、768Hz ~ 250000 = DCO 稳定的 MCLK 周期
    _DELAY_CYCLES (1000000);
    //CCR0
    TA0CCTL0 = CCIE; //启用 CCR0中断
    TA0CTL = tassel_1 + MC_1; // ACLK、TIMERA0的向上计数模式
    TA0CCR0 = UPTIMVALUE_DCO; //设置阈值计时器值
    UCSCTL8 &=~ACLKREQEN; // ACLK 时钟信号的关闭请求。 否则、计时器将退出 LMP 模式以进行计数
    
    SFRIE1 |= OFIE;//启用 NMI 中断处理(sys.c)
    } 

    我正在使用外部4MHz 晶体。 MCU 电源电压为3V。 这个初始化(INIT_Clock 函数)只在第一个加电序列执行。 在我的应用中、器件在主电源工作8小时、然后在电池电源工作2小时。 在这两种状态之间切换是我的应用在 NMI 中断中挂起的时刻。 要在电池模式下关闭 MCU、我将使用宏:

    _BIS_SR (CPUOFF);//关闭 CPU 

    和要在受电模式下打开:

    _BIC_SR_REGISTER_ON_EXIT (OSCOFF | SCG0 | SCG1); 

    在此 NMI 中断处理程序中、我的应用挂起、无法复位 DCOFFG 标志:

    /**
    *此 ISR 用于捕捉时钟故障标志。
    */
    _interrupt void UserNMisr (void)
    {
    switch (__event_in_range (SYSUNIV、0x08))
    {
    情况0x04://OFIFG 中断挂起
    UCSCTL7 &=~(XT1HFOFFG | XT1LFOFFG | DCOFFG);
    中断;
    情况0x02:// NMIIFG 中断挂起(最高优先级)
    案例0x06:// ACCVIFG 中断挂起
    情况0x08:// BUSIFG 中断挂起(并不存在于所有器件上。 请参阅器件专用数据表)
    中断;//不关心这些中断
    默认值:
    中断;
    }
    } 

    此致、  
    Pawel

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

    大家好、Pawel、

    我注意到以下几点:

    1. HF 模式下的默认 XT1DRIVE 设置为24MHz 至32MHz。 您应该在4至8MHz 范围内使用 XT1DRIVE_0
    2. 当 DCOFFG 被置位时、表示 UCSCTL0中的 DCO 位为0或31。 这可能是由很多因素引起的、但值得考虑您的 DCORSEL 设置是否适用于16MHz 操作。 尝试上下调整 DCORSEL 并查看结果。
    3. 在进入和退出 LPM 时、我建议 分别使用_ bis_SR_register (LPM0_bits)和_ bic_SR_register_ON_EXIT (LPM0_bits)符号、以便更明显地了解您使用的是哪种工作模式。  
    4. 在 UNMI ISR 中、您永远不会清除 SFRIFG1中的 OFIFG。 您需要清除此位、否则即使不再存在故障、代码也会持续进入中断。  

    总体而言、中断在从主电源转换到电池时触发。 这向我发出信号、表明器件正在断电或至少经历了 VCC 下降。 如果器件的 DIP 过多、并且 PMM 未正确设置以处理此类情况、则 MCU 可能无法正常运行。 当开关发生时、我会监控 VCC、并确保您已正确设置 PMM、以便在 VCC 降至安全工作范围以下时处理16MHz 工作。  

    此致、  
    Caleb Overbay