我正在使用MSP430F2274,并试图更好地理解低功耗模式的使用。
在我的程序中,我还使用了SimplicTi API,以便两个设备(一个是AP,由另一个ED连接)进行通信。
AP -接入点,它是,也是,通过UART连接到PC上,以便从用户那里获得一个字符串。
ED端设备,只需与AP (使用SimplicTi协议)并等待来自它的消息。
我想确保我理解低功耗模式的使用,并看看它是如何与SimplicTi API“一起来的”。
AP的“流程”如下(在“链接”到教育署之后,请参见下面的代码):
#pragma vector = USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
// **A)** extract the "RXed" character (8 bits received from user) , use the while
// in order to be sure all the 8 bits are "desirialized" into a byte
while (!(IFG2 & UCA0RXIFG));
input_char = UCA0RXBUF; // input_char is global variable.
// **B)** if we received the "Enter" character , which indicates the
// end of the string
if(input_char == '\r' && input_count > 0)
{
TACCR0 = 10; // **F)**
TACTL = TASSEL_1 + MC_1; // ACLK, up mode
// **E)** Enter LPM3, interrupts enabled !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
__bis_SR_register(LPM3_bits + GIE);
}//end if Enter
// **C)** Any other char of the user's string when we
// have not got more than the maximum amount of bytes(chars)
else if (((FIRST_CHAR <= input_char && input_char <= LAST_CHAR) || ('a' <= input_char && input_char <= 'z')) && (input_count < INPUT_MAX_LENGTH))
{
input[input_count++] = input_char;
}
} //end of UART RX INTERRUPTTIMERA0中断处理程序是以下代码:
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
if (i == strlen(morse)) // **D)** morse is a global array of chars who holds the string that we wish to send
{
SMPL_Send(sLID[0], (uint8_t*)EOT, 1); // EOT is the last char to send
TACTL = MC_0; //disable TimerA0
}
else if (!letterSpace)
{
char ch = morse[i++];
SMPL_Send(sLID[0], (char*)ch, 1);
switch(ch)
{
case '.':
{
TACCR0 = INTERVAL * 3;
letterSpace = 1;
break;
}
case '-':
{
TACCR0 = INTERVAL * 3 * 3;
letterSpace = 1;
break;
}
} // switch
} // else if
} //end TIMERA0 interrupt handler 事情是这样的:
我使用TIMERA0处理程序来在不同数量的类型之后发送每个字节,不管字符被转换为"-“还是”a“。
为此,我相应地将计时器设置为不同的值(“-”的值是“-”的3倍)。
最后,当我传输完整个字符串(D)时,我会禁用计时器。
注意:在AP代码开始时执行以下方法以配置UART:
void UARTinit()
{
P3SEL = 0x30; // P3.4 and P3.5 as the UART TX/RX pins: P3SEL |= BIT4 + BIT5;
UCA0CTL1 |= UCSSEL_2; // SMCLK
// pre scale 1MHz/9600 =~ 104.
UCA0BR0 = 104;
UCA0BR1 = 0;
// 8-bit character and Modulation UCBRSx = 1
UCTL0 |= CHAR;
UCA0MCTL = UCBRS0;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable UART INPUT interrupt
} // end of UARTinit所以我的问题是:
1)可以肯定的是,在A中,在中,我正在“轮询”UART的Rx缓冲区,它是合适的,还是对“任何情况”都有很好的实践,导致UART 处理程序在UART模块接收到整个字节(按照我的配置)后被调用?
( 2)在AP主程序中,最后一条指令是将其“放入”LPM0中的中断使能:__bis_SR_register(LPM0_bits + GIE);
LPM0的时间:
对于LPM3:
在我看来,我不能输入LPM3,因为AP需要SMCLK时钟而不是禁用?(因为UART使用它)这是正确的吗?
3)在F)中,调用TIMERA0处理程序是一种正确的方法吗?我查看了TACRR0 = 10,因为它是一个很小的值,定时器将“在任何时间内”到达,因此它将进入TIMERA0处理程序来执行发送字符串字节的任务。
4)对于AP中的“回退”:据我所见,“流”是这样的:
输入LPM0 (main) --> UART被插入-->退出LPM0并进入UART处理程序-->当它接收到字节(通常是5)时,它进入LPM3 ->计时器完成计数到TACRR0值( 10) -->当TIMERA0处理程序发送完最后一个字节时-->当TIMERA0处理程序发送完它的最后一个字节时->我们“回滚”到使我们在UART处理程序中的LPM3?->??
现在,??正在“回滚”到主程序内带我们到LPM0的指令,还是“待在这里”(在UART处理程序E中输入我们到LPM3的指令)?如果我们确实停留在E)上,我是否需要将它更改为LPM0原因,同样,UART使用的是SMCLK,它在LPM3中不活动,但在LPM0中确实是活动的?
5)任何其他评论将是超级的!
谢谢分配,盖伊。
发布于 2014-02-26 02:33:57
1)这是可行的
2)当您配置它时:
UCA0CTL1 |= UCSSEL_2; // SMCLK这意味着 UART 使用SMCLK,当您使MCU转向LPM3 3时,SMCLK将停止;这样UART将无法工作,因此应该配置UART使用ACLK,这将使UART在LPM3模式下工作。
3) .
4) .
5)见2
我希望这能帮到你
https://stackoverflow.com/questions/21726265
复制相似问题