有以下问题:
1、__bis_SR_register(CPUOFF + GIE);
LPM0;
这个两个语句是否等效?
LPM0 是仅仅进入低功耗模式,但是没有开全局中断吗?
能否提供跟低功耗模式相关的所有宏定义?
2、我使用了两个模块 TimerA0 和 USCI,每隔1s USCI(配置成IIC,中断发送数据)发送一次数据,如何在两个中断期间转换低功耗模式?两个模块的中断能否同时开启?
进入timer低功耗时,需要关闭USCI中断吗?同理,进入USCI中断时,关闭Timer中断?
发送完数据 进入timer中断
CCTL0 |= CCIE; 先开启定时中断
__bis_SR_register(CPUOFF + GIE); 进入定时模式
CCTL0 &= ~CCIE; 关闭定时器中断
3、USCI 如何通过中断发送数据?我的有点问题
//硬件IIC 中断方式
USCI_I2C_Init();
IE2 |= UCB0TXIE; // Enable TX interrupt
PTxData = u8MCP_Con;
TXByteCtr = 6;
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
while(1)
{
PTxData = UCB0_TX;
TXByteCtr = 2;
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
delay_ms(1000);
/*time_cnt = 0;
IE2 &= ~UCB0TXIE;
CCTL0 |= CCIE;
__bis_SR_register(CPUOFF + GIE);
CCTL0 &= ~CCIE;
IE2 |= UCB0TXIE;*/
TXByteCtr = 2;
PTxData = &UCB0_TX[2];
while (UCB0CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ interrupts
delay_ms(1000);
/*time_cnt = 0;
IE2 &= ~UCB0TXIE;
CCTL0 |= CCIE;
__bis_SR_register(CPUOFF + GIE);
CCTL0 &= ~CCIE;
IE2 |= UCB0TXIE;*/
}
return 0;
}
// USCI_B0 Data ISR
#pragma vector = USCIAB0TX_VECTOR
__interrupt void USCIAB0TX_ISR(void)
{
if (TXByteCtr) // Check TX byte counter
{
UCB0TXBUF = *PTxData++; // Load TX buffer
TXByteCtr--; // Decrement TX byte counter
}
if (TXByteCtr)
{
UCB0CTL1 |= UCTXSTP; // I2C stop condition
IFG2 &= ~UCB0TXIFG; // Clear USCI_B0 TX int flag
__bic_SR_register_on_exit(CPUOFF); // Exit LPM0
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
CCR0 += 50000; // Add Offset to CCR0
time_cnt++;
if(time_cnt >= 20)
{
time_cnt = 0;
__bic_SR_register_on_exit(CPUOFF);
}
}