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.

[参考译文] MSP430FR2433:从 XT1切换到 VLO 后、RTC 无法工作

Guru**** 2524460 points
Other Parts Discussed in Thread: MSP430FR2433, MSP430FR2311

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/647208/msp430fr2433-rtc-can-not-work-after-switching-from-xt1-to-vlo

器件型号:MSP430FR2433
主题中讨论的其他器件: MSP430FR2311

您好、大师们、

一位客户反馈了以下问题:当  XT1引脚接地且代码 将 RTC 源从 XT1切换至 VLO 时、MSP430FR2433 RTC 无法工作。 我可以在 MSP430FR2311 Launchpad 上重现此问题(我认为 MSP430FR2433的 RTC 器件也是如此)。 此问题的原因如下:

1:器件以 XT1作为 FLL 基准和 RTC->运行

2.突然 使 XT1引脚接 地失效,UMI ISR 中增加了时钟重新配置代码 ,原因是时钟无法将 FLL 基准和 RTC 从 XT1切换到 VLO->

3. VLO 可以确保正常运行,但 RTC 不工作。

整个项目 测试代码如下所示(在 FR2311 Launchpad 上运行)、供您参考以重现问题。

#include 

#define WDTPW_W (0x5b00)
void Init_GPIO (void);
void Config_CS (void);
void Init_Module_RTC (void);
void Init_Module_WDT (void);

unsigned char CrystalMode; // 0、XT1 1、REFO

int main (void)
{
//停止看门狗计时器以防止超时复位
WDTCTL = WDTPW + WDTHOLD;

Init_GPIO ();

Config_CS ();

Init_Module_RTC ();

Init_Module_WDT ();

while (1)
{
_low_power_mode_3 ();
__no_operation();
}
返回0;
}

#pragma vector = WDT_vector
__interrupt void ISR_WDT (void)
{
P2OUT ^= BIT0;////////////////// P2.0///////////////////////////
}

#pragma vector = RTC_Vector
__interrupt void ISR_RTC (void)
{
P1OUT ^= BIT0;//////////////////// P3.2///////////////////////
开关(__evo_in_range (RTCIV、RTCIV_RTCIF)
){
案例 RTCIV_NONE:
中断;
案例 RTCIV_RTCIF:
break;
}
#pragma

vector = UNMI_Vector
__interrupt void ISR_UNMI (void)
{
switch (__even_in_range (SYSUNIV、SYSUNIV_OFIFG)
){
case SYSUNIV_NONE:
break;
case SYSUNIV_NMIIFG:
break;
case SYSUNIV_OFIFG:


CONFIG_CS();

init_Module_rtc ();

init_Module_WDT();
init_gpio();
break;
}
}


void Init_gpio (void)
{
P1DIR = 0xFF;P2DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;

//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}


void Config_CS (void)
{
unsigned int i= 0;
CrystalMode = 0;
P2SEL1 ||(BIT6 + BIT7);//将 XT1引脚设置为第二个功能
执行
{
CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
如果(+i =65535)
{
CrystalMode = 1;
P2SEL1 &=~Ω(BIT6 + BIT7);//将 XT1引脚清零作为第二功能
中断;
}
}
while (SFRIFG1和 OFIFG);//测试振荡器故障标志

__bis_SR_register (SCG0);//如果
(CrystalMode = 0)
则禁用 FLL{
CSCTL3 |= SELREF_XT1CLK;//将 XT1设置为 FLL 基准源
}
否则
{
CSCTL3 |= SELREF_REFOLCLK;//将 REFO 设置为 FLL 基准源
}
CSCTL0 = 0;//清除 DCO 和 MOD 寄存器
CSCTL1 &=~(DCORSEL_7);//清除 DCO 频率选择位第一
个 CSCTL1 |= DCORSEL_2;//清除 DCO 和 DCO

= 0 + DCOCLDC_0MHz
;//设置 DCO = DCO_0MHz;DCO = DCO_DCLDC_0MHz = DCO_DCL1 + DCL1 (DCO_0MHz) //在
(CSCTL7 &(FLLUNLOCK0 | FLLUNLOCK1))时启用 FLL;
// FLL 在

(CrystalMode = 0)
{时锁定
CSCTL4 = SELMS_DCOCLKDIV | SELA_XT1CLK;
//将 XT1 (~32768Hz)设置为 ACLK 源、ACLK = 32768Hz
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
SFRIE1 |= OFIE;
}
否则
{
CSCTL4 = SELMS_DCOCLKDIV | SELA_REFOCLK;
//将默认 REFO (~32768Hz)设置为 ACLK 源,ACLK = 32768Hz
//默认 DCOCLKDIV 为 MCLK 和 SMCLK 源
CSCTL7 &=~(XT1OFFG | DCOFFG);//清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
SFRIE1 ~OFIE;
}



void Init_Module_RTC (void)
{
//初始化 RTC
if (CrystalMode = 0)
{
//RTCCTL = RTCSS__DISABLED + RTCSR;
RTCMOD = 32-1;
RTCCTL = RTCSS_XT1CLK + RTCSR + RTCPS__256 + RTCIE;
}
否则
{
//RTCCTL = RTCSS__DISABLED + RTCSR;
RTCMOD = 32-1;
RTCCTL = RTCSS_VLOCLK + RTCSR + RTCPS_256 + RTCIE;
}


void Init_Module_WDT (void)
{
//初始化 RTC
if (CrystalMode = 0)
{
WDTCTL = WDTPW + WDTSSEL_ACLK + WDTTMSEL + WDTCNTCL + WDTIS_4;
}
否则
{
WDTCTL = WDTPW + WDTSSEL_VLO + WDTTMSEL + WDTCNTCL + WDTIS_4;
}

SFRIE1 |= WDTIE;
} 

 

在调试后、我们发现只有通过在 NMI ISR 中添加 RTC 时钟源禁用和 PUC、RTC 才能在切换时钟后正常工作。 请帮助您了解此功能正在发生什么以及我们是否有更好的想法来解决此问题。

Eric

B&R

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

    将来、请确保使用文本框下方的"插入代码"链接打开高级提交菜单。 然后单击 以插入/提交代码、因为它将格式化以提高可读性。 我已经编辑了您的帖子以反映这一点。

    您能详细说明一下 RTC 不起作用吗? 它不是在计数吗? 如果我正在正确读取此代码、WDT ISR 和 RTC ISR 都将切换相同的引脚。 您是否可以将其更改为不同的引脚、以确保您看到一个切换而不是另一个切换、或两者/无切换?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jace:

    好的、我将按照您的建议插入代码。

    为了详细说明这种现象、RTC 既不计数也不提供中断。 顺便说一下、我在 WDT ISR (P2.0)和 RTC ISR (P1.0)中使用2个不同的 IO、因此当问题发生时、我可以看到 P2.0正在切换、但 P1.0不会切换。

    此致、

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

    我不确定我们是否通过电话讨论了相同的问题。 但现在这个问题怎么样呢?

    我将暂时将此主题设置为"TI 认为已解决"、但请随时回复我或致电我以获取进一步的问题。