msp430怎么使用uart双向接收与发送

2019-03-24 09:08发布

UCA0IE |= UCRXIE和UCA1IE |= UCTXIE中断要一起开开吗?这两个好像都是进入USCI_A0_VECTOR中断。

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
littleshrimp
1楼-- · 2019-03-24 11:34
< 发送中断每发送一个字节进入一次中断 接收中断每收到一个字节进入一次中断 在中断函数内可以判断是发送还是接收中断。 使用中断和轮寻都能实现双向发送和接收  具体取决于你的应用
qwerghf
2楼-- · 2019-03-24 14:15
 精彩回答 2  元偷偷看……
one55
3楼-- · 2019-03-24 17:00
littleshrimp 发表于 2016-7-22 07:32
发送中断每发送一个字节进入一次中断 接收中断每收到一个字节进入一次中断 在中断函数内可以判断是发送还是 ...

这是我写的uart发送与接收子函数,但不知道为什么一直不能用
//发送字符
void USCIA0_sendchar(unsigned char c)
{
        UCA0TXBUF=c;
        while(!(UCA0IFG & UCTXIFG));
        UCA0IFG &=~UCRXIFG;
}
//接收字符
void USCIA0_receivechar(void)
{
        unsigned char data = 0;
        while(!(UCA0IFG & UCRXIFG));
        UCA0IFG &=~UCRXIFG;
        UCA0TXBUF = UCA0TXBUF;
        return UCA0TXBUF;
}

#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
                USCIA0_receivechar();
                USCIA0_sendchar('a');

}
littleshrimp
4楼-- · 2019-03-24 21:38
one55 发表于 2016-7-22 14:44 这是我写的uart发送与接收子函数,但不知道为什么一直不能用 //发送字符 void USCIA0_sendchar(unsigne ...
你首先要把接收中断和发送中断区分开然后再做相应的处理
发送中断产生后一搬是判断你的发送数组(缓冲)里有没有待发的数据如果有继续发送
接收中断产生后一搬是读取一个字节追加到你的接收数组(缓冲)中当满足某一条件后对接收数组里的数据做相应的处理

这是MSP430G2553的UART例程,你可以参考下

//******************************************************************************

//   MSP430G2xx3 Demo - USCI_A0, Ultra-Low Pwr UART 9600 String, 32kHz ACLK

//

//   Description: This program demonstrates a full-duplex 9600-baud UART using

//   USCI_A0 and a 32kHz crystal.  The program will wait in LPM3, and will

//   respond to a received 'u' character using 8N1 protocol. The response will

//   be the string 'Hello World'.

//   ACLK = BRCLK = LFXT1 = 32768Hz, MCLK = SMCLK = DCO ~1.2MHz

//   Baud rate divider with 32768Hz XTAL @9600 = 32768Hz/9600 = 3.41

//* An external watch crystal is required on XIN XOUT for ACLK *//

//

//                MSP430G2xx3

//             -----------------

//         /||              XIN|-

//          | |                 | 32kHz

//          --|RST          XOUT|-

//            |                 |

//            |     P1.2/UCA0TXD|------------>

//            |                 | 9600 - 8N1

//            |     P1.1/UCA0RXD|<------------

//

//   D. Dang

//   Texas Instruments Inc.

//   February 2011

//   Built with CCS Version 4.2.0 and IAR Embedded Workbench Version: 5.10

//******************************************************************************

#include <msp430.h>

 

const char string1[] = { "Hello World " };

unsigned int i;

 

int main(void)

{

  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT

  P1DIR = 0xFF;                             // All P1.x outputs

  P1OUT = 0;                                // All P1.x reset

  P2DIR = 0xFF;                             // All P2.x outputs

  P2OUT = 0;                                // All P2.x reset

  P1SEL = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

  P1SEL2 = BIT1 + BIT2 ;                     // P1.1 = RXD, P1.2=TXD

  P3DIR = 0xFF;                             // All P3.x outputs

  P3OUT = 0;                                // All P3.x reset 

  UCA0CTL1 |= UCSSEL_1;                     // CLK = ACLK

  UCA0BR0 = 0x03;                           // 32kHz/9600 = 3.41

  UCA0BR1 = 0x00;                           //

  UCA0MCTL = UCBRS1 + UCBRS0;               // Modulation UCBRSx = 3

  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**

  IE2 |= UCA0RXIE;                          // Enable USCI_A0 RX interrupt

 

  __bis_SR_register(LPM3_bits + GIE);       // Enter LPM3 w/ int until Byte RXed

}

 

#pragma vector=USCIAB0TX_VECTOR

__interrupt void USCI0TX_ISR(void)

{

  UCA0TXBUF = string1[i++];                 // TX next character

 

  if (== sizeof string1 - 1)              // TX over?

    IE2 &= ~UCA0TXIE;                       // Disable USCI_A0 TX interrupt

}

 

#pragma vector=USCIAB0RX_VECTOR

__interrupt void USCI0RX_ISR(void)

{

  if (UCA0RXBUF == 'u')                     // 'u' received?

  {

    i = 0;

    IE2 |= UCA0TXIE;                        // Enable USCI_A0 TX interrupt

    UCA0TXBUF = string1[i++];

  }

}

 

one55
5楼-- · 2019-03-24 22:14
 精彩回答 2  元偷偷看……
one55
6楼-- · 2019-03-25 00:19
qwerghf 发表于 2016-7-22 07:56
UCA0IE |=  UCTXIE+UCRXIE;中断函数中判断标志位,根据标志位进行发送接收处理

开了UCTXIE和UCRXIE中断后,他们各自的中断向量是什么?

一周热门 更多>

相关问题

    相关文章