有以下问题:
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);
}
}
kqian0327:
你好,
你可以在G2xx.h头文件发现如下定义:
#define LPM0 _bis_SR_register(LPM0_bits) /* Enter Low Power Mode 0 */
#define LPM0_bits (CPUOFF)
….
#define __bis_SR_register(x) _bis_SR_register(x)
所以回答你第一个问题,这两个语句不等效,一个多开了GIE全局中断,一个没有开。
相关定义在你main.c函数一看加的头文件#include "msp430g2302.h"里面。
使用在Main.c文件使用__bis_SR_register(CPUOFF + GIE)进入低功耗,在中断处理函数的第一句唤醒中断
:#define LPM0_EXIT _bic_SR_register_on_exit(LPM0_bits) /* Exit Low Power Mode 0 */
3.发送中断的含义是当模块发送完数据之后产生中断,发送数据是在main函数里面发,一旦发送就自动产生中断。如果你在发送中断里面发送数据,那么程序退出中断之后会进入下一个发送中断,程序一直在发送中断子函数内运行。
你可以尝试让程序跑起来,跑一段时间后在发送中断自函数内设断点,你会发现程序会停在你设置的断点位置。