时钟设置为8M,串口可以发送数据,但是不能接收数据。
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//UCSCTL4 |= SELA_2;
UCSCTL3 = SELREF_2; //Set DCO FLL 参考REFO
UCSCTL4 &= ~(SELS_4+SELM_4);
UCSCTL4 |= SELA_4 + SELS_4 + SELM_4; //ACLk选择REFOCLK,SMCLK选择DCOCLKDIV,MCLK选择DCOCLKDIV
// Loop until XT1,XT2 & DCO stabilizes - In this case only DCO has to stabilize
do
{
UCSCTL7 &= ~(XT2OFFG | XT1LFOFFG | DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
__bis_SR_register(SCG0); // Disable the FLL control loop
UCSCTL1 = DCORSEL_5; // Select DCO range 16MHz operation DCORSEL_5;
UCSCTL2 |=243 ; // Set DCO Multiplier for 8MHz =243 ;
// (N + 1) * FLLRef = Fdco //DCOCLKDIV=8M DCOCLK=16M
// (243 + 1) * 32768 = 8MHz
__bic_SR_register(SCG0); // Enable the FLL control loop
// 32 x 32 x 8 MHz / 32,768 Hz = 250000 = SMCLK cycles for DCO to settle
__delay_cycles(250000);
P4SEL |= BIT5 | BIT4; // P4.5,4 = USCI_A0 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 =52; // 8MHz 9600 (see User's Guide)
UCA1BR1 = 0; // 8MHz 9600
UCA1MCTL =UCBRS_0| UCBRF_1 | UCOS16; //UCBRS_0| UCBRF_13 | UCOS16; // Modln UCBRSx=0, UCBRFx=0,
// over sampling
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE ; // Enable USCI_A0 RX interrupt
__bis_SR_register(GIE);
UCA1TXBUF=0x02;
while(1);
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch(__even_in_range(UCA1IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA1IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
break;
case 4:
break; // Vector 4 - TXIFG
default: break;
}
}
现在这样设置串口可以发送数据,但是不能接收数据,不能进中断。
如果要是更改串口时钟频率,比如
UCSCTL1 = DCORSEL_1; // Select DCO range 16MHz operation DCORSEL_5;
UCSCTL2 |=31 ;
时钟改为1M,串口UCA1BR0 ,UCA1BR1,UCA1MCTL也做相应设置 。就能够正常发数据和正常收数据。