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.

[参考译文] MSP430F6736A:RTC_C未在备用电池上计时

Guru**** 2609945 points
Other Parts Discussed in Thread: MSP430F6779, MSP430F6736A, MSP-FET, MSP430F6736

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/654379/msp430f6736a-rtc_c-not-ticking-over-on-battery-backup

部件号:MSP430F6736A
主题中讨论的其他部件:MSP430F6779MSP-TS430PZ100BMSP-FETMSP430F6736

大家好

我有一个硬币电池通过AUXCC3备份到MCU。
(备用电池的目的纯粹是保留RTC和备份RAM,powered..it不会在任何模式下为MSP供电。)

该板从另一个(故障)电源获得正常电源。

当主电源中断时,电池就会启动。RTC应该会被覆盖....但不会。
我通过一条腿上的示波器探头检查了32k的晶体...当电池启动时,晶体很好地踢了一下。

备份RAM保留其数据。
但RTC ...非常strange...it保留了断电的时间,然后当电源恢复时,它会从那个时间恢复。 这意味着它从未被勾住过。
没有任何迹象表明有任何问题....启动时,SYSRSTIV返回2h,表示电压过低,这是正常的。
我的AUXVCC3...AUX3CHCTL的设定= AUXCHKEY | AUXCHV_1| AUXCHC_1| AUXCHEN;  

可能的原因是什么?

我可以做些什么来进一步确定发生了什么?

