本人做了一个F5438A的小板,然后用Launchpad的 /RST/TEST/VCC/TXD/RXD 飞线连接到F5438A的小板。已实现目前可以仿真、烧写,控制LED也没问题。
F5438A的UCA0TXD/UCA0RXD 连接到Launchpad的TXD和RXD,使用24M XT2再分频为12M,在波特率9600时,一切通讯正常,当波特率设置为115200时,当输出任何字符,PC端打印都是“0x3f”,且RXD不接收任何字符。求帮忙看看是什么问题。
以下是我的代码
void INIT_XT2(void)
{
SetVcoreUp(PMMCOREV_1);
SetVcoreUp(PMMCOREV_3); // Set VCore to 1.8MHz for 20MHz
P11DIR = BIT1+BIT2; // P11.1-2 to output direction
P11SEL |= BIT1+BIT2; // P11.1-2 to output SMCLK,MCLK
P5SEL |= 0x0C; // Port select XT2
UCSCTL6 &= ~XT2OFF; // Enable XT2
UCSCTL3 |= SELREF_2; // FLLref = REFO
// Since LFXT1 is not used,
// sourcing FLL with LFXT1 can cause
// XT1OFFG flag to set
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
// Loop until XT1,XT2 & DCO stabilizes
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
}while (SFRIFG1&OFIFG); // Test oscillator fault flag
UCSCTL6 &= ~XT2DRIVE0; // Decrease XT2 Drive according to
// expected frequency
UCSCTL4 |= SELS_5 + SELM_5; // SMCLK=MCLK=XT2
UCSCTL5 |= DIVM0 + DIVS0; //Div SMCLK/2 MCLK/2
}
void INIT_UCA0_UART(void)
{
P3SEL |= 0x30; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // **Put state machine in reset**
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 12MHz 115200 (see User's Guide)
UCA0BR1 = 0; // 12MHz 115200
UCA0MCTL |= UCBRS_0 + UCBRF_8 + UCOS16; // Modln UCBRSx=1, UCBRFx=0,
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}
void INIT_UCA1_UART(void)
{
P5SEL |= 0xC0; // P5.6,7 = USCI_A1 TXD/RXD
UCA1CTL1 |= UCSWRST; // **Put state machine in reset**
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 6; // 1MHz 9600 (see User's Guide)
UCA1BR1 = 0; // 1MHz 9600
UCA1MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; // Enable USCI_A0 RX interrupt
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
INIT_XT2(); // Init XT2
INIT_UCA0_UART();
__bis_SR_register(GIE); // interrupts enabled
P5DIR |= 0x01; // P5.0 LED
while (1) // Test P1.4
{
P5OUT ^= 0x01; // Toggle P5.0 using exclusive-OR
__delay_cycles(1000000);
while (!(UCA0IFG&UCTXIFG));
UCA0TXBUF='b';
}
__no_operation(); // For debugger
}
// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
switch(__even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character
break;
case 4:break; // Vector 4 - TXIFG
default: break;
}
}