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.
工具/软件: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
感谢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”。
您好,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 的细节操作。
此致,
冬季游