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.

[参考译文] RTOS/MSP430FR6972:RTC WAKE 3.5 的问题

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/658447/rtos-msp430fr6972-the-question-of-rtc-wake-lpm3-5

部件号:MSP430FR6972

工具/软件:TI-RTOS

你好,

我在使用RTCAIE中断唤醒3.5 时遇到问题。 进入LCCTL0L之前3.5 ,我设置了1分钟的RTC报警,RTCCTL0L的值为0x20。  当1分钟警报到达且RTC唤醒CPU时,我发现RTCCTL0L = 0x07。 然后,程序总是进入RTC的ISR,但它没有执行任何案例。 程序运行 异常。ISR程序如下所示:

#pragma vector = rtc_vector
__interrupt void rtc_isr (void)
{
Switch(__偶 数_in_range(RTCIV, RTCIV_RT1PSIFG))
{
案例RTCIV_NONE:
中断;
案例RTCIV_RTCOFIFO:
中断;
案例RTCIV_RTCRDYIFG:
中断;
案例RTCIV_RTCTEVIFG:
_EINT();
RtcCount++;
IF (RTCCount == 1)
{
RtcCount = 0;
G_WakeRegister |=唤醒RTC时间到达;
__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);

}
中断;
案例RTCIV_RTCAIFG:
/*退出3.5模式,程序重启*/
__BIC_SR_REGISTER_ON_EXIT (LPM3_bits);
中断;
案例RTCIV_RT0PSIFG:
中断;
案例RTCIV_RT1PSIFG:
中断;
默认:
中断;
}
} 

我希望您能帮助我 。

此致

