使用MSP430F5438A微控制器通过UART发送数据

时间:2016-06-13 13:24:54

标签: serial-port microcontroller uart msp430 iar

我将以下代码烧录到设备上,该设备基本上通过微控制器的UCA0串行模块在每次中断时发送一个0xc5字符。出于某种原因,当我在示波器上观察到引脚3.4时,我看不到输出。

    #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 个答案:

答案 0 :(得分:0)

我找到了答案,我想回到这里。

第二段代码完美无缺。我只是通过将UCA0BR0的值从0x03增加到100来降低波特率:

    UCA0BR0 = 100;

我现在可以在3.4针的示波器上看到输出。

对于那些新手(像我一样),UCA0BR0的值是通过将时钟频率(在我的情况下为32KHz)除以你想要达到的波特率来计算的:

    32000 / 9600 = 3.33

UCA0BR1是UCA0BR0的溢出。由于这两个寄存器都是8位,因此我们可以在UCA0BR1的帮助下获得16位值。这有助于我们实现非常低的波特率。

以下代码完美无缺,输出英文字母(从ASCII 0x40开始),波特率为9600.可以使用引脚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);
      }
    }