你好下面是我使用的程序,我使用单步调试时发现它一直在检查XT1 fault flag的do while循环中出不来。后来我把 do while那段程序注释掉时,只有在波特率是43000和38400时才能进入接收中断,但是接收的数据是乱的, 如我在接收中断中发UCA0TXBUF = 0xa时, 调试助手接收到的是80 78;UCA0TXBUF = 0xc时,调试助手显示00 00。请问为什么在do while跳不出来?波特率为什么是43000才能进入接收中断但是数据还是乱的?谢谢!
#include <msp430.h>
void main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
// Setup P1.2 UCA0RXD, P1.3 UCA0TXD
P1SEL |= BIT2 | BIT3; // Set P1.2, P1.3 to non-IO
P1DIR |= BIT2 | BIT3; // Enable UCA0RXD, UCA0TXD
// Setup LFXT1
UCSCTL6 &= ~(XT1OFF); // XT1 On
UCSCTL6 |= XCAP_3; // Internal load cap
// Loop until XT1 fault flag is cleared
do
{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
} while (SFRIFG1 & OFIFG); // Test oscillator fault flag
// Setup eUSCI_A0
UCA0CTLW0 |= UCSWRST; // **Put state machine in reset**
UCA0CTLW0 |= UCSSEL_2; // SMCLK
UCA0BRW_L = 6; // 1MHz 9600 (see User's Guide)
UCA0BRW_H = 0; // 1MHz 9600
UCA0MCTLW = UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0x13,
// over sampling
UCA0CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(LPM0_bits | GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}
// USCI_A0 interrupt service routine
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch (__even_in_range(UCA0IV, 4))
{
case USCI_NONE: break; // No interrupt
case USCI_UART_UCRXIFG: // RXIFG
while (!(UCA0IFG & UCTXIFG)) ; // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case USCI_UART_UCTXIFG: break; // TXIFG
case USCI_UART_UCSTTIFG: break; // TTIFG
case USCI_UART_UCTXCPTIFG: break; // TXCPTIFG
default: break;
}
}