请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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