2016-06-13 89 views
0

我將以下代碼燒錄到基本上通過微控制器的UCA0串行模塊在每次中斷時發送0xc5字符的器件上。出於某種原因,當我在示波器上觀察引腳3.4時看不到輸出。使用MSP430F5438A微控制器通過UART發送數據

#include "msp430x54xA.h" 

    void main(void) 
    { 
     WDTCTL = WDTPW + WDTHOLD;     // Stop WDT 
     //P3IN = 0x08;        // P3.5 RXD input 
     P3OUT = 0x10;        // P3.4 TXD output 
     P3SEL = 0x30;        // P3.4,5 = USCI_A0 TXD/RXD 
     UCA0CTL1 |= UCSWRST;      // **Put state machine in reset** 
     UCA0CTL1 |= UCSSEL_1;      // CLK = ACLK 
     UCA0BR0 = 0x03;       // 32kHz/9600=3.41 (see User's Guide) 
     UCA0BR1 = 0x00;       // 
     UCA0MCTL = UCBRS_3+UCBRF_0;    // Modulation UCBRSx=3, UCBRFx=0 
     UCA0CTL1 &= ~UCSWRST;      // **Initialize USCI state machine** 
     UCA0IE |= UCRXIE;       // Enable USCI_A0 RX interrupt 

     __bis_SR_register(LPM3_bits + GIE);  // Enter LPM3, interrupts enabled 
     __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) 
    { 
     UCA0TXBUF = 0xc5; 
    } 

的代碼是這裏的代碼稍加修改的版本:https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/166345

爲什麼我看不到相應的引腳輸出?

編輯以添加新的代碼,而不必中斷:

#include "msp430x54xA.h" 

    void main(void) 
    { 
     WDTCTL = WDTPW + WDTHOLD;     // Stop WDT 
     //P3IN = 0x08;        // P3.5 RXD input 
     P3OUT = 0x10;        // P3.4 TXD output 
     P3SEL = 0x30;        // P3.4,5 = USCI_A0 TXD/RXD 
     UCA0CTL1 |= UCSWRST;      // **Put state machine in reset** 
     UCA0CTL1 |= UCSSEL_1;      // CLK = ACLK 
     UCA0BR0 = 0x03;       // 32kHz/9600=3.41 (see User's Guide) 
     UCA0BR1 = 0x00;       // 
     UCA0MCTL = UCBRS_3+UCBRF_0;    // Modulation UCBRSx=3, UCBRFx=0 
     UCA0CTL1 &= ~UCSWRST;      // **Initialize USCI state machine** 

     while (1) { 
     UCA0TXBUF = 0xc5; 
     __delay_cycles(25000000); 
     } 
    } 

從數據表中使用的寄存器的總結:

UCSI Register description

+1

什麼你在做什麼來提高中斷? –

+3

,直到你有它的工作不使用中斷。一次走一步,在跑步之前走路。首先嚐試TX,只是爆炸的東西。確認你有正確的設置/速度。然後從一個愚蠢的終端tx,看到rx通過回顯它的作用。然後輪詢中斷並清除它並完全理解它,最後將中斷啓用到內核中。 –

+0

你有什麼部分完成? –

回答

0

我發現這個問題的答案,我想回到這裏。

第二個代碼塊完美地工作。我剛剛通過的UCA0BR00x03值增加至100降低波特率:

UCA0BR0 = 100; 

我現在可以看到銷3.4示波器上的輸出。

對於那些新本(像我一樣),UCA0BR0的值由波特率除以時鐘頻率(在我的情況32KHz的)計算要實現:

32000/9600 = 3.33 

UCA0BR1是UCA0BR0溢出。由於這兩個寄存器都是8位,所以藉助UCA0BR1我們可以得到一個16位的值。這有助於我們實現非常低的波特率。

下面的代碼可以完美運行,並在9600輸出波特率(從ASCII 0x40的開始)輸出的英文字母可以在引腳3.4使用FTDI電纜中讀出:

#include "msp430x54xA.h" 

    void main(void) 
    { 
     WDTCTL = WDTPW + WDTHOLD;  // Stop WDT 

     P3SEL |= 0x30;     // P3.4,5 = USCI_A0 TXD/RXD 
     UCA0CTL1 |= UCSWRST;   // **Put state machine in reset** 
     UCA0CTL1 |= UCSSEL_1;   // CLK = ACLK 
     UCA0BR0 = 3;     // 32kHz/9600=3.33 (see User's Guide) 
     UCA0BR1 = 0;     // overflow of UCA0BR0 comes here 
     UCA0MCTL = UCBRS_3+UCBRF_0; // Modulation UCBRSx=3, UCBRFx=0 
     UCA0CTL1 &= ~UCSWRST;   // **Initialize USCI state machine** 

     int i=0; 

     while (1) { 
     while (!(UCA0IFG & UCTXIFG)); // wait for USCI_A0 TX buffer to ready 
     UCA0TXBUF = 0x40+i; 
     ++i; 
     __delay_cycles(2500000); 
     } 
    } 
+0

在答案代碼塊中,「UCA0BR0」和「UCA0BR1」未更改。 – HeadCode

+0

是的,因爲3是以9600波特發送的UCA0BR0的值。將其增加到100只會幫助在示波器上讀取它(基本上用於調試目的)。另一個重要的事情是'while(!(UCA0IFG&UCTXIFG));'等待TX緩衝區就緒。跳過它會導致問題。 –