大家好、感谢您花时间阅读我的问题。
我已经编写了一个同时使用定时器 B0和 RTC 的程序。 当主主体处于激活状态时、B0计时器假定只以1秒的间隔闪烁 LED。 我投了一个 while 循环、以使系统保持活动状态10秒。 在它退出 HOLD 后、它将禁用 TIMER_B0并启用 RTC。 然后、我启用低功耗模式、它将休眠11秒。 一旦它退出低功耗模式、RTC 被禁用并且 Timer_B0被重新启用。 它会重复。
#include
void initGpio (void);
unsigned int IIIII;
unsigned int my_seconds;
int main (void)
{
WDTCTL = WDTPW | WDTHOLD; //停止 WDT
my_seconds = 0;
initGpio(); //配置 GPIO
//初始化 XT1 32kHz 晶振
P2SEL1 |= BIT6 | BIT7; // P2.6~P2.7:晶振引脚
操作
{
CSCTL7 &=~(XT1OFFG | DCOFFG); //清除 XT1和 DCO 故障标志
SFRIFG1 &=~OFIFG;
} while (SFRIFG1和 OFIFG); //测试振荡器故障标志
_enable_interrupt (); // RTC 中断应立即触发...
RTCMOD=(10*32)-1;
RTCCTL = RTCSS_2 | RTCSR | RTCPS_7;
//配置 Timer_A
TB0CTL = TBSSEL_1 | CNTL_1 | MC_2 | ID_3 | TBCLR | TBIE; // ACLK、计数模式、清除 TBR、启用中断
while (1)
{
IIIII = 0;
while (IIIII < 10)
{}
TB0CTL &=~TBIE;
P1OUT &=~BIT0;
RTCCTL |= RTCSR | RTCIE;
P6OUT &=~BIT6;
bis_SR_register (LPM3_bits| GIE);
RTCCTL &=~RTCIE;
TB0CTL |= TBIE | TBCLR;
}
}
void initGpio(void){
P1DIR = 0xFF;P2DIR = 0xFF;P6DIR = 0xFF;
P1REN = 0xFF;P2REN = 0xFF;
P1OUT = 0x00;P2OUT = 0x00;P6OUT = 0x00;
//配置 GPIO
P1DIR |= BIT0;
P1OUT |= BIT0;
P6DIR |= BIT6;
P6OUT |= BIT6;
//禁用 GPIO 上电默认高阻抗模式
//激活先前配置的端口设置
PM5CTL0 &=~LOCKLPM5;
}
// Timer0_B3中断矢量(TBIV)处理程序
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector=TIMER0_B1_vector
_ interrupt void TIMER0_B1_ISR (void TI_B1_ISR)
(#TI_NOT_BIST_TRIB1)
(#TIMER0_B1)(void TI_TRIB1)(#TI_TRIB1)(TI_INCE_NOT_ERROR (TI_NOT_BIST_TRIB1)#TIMER0_NOT_VER_TRIB1)#TI_NOT_
#endif
{
switch (__evo_in_range (TB0IV、TB0IV_TBIFG))
{
案例 TB0IV_NONE:
中断; //无中断
案例 TB0IV_TBCCR1:
中断; // CCR1未使用
案例 TB0IV_TBCCR2:
中断; //未使用 CCR2
案例 TB0IV_TBIFG:
P1OUT ^= BIT0; //溢出
IIIII++;
my_seconds++;
中断;
默认值:
中断;
}
}
#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))) RTC_ISR (void 编译
器#else)#error!
#endif
{
switch (__evo_in_range (RTCIV、RTCIV_RTCIF))
{
案例 RTCIV_NONE:break; //无中断挂起
案例 RTCIV_RTCIF: // RTC 溢出
//在 P1.0上切换 LED
P6OUT ^= BIT6;
//TB0CTL ^= TBIE;
//将 P1OUT 值存储在备用存储器寄存器中
*(unsigned int *) BKMEM_BASE = P1OUT;
low_power_mode_off_in_exit ();
中断;
默认值: 中断;
}
}
这是问题、上面的代码只是我对实现双定时器、启用禁用过程的测试。 我已经将代码移到了实际程序中、我看到的是、在我第一次退出低功耗模式后、工作正常、我的系统重新启用 TIMER_B0并进行计数、但当它进入低功耗模式时、它会立即跳转到 ISR。 无延迟。
我检查了寄存器、RTCMOD 仍然显示15F (351或11秒)。 在第一次进入 lpm 之前和之后、寄存器之间没有差异。
第一个 LPM 之前
在第一个下午之后