2016-06-13 91 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缓冲区就绪。跳过它会导致问题。 –