提前感谢。

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

    您能否尝试MSP430F6779_AUX_[05/06].c来自TIDM-AUXMODULE软件资源的示例并评论任何差异? 同时确保安装了正确的去耦电容器。 e2e.ti.com/.../

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

    您好Ryan

    感谢您的回复。

    只是一些初始要点:

    我使用的是F6736A而不是F6779;
    我不打算进入LLC3 3.5 (或任何模式),我只是想看看主电源已经断电,RTC_C现在由电池供电的情况(当主电源打开时,AUXCC3正在为RTC_C供电)。

    因此,在说了这些之后...我看了06.c并决定尝试一种RTC _C完全由电池供电的情况。
    为此,在我的设置行(即主行的前几行)中 ,我注释掉了我的行AUX3CHTL = AUXCHKEY | AUXCHV_1| AUXCHC_1 | AUXCHEN;
    然后用AUX3CHCTL = AUXCHKEY替换了它; 这实际上是将它重置为当控制进入我的main()时的状态。

    在硬件方面,我有以下内容:

    我的示波器探头位于XTAL1上(引脚24)。
    台式PSU至电池的电压设置为3.3V。
    工作台PSU和电池座之间的+ve导线上的电流表。

    结果是:

    MCU在正常主电源下运行时,备用mem+rtc_C正在运行(工作台PSU 1.2uA和示波器上的电流 显示晶体波形)。
    我检查RTC_C是否通过我编写的通信程序运行,该程序通过eUSCI与固件通信,并且我看到RTC_C正在正确运行。
    断电时波形不会发生任何变化。
    我等待30秒并恢复主电源并检查RTC_C again....it只进行了2秒左右,以便我断开主电源,重新连接主电源并单击'Get Time'(获取时间)按钮...即主电源恢复时, RTC_C将恢复与上次断开主电源时相同的值。

    这告诉我,在主电源断开时,RTC_C不会丢失其内容,但也不会增加时间!

    此测试与由AUXCC3为RTC_C供电的正常情况之间的唯一明显区别如下:

    当AUXCC3被禁用时(此测试在上面):

    断开并恢复主电源后,32K晶体波形不会移动。
    并且所消耗的功率保持在1.2uA不变。

    启用AUXCC3时(正常情况):

    32K波形在从AUXVCC3到蓄电池的交叉中瞬时骤降。
    主电源下消耗的功率为0A,当主电源被拆除时,消耗的功率为1.2uA。

    那么...下一步?

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

    如果保留了RTC数据但没有增加,则在AUXVCC3 VBAK情况下XT1似乎没有正常振荡。 但是,您已经提到它在使用电池时按预期运行。 在蓄电池电源下测得的电流是多少? 您能否提供说明问题的原理图和简单代码示例?

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

    您好Ryan

    通过电池或通过AuxVcc3的波形形状(尼斯正弦曲线)相同...大小略有不同。

    我将台式PSU设置为3.3V

    假设AuxVcc3已被分解:

    波形最大值/最小值为2.60V和 2.39V,PSU的电流为1.0uA (无论是否使用主电源)。

    启用AuxVcc3时:

    主电源为板供电时,波形最大值/最小值变为2.66V和2.45V,电流消耗为0uA。

    断开主电源时,波形最大值/最小值为2.60V和 2.39V,消耗的电流为1.0uA

    代码...

    AUX3CHCTL = AUXCHKEY | AUXCHV_1| AUXCHC_1| AUXCHEN; // AUX3...Vcc,5K电阻器,启用

    RTCCTL0_H = RTCKEY_H;            //解锁RTC_C模块

    RTCCTL0_L |= RTCRDYIE; // 读取就绪中断(每秒)

    RTCCTL1 = 0;

    RTCCTL1 = 0x00 | RTCHOLD | RTCMODE; // RTC enable binary mode ~RTCBCD,RTC Hold,Calendar mode

    RTCCTL1 &=~RTCHOLD;   //启动RTC日历模式

    RTCCTL0_H = 0;        //锁定RTC_C模块

    我无法提供任何代码来证明RTC没有勾选over..it是一个观察结果(这就是我发现这一意外问题的原因)。

    读取时钟,断开电源,等待一分钟,读取时钟。

    对于示意图:  


    谢谢

    莫希

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

    CPU频率是多少?PMMCOREV是否已正确增加?  您是否考虑过在AUXVCC3上使用专用电源而不是电池进行测试? 在修改AUX3CHTL之前解锁PMM寄存器(PMMCTL0_H = PMMPW_H;),通过调试器确认所有位在之后都已正确设置,从而幽默我。  我认为我已经具备了尝试重新创建此问题所需的一切。

    此致,
    Ryan

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

    您好Ryan

    问:CPU频率是多少?
    答:我相信它是16MHz还是8MHz?

    这是它的设置方式(XT1是3.2768万的FLLREF CLK)。

    UCSCTL0 = 0;//设置可能的最低DCOx,MODx
    UCSCTL1 = DCORSEL_5;//允许的范围是6MHz-23.7MHz,请参见图10数据表
    UCSCTL2 = FLLD_1 | 255;//将FLLN设置为255 SO (N+1)=256,FLLD = 1 SO D = 2....
    UCSCTL3 = SELREF_0 | FLLREFDIV_0;//为默认值
    UCSCTL4 = SELM__DCOCLK | SELS__DCOCLK |拉美经济体系__XT1CLK;//MCLK & SMCLK来自DCOCLKDIV (8MHz),32KHz ACLK
    UCSCTL5 |= DIVs__1;//此有效设置将UCSCTL5设置为0,这意味着不分割ACLK,MCLK,SMCLK CLKS中的任何部分

    根据用户指南fDCOCLKDIV = MCLK =(N+1) x3.2768万 =(255+1) x3.2768万,使其频率为8MHz
    fDCOCLK = fDCOCLKDIV*D = 16MHz

    我注意到PMMCOREV保留在默认值0,所以我在设置DCO之前添加了这一行.....但它没有任何区别
    PMMCTL0 = 0xa503;// sheesh...忘记将其设置为Vcore3...see数据表中的图5-1

    我还在PMM行之后立即设置此行
    AUX3CHCTL = AUXCHKEY;//禁用充电器,以便仅使用电池-测试TI

    问: 您是否考虑过在AUXVCC3上使用专用电源进行测试
    答:自从我发现这个问题以来,我只在AUXVCC3上使用工作台PSU进行测试。

    关于猎杀你...是的,我要添加一条线,将它连接到coreV3
    我通过执行 PMMCTL0_H =0并检查AUX3HCTL来检查AUX3HCTL是否仍设置为我想要的值。

    接下来要尝试什么?

    谢谢
    莫希

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在更改UCSCTL寄存器(__bis_sr_register(SCG0);)之前,您是否禁用了FLL控制回路? 此配置适用于大约等于8.389 MHz的DCO,它需要PMMCOREv级别为1,转换需要一个序列,如msp430f665x_UCS_03.c SetVCoreUp函数中所示。 我将在下周尝试重现此问题并报告我的发现。

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

    您好Ryan
    是的,FLL控制回路在上述任一操作之前被禁用,并在上述操作之后被启用(在UCSCTL5分配之后)。

    我的理解是这是因为这条线
    UCSCTL4 = SELM__DCOCLK | TELS__DCOCLK |拉美经济体系__XT1CLK;
    MCLK为fDCO,在本例中为16MHz。
    (我在上一篇文章中说MCLK来自fDCOCLKDIV是不正确的)

    我知道需要正确的过渡...
    我刚刚实现了基于msp430f665x_UCS_03.c SetVCoreUp的代码
    但是我看不出PMM功能如何影响RTC在AUXVCC3上通过工作台PSU和主电源断开时发生的情况。

    就这样...我仍然有RTC在主电源断开时不会发生故障的问题。

    此致
    莫希

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

    您好,Moshe,

    以下代码使用带有32 kHz外部晶体和负载电容器的MSP-TS430PZ100B正常工作。  当JP4,JP11和JP12未填充以分别删除DVCC,AUXVCC1和AUXVCC2时,RTCSEC和RTCTIM0仍从AUXVCC3功率递增。

    #include <MSP4S.h>
    
    void SetVcoreUp (无符号int级别);
    
    void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止WTD
    
    //设置WFP 11.5 RTCCLK
    P9DIR || BIT0; // RTCCLK设置为引脚
    P9SEL |=BIT0;
    
    SetVcoreUp (0x01);
    SetVcoreUp (0x02);
    
    //启用充电器
    AUX3CHCTL = AUXCHKEY + AUXCHC_1 + AUXCHV_1 + AUXCHEN;
    
    ////初始化LFXT1
    UCSCTL6 &=~(XT1OFF); //启用XT1
    // UCSCTL6 |= XCAP_3; //内部负载盖
    //循环,直到XT1,XT2和DCO故障标志被清除
    
    __bis_sr_register (SCG0); //禁用FLL控制回路
    UCSCTL0 = 0x0000; //设置尽可能低的DCOx,MODx
    UCSCTL1 = DCORSEL_5; //选择DCO范围24MHz操作
    UCSCTL2 = FLLD_1 + 487; //将DCO乘数设置为16MHz
    //(N + 1)* FLLRef = Fdco
    //(487 + 1)* 3.2768万 = 16MHz
    //设置FLL Div = fDCOCLK/2
    __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 16 MHz / 3.2768万 Hz = 50万 = MCLK周期,以便DCO稳定下来
    __DELAY周期(50万);
    
    做
    {
    UCSCTL7 &=~(XT2OFFG | XT1LFOFFG | DCOFFG);
    //清除XT2,XT1,DCO故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } 同时(SFRIFG1和OFIFG); //测试振荡器故障标志
    
    //启动RTC日历模式
    RTCCTL0_H = RTCKEY_H; //解锁RTC_C模块
    RTCCTL0_L |= RTCRDYIE;// //启用RTC时间事件,
    RTCCTL1 |= RTCBCD;
    RTCCTL13 &=~(RTCCALF_3);//清除所有RTCCALF位,因为它们可能具有以前的RTCCALF值。
    RTCCTL13 |= RTCCALF_1; //512 Hz RTC输出
    RTCCTL1 &=~(RTCHOLD);//在这种情况下,RTCHOLD可以使用POR设置。 但是,它没有
    //在VDSYS关闭时设置,但当它出现时,它确实会设置
    //返回。 因此,应重置它以启用操作。
    RTCCTL0_H = 0;
    
    __bis_sr_register (GIE);
    while (1)__no_operation();
    }//
    
    RTC中断服务例程
    #pragma vector=rtc_vector
    __interrupt void rtc_isr (void)
    {
    开关(__偶 数_范围内(RTCIV,16))
    {
    案例RTCIV_NONE: //不中断
    中断;
    案例RTCIV_RTCOFIFO: // RTCOFIFO
    中断;
    案例RTCIV_RTCRDYIFG: // RTCRDYIFG
    __no_operation();
    中断;
    案例RTCIV_RTCTEVIFG: // RTCEVIFG
    __no_operation();
    中断;
    案例RTCIV_RTCAIFG: // RTCAIFG
    __no_operation();
    中断;
    案例RTCIV_RT0PSIFG: // RT0PSIFG
    中断;
    案例RTCIV_RT1PSIFG: // RT1PSIFG
    中断;
    // 判例14:中断; //保留
    判例16:中断; //保留
    默认值:break;
    }
    }
    
    void SetVcoreUp (无符号int级别)
    {//
    打开PMM寄存器以写入
    PMMCTL0_H = PMMPW_H;//
    设置SVS/SVM高端新级别
    SVSMHCTL = SVSHE + SVSHRVL0 *级别+ SVSMHE + SVSMHRRL0 *级别;
    //将SVM低侧设置为新级别
    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *级别;
    //等待SVM稳定
    ,同时(PMMIFG和SVSMLDLYIFG)== 0);
    //清除已设置的标记
    PMMIFG &=~(SVMLVLRIFG + SVMLIFG);PMCL_PM0
    级别
    
    //等待到达到新级别
    ,如果((PMMIFG & SVMLIFG))
    WHILE (PMMIFG和SVMLVLRIFG)== 0);
    //将SVS/SVM低侧设置为新级别
    SVSMLCTL = SVSLE + SVSLRVL0 *级别+ SVMLE + SVSMLRRL0 *级别;
    //锁定PMM寄存器以进行写入访问
    PMMCTL0_H = 0x00;
    } 

    此致,Ryan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好Ryan
    我的MCU有一些奇怪的地方...也许它与悬浮在新西兰的臭氧层孔有关!
    我使用了我拥有的其中一个芯片(MSP430F6736A...仍在其磁带中未使用)用于我拥有的MSP430PZ100B目标板。
    我在JP3上为EXT设置电源(跳线在针3和4上)。
    我将JMP12放在针脚3和4上以排除它。
    我添加了32K晶体(随板提供)和2个电阻器(R6,R8 0欧姆)以及所需的2个电阻盖(C1,C2 12pF)。
    我逐字使用您的代码。
    但我将行AUX3CHCTL = AUXCHKEY + AUXCHC_1 + AUXCHV_1 + AUXCHEN更改为简单AUX3CHTL = AUXCHKEY,以便仅从AUXVCC3禁用充电器和电源。
    我将台式PSU (通道1)连接到J5。
    我将台式PSU (通道2)连接到JP13的引脚2和4。
    我将示波器探头连接到引脚42。

    我启动了调试器...
    我观察到512Hz sq wave....great,RTC正在工作。
    我观察了调试器中的秒数。
    我观察到我的DMM上的AuxVCC3的功耗为0.9uA。
    然后,我将JMP11和4取出5分钟。
    我观察到AuxVCC3的功耗保持在0.9uA。
    然后重新启动调试器。
    然后,我在RTCRDYIFG停止调试器并观察了RTCHR,RTCMIN,RTCSEC值...我注意到进度只是我断开JMP11&4所花的时间。

    所以不是...我的RTC在DVCC被移除时没有被覆盖!!

    也许现在考虑以下几点是适当的:
    1.当AUXVCC3由外部电源供电且主电源(DVCC)不用于RTC模块时,AUXVCC3上的功耗应该是多少?
    2. MCU内的哪些情况会阻止RTC工作? 我假设为了'勾选' RTC模块中的中断必须发生...所以另一个问题是"什么会阻止RTC中断发生"?
    3.我能想到会有一批坏的薯条吗? 如果是,我可以做些什么来明确表明这一点?

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

    全部,

    如果在这种情况下,无法清除RTC间隔标志,这意味着它永远不会离开ISR,请确保在禁用SVS时不会出现RTC中断。

    另请参阅以下用户指南部分:

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

    你好,Dietmar

    感谢您强调这一点...但是...我们不打算进入3.5 中...主电源故障,因此这是一种不能通电的情况。
    而且,由于不知道电力将被切断,该计划没有事先做任何事情。

    Ergo,SVS (或任何其他外围设备)在电源故障之前不会被触摸,并保持不变。

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

    您好,

    它与3.5 无关,即使您在活动模式下禁用SVS,也会遇到此问题。

    不管怎样,如果你不触摸SVS,它会有些不同。 那么,连接调试器时是否会出现此行为?

    如果可以,请尝试调试此错误,并检查RTC是否正在计数,以及振荡器故障标志是否已正确清除。

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

    你好,Dietmar

    根据示例项目msp430f665x_UCS_03.c更改SVS

    是的,我确实连接了调试器。
    当MCU运行时,RTC确实会被覆盖(在我的PCB和TI目标板中)。

    我的振荡器检查在以下循环中设置:

    同时(SFRIFG1和OFIFG)//检查OFIFG故障标记

        UCSCTL7 &=~(DCOFFG | XT1LFOFFG | XT2OFFG);//清除OSC故障标志
        SFRIFG1 &=~OFIFG;//清除OFIFG故障标志
    }

    即使在Ryan建议进行任何更改之前,RTC仍在运行,同时使用主电源。

    我在设置开始时也有这一行  
          BAKMEM3 = SYSRSTIV;  //存储上次启动的reg。
    返回2小时,我认为是BOR。

    AUXVCC3直接连接到备用电源(PCB和目标板)。
    从示波器探头中我可以看到XT1振荡器在主电源断开时继续运行。
    从我的数字万用表中,我看到无论主电源开关如何,功率消耗都是0.9 uA,所以我假设它表明当主电源被切断时,与AUXVCC3相关的所有设备都继续工作。

    因此,似乎是在断电时设置了一些东西,将RTC置于保持状态。 我应该在哪里查找?

    但我也很奇怪,为什么Ryan的代码让RTC在备用电源下继续运行,而我的Ryan代码副本却不是...相同的代码,相同的目标板,相同的跳线设置(?),相同的MCU。

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

    我的测试仅通过FET电源运行,而不是工作台电源运行,您是否可以尝试相同操作并在测试期间保持调试器打开? 如果您担心批次质量,也可以提供切屑标记。

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

    您好Ryan
    是的,我这样做了,是的,RTC也打了钩...但这只是因为MCU仍在运行(某处),这可以通过在While循环和ISR中逐步执行代码来证明,当移除这些跳线时, 因此,除了可以移除J4,J11和J12,芯片仍在FET功率下运行之外,没有任何证据证明...我不知道如何操作,除非它能做到。

    应使用RTC和来自外部电源(而非FET)的主电源执行测试。
    RTC仅由外部源提供,以消除AUXVCC3充电器的任何问题。
    然后断开主电源并在一分钟或更长时间后将其返回,然后阅读测试的RTC registers....in,在这些情况下RTC不会再次运行...(尽管晶体保持运行并且寄存器保持活动状态)。

    我认为这不是一个芯片质量问题,而是一个设置问题(甚至可能是连接问题)。

    此致
    莫希

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

    我认为,在MCU在AUXVCC3电源使MCU进入并从AUXA L朗 比状态唤醒之后3.5 ,我们不能依赖调试器来准确地重新连接和显示RTC寄存器值。 您是否可以使用其他形式的输出(LED,UART,LCD等)来评估您的RTC?

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

    您好Ryan
    我通过RS232与设计板通信。 这就是我一开始就提出这个问题的方式。
    当电源恢复时,我再次读取RTC并注意到时间只打了几秒钟,而不是几分钟电源关闭。
    我使用目标板的唯一原因是您说它在您的设置中起作用。

    因此...考虑到...以及与董事会的沟通...我已经确定:
    1.断开主电源后,32K晶体会继续振荡。
    2.拔下电源时,RTC寄存器的内容会保留其值。

    几乎就像RTCCTL1有一个RTCHOLD分配.....这是可能的吗?
    是否有其他设置会使RTC继续跳转或相反进入休眠模式?
    是否有一组并行寄存器用于断电情况,然后我必须将其复制(重新启动时)到我用于读取时间的RTC寄存器中?

    此致
    莫希

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

    您好,Moshe,

    我已将以下代码应用到MSP-TS430PZ100B目标板上,并将MSP-FET的引脚2连接到VCC,将引脚9连接到GND,将引脚12连接到WFP 1.3 ND/TXD,将引脚14连接到WFP 1.2。  即使在AUXVCC3供电期间,我也可以看到RTCSEC使用终端程序@ 9600波特率(在DVCC重新连接之后)正常递增。

    #include <MSP4S.h>
    
    void SetVcoreUp (无符号int级别);
    
    void main (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止WTD
    
    //设置WFP 11.5 RTCCLK
    P9DIR || BIT0; // RTCCLK设置为引脚
    P9SEL |=BIT0;
    
    //设置WFP 1.2 UCA0RXD,WFP 1.3 UCA0TXD
    P1SEL || BIIT2 | BIT3; //将WFP 1.2 ,WFP 1.3 设置为non-IO
    P1DIR || BIIT2 | BIT3; //启用UCA0RXD,UCA0TXD
    
    SetVcoreUp (0x01);
    SetVcoreUp (0x02);
    
    //启用充电器
    AUX3CHCTL = AUXCHKEY + AUXCHC_1 + AUXCHV_1 + AUXCHEN;
    
    ////初始化LFXT1
    UCSCTL6 &=~(XT1OFF); //启用XT1
    // UCSCTL6 |= XCAP_3; //内部负载盖
    //循环,直到XT1,XT2和DCO故障标志被清除
    
    __bis_sr_register (SCG0); //禁用FLL控制回路
    UCSCTL0 = 0x0000; //设置尽可能低的DCOx,MODx
    UCSCTL1 = DCORSEL_5; //选择DCO范围24MHz操作
    UCSCTL2 = FLLD_1 + 487; //将DCO乘数设置为16MHz
    //(N + 1)* FLLRef = Fdco
    //(487 + 1)* 3.2768万 = 16MHz
    //设置FLL Div = fDCOCLK/2
    __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 16 MHz / 3.2768万 Hz = 50万 = MCLK周期,以便DCO稳定下来
    __DELAY周期(50万);
    
    做
    {
    UCSCTL7 &=~(XT2OFFG | XT1LFOFFG | DCOFFG);
    //清除XT2,XT1,DCO故障标志
    SFRIFG1 &=~OFIFG; //清除故障标志
    } 同时(SFRIFG1和OFIFG); //测试振荡器故障标志
    
    //启动RTC日历模式
    RTCCTL0_H = RTCKEY_H; //解锁RTC_C模块
    RTCCTL0_L |= RTCRDYIE;// //启用RTC时间事件,
    RTCCTL1 |= RTCBCD;
    RTCCTL13 &=~(RTCCALF_3);//清除所有RTCCALF位,因为它们可能具有以前的RTCCALF值。
    RTCCTL13 |= RTCCALF_1; //512 Hz RTC输出
    RTCCTL1 &=~(RTCHOLD);//在这种情况下,RTCHOLD可以使用POR设置。 但是,它没有
    //在VDSYS关闭时设置,但当它出现时,它确实会设置
    //返回。 因此,应重置它以启用操作。
    RTCCTL0_H = 0;
    
    //设置eUSI_A0
    UCA0CTLW0 |= UCSWRST; //**将状态机置于复位**
    UCA0CTLW0 |= UCSSEL_1; // CLK = ACLK
    UCA0BRW_L = 0x03; // 32kHz/9600= 3.41 (请参阅用户指南)
    UCA0BRW_H = 0x00; //
    UCA0MCTLW = 0x5300; //调制UCBRSx=0x53,UCBRFx=0
    UCA0CTLW0 &=~UCSWRST; //**初始化USCI状态机**
    UCA0IE |= UCRXIE; //启用USI_A0 RX中断
    
    __bis_sr_register (GIE);
    while (1)__no_operation();
    }//
    
    RTC中断服务例程
    #pragma vector=rtc_vector
    __interrupt void rtc_isr (void)
    {
    开关(__偶 数_范围内(RTCIV,16))
    {
    案例RTCIV_NONE: //不中断
    中断;
    案例RTCIV_RTCOFIFO: // RTCOFIFO
    中断;
    案例RTCIV_RTCRDYIFG: // RTCRDYIFG
    __no_operation();
    中断;
    案例RTCIV_RTCTEVIFG: // RTCEVIFG
    __no_operation();
    中断;
    案例RTCIV_RTCAIFG: // RTCAIFG
    __no_operation();
    中断;
    案例RTCIV_RT0PSIFG: // RT0PSIFG
    中断;
    案例RTCIV_RT1PSIFG: // RT1PSIFG
    中断;
    // 判例14:中断; //保留
    判例16:中断; //保留
    默认值:break;
    }
    }//
    
    ucsi_A0中断服务例程
    #if defined(__TI_Compiler_version__)|| defined(__IAR_systems_icc__)
    #pragma vector=USI_A0_vector
    __interrupt void uISR_A0_ISR(void)
    #Elif defined(__GNU___)
    #vector_attribute_(interrupt (USCI_sI_void_error_use)
    
    
    #endif
    {
    开关(__偶 数_IN_RANGE (UCA0IV,4))
    {
    案例USI_NONE:中断; //不中断
    案例USI_UART_UCRXIFG: // RXIFG
    while (!(UCA0IFG & UCTXIFG);// USI_A0 TX buffer ready,
    UCA0TXBUF =((RTCSEC>>>4)&0x0F)+ 48;// RTCSEC高字节
    while (!(UCA0IFG & UCTXIFG);// USI_A0 TX buffer ready,
    UCA0TXBUF =(RTCSEC&0x0F)+48;// RTCSEC低字节
    while (!(UCA0IFG & UCTXIFG);// USI_A0 TX buffer ready,
    UCA0TXBUF = 10;
    while (!(UCA0IFG & UCTXIFG);// USI_A0 TX buffer ready,
    UCA0TXBUF = 13;
    中断;
    案例USI_UART_UCTXIFG:中断; // TXIFG
    案例USI_UART_UCSTIFG:中断; // TTIFG
    案例USI_UART_UCTXCPTIFG:中断;// TXCPTIFG
    默认值:break;
    }
    }
    
    void SetVcoreUp (无符号int级别)
    {//
    打开PMM寄存器以写入
    PMMCTL0_H = PMMPW_H;//
    设置SVS/SVM高端新级别
    SVSMHCTL = SVSHE + SVSHRVL0 *级别+ SVSMHE + SVSMHRRL0 *级别;
    //将SVM低侧设置为新级别
    SVSMLCTL = SVSLE + SVMLE + SVSMLRRL0 *级别;
    //等待SVM稳定
    ,同时(PMMIFG和SVSMLDLYIFG)== 0);
    //清除已设置的标记
    PMMIFG &=~(SVMLVLRIFG + SVMLIFG);PMCL_PM0
    级别
    
    //等待到达到新级别
    ,如果((PMMIFG & SVMLIFG))
    WHILE (PMMIFG和SVMLVLRIFG)== 0);
    //将SVS/SVM低侧设置为新级别
    SVSMLCTL = SVSLE + SVSLRVL0 *级别+ SVMLE + SVSMLRRL0 *级别;
    //锁定PMM寄存器以进行写入访问
    PMMCTL0_H = 0x00;
    }
    

    此致,Ryan

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

    您好Moshe,

    由于设置了RTCHOLD位,我在MSP430F6736的一些设计中看到过此类问题。 当断电时,有时MCU在断电前先重置,RTC可能会停止,因为复 位时设置了RTCHOLD,并且代码无法到达您要清除的指令。  但是,由于您使用 的是MSP430F6736A,因此您可以在应用程序中使用RTCLOCK。 在RTC的初始化代码中,只需在RTCCTL3中设置RTCLOCK位。

    对于MSP430F6736 (不带A), 我 建议使用以下低级初始化功能 来解决此问题:

    对于CCS编译器:

    int _system_pre_init(void)

     //清除RTC

     RTCCTL0_H=RTCKEY_H;//解锁RTC_C模块

     RTCCTL13 &=~(RTCHOLD);

     RTCCTL0_H=0;

     返回1;

    }

     

    对于IAR编译器:

    int __low_lever_init (void)

     //清除RTC

     RTCCTL0_H=RTCKEY_H;//解锁RTC_C模块

     RTCCTL13 &=~(RTCHOLD);

     RTCCTL0_H=0;

     返回1;

    }

     

     此致,

    Vikas Chola

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

    首先,Vikas ...感谢您的参与。
    但是,如果我在RTCCTL3中设置RTCLOCK,我的RTC中断就永远不会被调用,因为RTC被锁定了,这不是我想要的。
    但这让我有了一个想法,因为你说可能的重置没有到达我的RTC inialisation代码,所以我仍然被锁定……稍后再讨论这个问题。

    其次,Ryan ...感谢您关于在目标板上使用Rx和Tx的想法。
    问题1. 我的印象是设置P1DIR位会将其设置为输出...但Rx是一个输入...但它仍然收到一个字节-为什么???

    现在我的结果:
    根据Vikas所写的重置信息,我将此代码添加为主代码的第一行
    RTCCTL0_H = RTCKEY_H; //解锁RTC_C模块
    RTCCTL1 &=~(RTCHOLD);
    RTCCTL0_H = 0; //锁定它
    在目标板上,似乎使RTC在断电时能够重新启动..... 很棒!!!
    然后我评论了这些路线并重试了练习,它仍然有效……为什么……它现在应该继续有效???

    然后我搬到了我的主板上,尝试了同样的东西……它不工作,RTC在主电源拆除时没有重复。
    绝望的时候,我把FET断开了,然后重试了……这似乎是有效的。
    然后我重复了几次这个练习,每次都打了个钩……太棒了!!
    然后,我留下它来写这个便签,但我想让我再试一次...这次它不起作用。
    30秒后我又重试了一次,结果还是很成功。

    有时RTC似乎会停止工作,有时不会停止工作...这将支持Vikas所说的重置发生,但未达到我的解锁码。
    问题2. 如果我需要依赖主电源断开时的RTC,这似乎表明芯片中存在严重缺陷...这是否是有效的断言?

    问题3. 我如何能够最后证明这一点?
    问题4: 我该怎么做才能防止这种情况发生?
    问题5. 为什么目标板现在总是工作?

    此致
    莫希

    PS...我没有将此标记为解决方案,因为我不知道我是否已最终解决了我的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Moshe,

    首先,忽略PxDIR,因为PxSEL在决定引脚功能时具有优先权。 其次,您的自定义主板似乎存在一个设计缺陷,即在DVCC和AUXVCC3之间切换会导致设备重置/恢复使用DVCC的操作,但随后在执行RTC初始化之前重新进入AUXVCC3。 您可以通过使用示波器监控VCC,AUX和RST线来评估此情况。 如果您能找到避免RTC ISR的方法,我建议您使用RTCLOCK。 否则,请尝试增加VCC电容。

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

    我进一步查看了我的ISR,注意到我在访问时钟时设置了RTCCTL1|= RTCHOLD ...我不需要这样做,我想如果我设置后立即断电,这可能是整个问题的原因!...所以 现已删除。

    我在这里可能有点慢...但是...我不理解RTCLOCK的使用...正如我所理解的那样,在调试器中看到的那样,当设置了这一点时,RTC时间寄存器不可用,这如何帮助获得时间...我在这里错过了什么??

    最后,我确实需要RTC ISR,因此我将研究主板上的各种封盖-感谢您的支持。

    此致
    莫希
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTCLOCK确保从3.5 唤醒时不会将所有受保护的RTC寄存器位写入或重置,有关说明,请参阅《用户指南》的24.2 9节。

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

    您好Ryan

    为可能一直在观看此帖子的其他人总结一下。

    关于增加Vcc上限的建议是可行的!!!!

    我注意到目标板上的Vcc上限是32uF,而在我的定制板上,上限是10uF ...所以我将上限提高到32uF ...所以如果您希望RTC继续运行,那么Vcc上的最小上限似乎必须在32uF左右。

    问:为什么Vcc上的盖子会影响RTC的运转情况?

    再次感谢您的努力

    莫希

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

    很高兴听到您的问题得到解决! 我认为这与我们已经知道的事实有关,在两个电源之间切换会产生反弹效应,MCU使用DVCC启动执行代码,然后在RTC正确初始化之前切换到AUXVCC3,从而创建观察到的失败状态。 增大Vcc电容可减少这种影响,并允许在两个电源之间进行流畅切换,而无需进行不必要的切换。

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

    您好Ryan

    感谢Ryan的所有意见。

    理想情况下,我需要在触发POR之前设置RTCLOCK ... MCU (或用户指南)中是否有这样的机制(我不相信有)。

    谢谢

    莫希