你好!
按照MSP430F673x_672x的示范代码:MSP430F673X_USCIA0_UART_04.c
#include <msp430.h>
int 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
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A0_VECTOR))) USCI_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
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;
}
}
我仅仅把串口1换成了串口2,然后就发现通讯不正常,最后把串口助手的波特率设为2400,就接收正确。
中断也能进去。发什么收什么。
我的代码:(我加了TA1定时中断,闪灯测试一秒钟闪两次)
//******************************************************************************
#include <msp430f6723.h>
int main(void)
{
WDTCTL = WDTPW | WDTHOLD; // Stop WDT
// Setup P2.2 UCA0RXD, P2.3 UCA0TXD
P2SEL |= BIT2 | BIT3; // Set P2.2, P2.3 to non-IO, Peripheral function select : 1
P2DIR |= BIT3; // Enable UCA2RXD, UCA2TXD 0: input for RxD, 1: output for TxD
P2DIR &= ~BIT2;
P5DIR |= 0x01; // Set P5.0 to output direction
// 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_A2
UCA2CTLW0 |= UCSWRST; // **Put state machine in reset** // UCSYNC
UCA2CTLW0 |= UCSSEL__SMCLK; // SMCLK
UCA2BRW_L = 1; // 1MHz 9600 (see User's Guide)
UCA2BRW_H = 0; // 1MHz 9600
UCA2MCTLW = UCBRF_11 | UCOS16 | 0x2500; // Modln UCBRSx=0, UCBRFx=0x13,
// over sampling
UCA2CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA2IE = UCRXIE; // Enable USCI_A2 RX interrupt
// Setup TA1
TA1CCTL0 = CCIE; // CCR0 interrupt enabled
TA1CCR0 = 65535;
TA1CTL = TASSEL_2 | MC_2 | TACLR; // SMCLK, contmode, clear TAR
//__bis_SR_register(GIE);
__bis_SR_register(LPM0_bits | GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}
// USCI_A0 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=USCI_A2_VECTOR
__interrupt void USCI_A2_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(USCI_A2_VECTOR))) USCI_A2_ISR (void)
#else
#error Compiler not supported!
#endif
{
P5OUT ^= 0x01;
switch (__even_in_range(UCA2IV, 2))
{
case USCI_NONE: break; // No interrupt
case USCI_UART_UCRXIFG: // RXIFG
while (!(UCA2IFG & UCTXIFG)) ; // USCI_A2 TX buffer ready?
UCA2TXBUF = UCA2RXBUF; // TX -> RXed character
break;
case USCI_UART_UCTXIFG: break; // TXIFG
case USCI_UART_UCSTTIFG: break; // TTIFG
case USCI_UART_UCTXCPTIFG: break; // TXCPTIFG
default: break;
}
}
// Timer1 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER1_A0_VECTOR))) TIMER1_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
P5OUT ^= BIT0; // Toggle P1.0
TA1CCR0 += 65535; // Add Offset to CCR0
}
示波器测试LED的频率使一个2Hz的脉冲。也就是说一秒钟中断了4次。
按照缺省SMCLK=1MHz, 定时器应该中断16次,差了这个正4倍。 确实和波特率差4倍对上了。
我Debug,启动外部32768LXT1语句都是过了的。
不知为何SMCLK不是1M,而是256K.
请忙我看看。