Jent

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

    您可以在RTC ISR中设置断点,并在程序进入ISR时查看RTCIV的值。 此外,您还可以运行官方代码示例,查看是否有任何异常。 如果代码示例正确,您可以将代码与示例代码进行比较,以找出差异。

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

    感谢Winter!

    我进行简单的测试,代码如下所示:

    void main( void ){
    
    // close watch dog
    	wdtctl = WDTPW | WDTHOLD;
    	
    	//针对16MHz MCLK
    	FRCTL0的配置fram = FRCTLPW | NWITS_1;
    	GCCTL0 &=~UBDIE;
    	GCCTL0 |= FRPWR|FRLPMPWR;
    	FRCTL0_H = 0x00u;
    	
    	//配置clock
    PJSEL0 = BIT4 | BIT5;
    CSCTL0_H = CSCKEY_H;
    CSCTL1 = DCORSEL | DCOFsel_4;
    CSCTL2 =拉美经济体系__LFXTCLK|SELM__DCOCLK|SESTS__DCOCLK;//MCLK 16MHz SMCLK 16MHz ACLK 32.768kHz
    CSCTL3 = DIVA__1|DIVs__1|DIVM__1;
    CSCTL4 &=~LFxTOFF;
    做
    {
    CSCTL5 &=~LFxTOFFG;
    SFRIFG1 &=~OFIFG;
    } 同时(SFRIFG1和OFIFG);
    CSCTL4 &=(~(LFXTDRIVE0 | LFXTDRIVE1));
    CSCTL0_H = 0;
    
    __bis_sr_register (GIE);
    	PM5CTL0 &=~LOCKLPPM5;
    	
    	//int RTC
    	RTCCTL0_H = RTCKEY_H;
    RTCCTL0_L = 0x00u;
    RTCCTL1 = 0x00u;
    RTCCTL1 |= RTCHOLD|RTCMODE;
    RTCCTL3 = 0X00u;
    RTCPS0CTL = RT0PSHOLD;
    RTCPS1CTL = RT1PSHOLD;
    RTCCTL0_H = 0x00u;
    	
    	//写入RTC int time
    	RTCCTL0_H = RTCKEY_H;
    RTCCTL1 || RTCHOLD| RTCMODE;
    RTCSEC =0;
    RTCMIN = 0;
    RTCHOUR = 1;
    RTCDOW = 1;
    RTCDAY = 1;
    RTCMON = 1;
    RTCYEAR =2000;
    RTCCTL1 &=~RTCHOLD;
    RTCCTL0_H = 0x00u;
    	
    	//设置RTC警报
    	RTCCTL0_H = RTCKEY_H;
    RTCCTL1 || RTCHOLD| RTCMODE;
    RTCCTL0_L = 0x00u;
    RTCAMIN = 0x00u;
    RTCAHOUR = 0x00u;
    RTCADOW = 0x00u;
    RTCADAM = 0x00u;
    RTCAMIN = RTCAE |1;
    RTCAHOUR = RTCAE |1;
    RTCADOW = RTCAE |1;
    RTCADAM = RTCAE |1;
    RTCCTL0_L || RTCAIE;
    RTCCTL1 &=~RTCHOLD;
    RTCCTL0_H = 0x00u;
    	
    	//输入lpmMCTL0_H 3.5
    	= PMMPW_H;
    	PMMCTL0_L &=~(SVSHE);
    	PMMCTL0_L |= PMMREGOFF;
    PMMCTL0_H = 0;
    __bis_sr_register(LPM3_bits | GIE);
    }
    
    
    
    #pragma vector = rtc_vector
    __interrupt void rtc_isr(void)
    {
    Switch(__偶 数_in_range(RTCIV, RTCIV_RT1PSIFG))
    {
    案例RTCIV_NONE:
    中断;
    案例RTCIV_RTCOFIFO:
    __no_operation();
    中断;
    案例RTCIV_RTCRDYIFG:
    __no_operation();
    中断;
    案例RTCIV_RTCTEVIFG:
    __no_operation();
    中断;
    案例RTCIV_RTCAIFG:
    __BIC_SR_REGISTER_ON_EXIT (LPM3_bits);
    中断;
    案例RTCIV_RT0PSIFG:
    __no_operation();
    中断;
    案例RTCIV_RT1PSIFG:
    __no_operation();
    中断;
    默认:
    中断;
    }
    } 

    我发现当CPU从3.5 唤醒 并 执行“__bis_sr_register (GIE);”时,CPU将始终进入RTC ISR。 在RTC ISR中,CPU 始终执行“CASE RTCIV_RT1PSIFG”。

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

    寄存器值如下所示:

    当CPU被唤醒时,为什么要设置RTCTEVIFG,RT1SIFG?

    此致

    Jent

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

    您好,Jent,

    有关使用LLAY马3.5 模式的信息,您可以参考此官方代码示例。

    /*--版权--,BSD_EX
    *版权所有(c) 2014,Texas Instruments Incorporated
    *保留所有权利。
    *
    **
    允许以源代码和二进制格式重新发布和使用,无论是否进行*修改,只要
    满足以下条件*:
    *
    ****重新发布源代码必须保留上述版权
    *声明,此条件列表和以下免责声明。
    *
    ***以二进制格式重新分发时,必须在
    
    随分发提供的*文档和/或其他材料中复制上述版权*声明,此条件列表和以下免责声明。
    *
    ***
    
    未经事先书面许可,不得使用德州仪器(TI)公司的名称或*其贡献者的名称来支持或促销由本软件衍生的产品*。
    *
    *本软件由版权所有者和贡献者"按原样"提供
    *,
    
    不提供任何明示或暗示的担保,包括但不限于*对适销性和特定*用途适用性的暗示担保。 在任何情况下,版权所有者或
    *贡献者均不对任何直接,间接,附带,特殊,
    *示范, 或后果性损害(包括但不限于
    *购买替代商品或服务;使用,数据或利润损失;
    (*或业务中断),但根据任何责任理论
    ,*无论是合同,严格责任还是侵权行为(包括疏忽或
    *其他),均因使用本软件而导致*
    ,即使已被告知此类损害的可能性。
    *
    ******************
    *
    ** MSP430代码示例免责声明
    *
    MSP430代码示例是独立的低级程序
    ,通常*以高度
    *简洁的方式演示单个外设功能或器件功能。 因此,代码可能依赖于设备的开机默认
    值*寄存器值和设置(如时钟配置),
    在合并多个示例中的代码时必须*小心,以避免潜在的副作用
    *。 另请参阅www.ti.com/grace了解GUI,并参阅www.ti.com/msp430ware
    *了解外围设备配置的API功能库方法。
    *
    **--/copyright--*//************************************************************************************************************************
    
    // MSP430FR69xx演示- RTC_C,LONB,3.5 和ALARM
    ////
    说明:RTC_C模块用于设置时间,启动RTC操作
    //以及从各自的RTC寄存器读取时间。 软件将
    于2011年10月7日(星期五)将//原始时间设置为上午11:59:30。 然后,RTC将
    //通过软件激活,并为下
    一个//分钟(12:00:00 pm)创建警报。 然后,设备将进入LLAR2/LA等待3.5
    //事件中断。 当被事件唤醒时,将
    设置板//上的LED。
    //
    // ACLK = 32.768kHz,MCLK = SMCLK = DCO =~1MHz
    //
    MSP430FR6989
    // --------
    // /|\\| Xin|-
    // || | 32kHz
    // --|RST XOUT|-
    // | |//
    | 1.0 公司
    
    
    
    // 2014年4月
    //采用IAR嵌入式工作平台5.60 和码编辑器工作室6.0 /****************************************************************************************************************
    
    #include <MSP4S.h>
    
    void Board_Init(void);
    void RTC_Init(void);
    void EnterLPM35(void);
    void WakeUpLPM35(void);
    
    volatile unsigned I;
    
    INT MAIN (void)
    {
    WDTCTL = WDTPW | WDTHOLD; //停止WDT
    
    //确定我们是从LPMx.5还是定期重置。
    如果(SYSRSTIV == SYSRSTIV_LPM5WU)
    {
    //当从3.5 唤醒时,重新连接
    WakeUpLPM35(); // LPMx.5唤醒特定初始化代码
    __enable_interrupit(); // RTC中断应立即触发...
    同时(1); //从RTC ISR返回后永久循环
    。}
    否则
    {
    //初始化主板和RTC,然后输入3.5
    Board_Init(); // GPIO和CS的常规初始化代码
    rtc_Init(); // RTC_B的常规初始化代码
    EnterLPM35(); //此函数不会返回。
    }
    }
    
    void Board_Init(void)
    {//
    端口配置
    P1OUT =0;
    P1DIR = 0xFF;
    
    P2OUT =0;
    P2DIR = 0xFF;
    
    P3OUT =0;
    P3DIR = 0xFF;
    
    P4OUT = 0;
    P4DIR = 0xFF;
    
    P5OUT = 0;
    P5DIR = 0xFF;
    
    P6OUT = 0;
    P6DIR = 0xFF;
    
    P7OUT = 0;
    P7DIR = 0xFF;
    
    P8OUT = 0;
    P8DIR = 0xFF;
    
    P9OUT = 0;
    P9DIR = 0xFF;
    
    P10OUT = 0;
    P10DIR = 0xFF;
    
    PJOUT = 0x00;
    PJSEL0 |= BIT4 | BIT5;
    PJDIR = 0xFFFF;
    
    //禁用GPIO开机默认高阻抗模式以激活
    //先前配置的端口设置
    PM5CTL0 &=~LOCKLPM2 5;
    
    //设置时钟
    CSCTL0_H = CSKEY >> 8; //解锁CS寄存器
    CSCTL1 = DCOFSEL_0; //将DCO设置为1MHz
    CSCTL2 = LAST__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;//设置ACLK = XT1;MCLK = DCO
    CSCTL3 = DIVA__1 | DIVM__1 | DIVM__1; //将所有分禾器设置为1
    CSCTL4 &=~LFxTOFF; //启用LFXT1
    DO
    {
    CSCTL5 &=~LFxTOFFG; //清除XT1故障标志
    SFRIFG1 &=~OFIFG;
    } While (SFRIFG1 & OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0; //锁定CS寄存器
    }
    
    void RTC_Init(void)
    {//
    配置RTC_C
    RTCCTL0_H = RTCKEY_H; //解锁RTC密钥保护寄存器
    RTCCTL0_L = RTCTEVIE; //为每分钟启用RTC事件中断
    RTCCTL1 = RTCBCD | RTCHOLD | RTCMODE | RTCTEV__MIN;// BCD模式,RTC保持,RTC模式
    RTCYEAR = 0x2011; // Year = 0x2011
    RTCMON = 0x10; //月= 0x10 =十月
    RTCDAY = 0x07; //天= 0x07 =第7
    次RTCDOW = 0x05; //星期几= 0x05 =星期五
    RTCHOUR = 0x11; //小时= 0x11
    RTCMIN = 0x59; //分钟= 0x59
    RTCSEC = 0x30; // seconds = 0x30
    
    RTCCTL1 &=~RTCHOLD; //启动RTC日历模式
    RTCCTL0_H =0; //锁定RTC密钥保护寄存器
    }
    
    void EnterLPM35(void)
    {
    PMMCTL0_H = PMMPW_H; //用于写入
    PMMCTL0_L的开放式PMM寄存器|| PMMREGOFF; //并设置PMMREGOFF
    
    //在启用中断的情况下进入3.5 模式。 请注意,此操作不
    返回//。 3.5 会通过重置事件退出,从而
    导致//重新启动代码。
    __bis_sr_register(LPM4_bits | GIE);
    }
    
    void WakeUpLPM35 (void)
    {//
    恢复端口设置
    P1OUT = 0x00;
    P1DIR = 0xFF;
    P2OUT = 0x00;
    P2DIR = 0xFF;
    P3OUT = 0x00;
    P3DIR = 0xFF;
    P4OUT = 0x00;
    P4DIR = 0xFF;
    PJOUT = 0x00;
    PJSEL0 || BIT4 | BIT5;
    PJDIR = 0xFF;
    
    //重新配置/启动RTC
    RTCCTL0_H = RTCKEY_H; //解锁RTC密钥保护寄存器
    RTCCTL0_L || RTCTEVIE; //为每分钟
    启用RTC事件中断RTCCTL1 = RTCBCD | RTCHOLD | RTCTEV__MIN;// BCD模式,RTC保持
    RTCCTL1 &=~RTCHOLD;
    RTCCTL0_H =0; //锁定RTC密钥保护寄存器
    
    //禁用GPIO通电默认高阻抗模式以激活
    //先前配置的端口设置。 这也将重新激活RTC
    //设置。
    PM5CTL0 &=~LCKLPM5;
    
    //恢复时钟,以便将RTC读取
    CSCTL0_H = CSCKEY >> 8; //解锁CS寄存器
    CSCTL1 = DCOFSEL_0; //将DCO设置为1MHz
    CSCTL2 = LAST__LFXTCLK | SELS__DCOCLK | SELM__DCOCLK;//设置ACLK = XT1;MCLK = DCO
    CSCTL3 = DIVA__1 | DIVM__1 | DIVM__1; //将所有分禾器设置为1
    CSCTL4 &=~LFxTOFF; //启用LFXT1
    DO
    {
    CSCTL5 &=~LFxTOFFG; //清除XT1故障标志
    SFRIFG1 &=~OFIFG;
    }同时(SFRIFG1&OFIFG); //测试振荡器故障标志
    CSCTL0_H = 0; //锁定CS寄存器
    }
    
    #if defined(__TI_Compiler_version__)|| defined(__IAR_SYSTEMS _ICC__)
    #pragma vector=RTC_vector
    __interrupt void RTC_ISR(void)
    #Elif defined(__GNU__)
    void __attribute__((interrupt (RTC_vector)) ISR_void)
    #elle_error!
    
    #endif
    {
    switch (__偶 数_in_range(RTCIV, RTCIV_RTCOFIFG)){
    案例RTCIV_NONE:中断;
    案例RTCIV_RTCRDYIFG:中断;
    案例RTCIV_RTCTEVIFG:
    P1OUT |= BIT0; //打开LED
    中断;
    案例RTCIV_RTCAIFG:中断;
    案例RTCIV_RT0PSIFG:中断;
    案例RTCIV_RT1PSIFG:中断;
    CASE RTCIV_RTCOFIFO:中断;
    }
    } 

    此致,

    冬季游

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

    您好,Jent,

    此外,我认为 MSP430FR58xx,MSP430FR59xx和MSP430FR6xx系列用户指南(修订版 o) 可能会对您有所帮助。 1.4 .3.1 Enter LPMx.5  and LPMX.5 and 3.2  Exit and Wake Up from 3.5 (从1.4 退出和唤醒)一节介绍了使用3.5 的细节操作。

    此致,

    冬季游

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢Winter!
    我发现原因是PM5CTL0 &=~LOCKLPM5;。 如果我在初始化系统时钟之前设置PM5CTL0 &=~LOCKLPM2 5,则我的程序正常。

    此致
    Jent