[問題] 無法進入UART RX的Interrupt, 可以請大家幫忙看一下嗎? 謝謝

49 views
Skip to first unread message

Jed Kuo

unread,
Oct 19, 2016, 12:12:22 PM10/19/16
to [LaunchPad互動裝置] TI MSP430 LaunchPad 使用者討論區
各位朋友大家好, 小弟最近在學習利用UART功能來和PC溝通, 網路上有找到範例程式如下, 但發現無法成功達到想要的目的(按任何鍵都沒有觸發LED燈, 且按a也沒有送出字串來), 試了很久推測原因是沒有進到RX的Interrupt裡面 (USCI0RX_ISR), 希望大家可以幫忙試試看, 是否有跑出來, 或著是有發現是哪邊有問題可以幫忙解惑一下, 感謝大家的幫忙, 謝謝!

PS: baud rate: 115200/ 電腦是win10的, 不知道有沒有關係

#include <msp430g2553.h>

#define TXLED BIT0
#define RXLED BIT6
#define TXD BIT2
#define RXD BIT1

const char string[] = { "Hello World\r\n" };
unsigned int i; //Counter

int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
DCOCTL = 0; // Select lowest DCOx and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P2DIR |= 0xFF; // All P2.x outputs
P2OUT &= 0x00; // All P2.x reset
P1SEL |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1SEL2 |= RXD + TXD ; // P1.1 = RXD, P1.2=TXD
P1DIR |= RXLED + TXLED;
P1OUT &= 0x00;
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 0x08; // 1MHz 115200
UCA0BR1 = 0x00; // 1MHz 115200
UCA0MCTL = UCBRS2 + UCBRS0; // Modulation UCBRSx = 5
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE; // Enable USCI_A0 RX interrupt
__bis_SR_register(CPUOFF + GIE); // Enter LPM0 w/ int until Byte RXed
while (1)
{ }
}

#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
P1OUT |= TXLED;
UCA0TXBUF = string[i++]; // TX next character
if (i == sizeof string - 1) // TX over?
UC0IE &= ~UCA0TXIE; // Disable USCI_A0 TX interrupt
P1OUT &= ~TXLED; }

#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
P1OUT |= RXLED;
if (UCA0RXBUF == 'a') // 'a' received?
{
i = 0;
UC0IE |= UCA0TXIE; // Enable USCI_A0 TX interrupt
UCA0TXBUF = string[i++];
}
P1OUT &= ~RXLED;
}

Message has been deleted

Jed Kuo

unread,
Nov 2, 2016, 10:31:23 PM11/2/16
to [LaunchPad互動裝置] TI MSP430 LaunchPad 使用者討論區
已經發現問題:
LaunchPad的baud rate最高只能到9600. 調整baud rate後就可以正常運作, 謝謝!

Jed Kuo於 2016年10月20日星期四 UTC+8上午12時12分22秒寫道:
Reply all
Reply to author
Forward
0 new messages