This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430F5438 uart串口通信,进入不了接收中断

用F5438uart串口与电脑通信,uart发送采用查询方式,接收采用中断方式,时钟选为MCLK=18.432MHz,波特率9600.

出现的情况如下:F5438发送数据到电脑,电脑上串口调试器收到的数据正确,电脑发送数据给F5438,在F5438串口的Rx端用示波器观测到数据,

但是一直没接收数据,采用单步调试,发现程序一直未进入接收中断。问题何在呢?

一直不是很清楚,请高手帮忙。

#include "msp430x54x.h"

 #include <stdlib.h>

#include <stdio.h>

 #include <string.h>

char  RXBuffer=0x00;

void UTX_PROC(char *tx_buf);

 int RxNo=0;

void Init_CLK(void)

 {   WDTCTL     = WDTPW + WDTHOLD                            ; // 关看门狗  

 P5SEL     |= 0x0C                                       ; // 端口功能选择振荡器  

 UCSCTL6   &= ~XT2OFF                                    ; // 振荡器使能  

UCSCTL3   |= SELREF_2                                   ; // FLLref = REFO  

UCSCTL4   |= SELA_2                                     ; // ACLK=REFO,SMCLK=DCO,MCLK=DCO  

 do   {     UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志                                                           

   SFRIFG1 &= ~OFIFG                                     ;  

 }while(SFRIFG1&OFIFG)                                   ; // 检测振荡器错误标志  

UCSCTL6   |= XT2DRIVE0 + XT2DRIVE1                      ; // XT2 驱动模式 24~32MHz                                             

 UCSCTL4   |= SELS_5 + SELM_5                            ; // SMCLK = MCLK = XT2

}

void Init_Port(void)

{     P1DIR |=BIT4;                   //LED--D1,D2,D3   

 P1OUT = 0xff;                           //P11 输出0,D1 LED亮

}

void Init_Uart()

 {        

 P5SEL |=BIT6+BIT7;        

 P5DIR |=BIT6;        //  P5.6/7/功能选择为UART1  //       P5DIR&=~BIT7;                                

 UCA1CTL1  = UCSWRST;     // 复位uart1状态机 (test)  

UCA1CTL0 |= UCMODE_0;      //低位在前发送,8位数据,1位停止位,uart模式

 UCA1CTL1 |= UCSSEL_1;               //选择UCLK = MCLK  //

UCA1BR0   = 0x02  ; // 选择UCLK = MCLK=18.432MHz        

 UCA1MCTL |=UCOS16;  //允许过采样        

 UCA1BR0 =0x78;     // 波特率9600,18.432*1000000/9600=1920, 1920/16=120        

UCA1BR1   =0x00     ;

 UCA1CTL1 &=~UCSWRST ; // UART1状态机使能        

UCA1IE |=UCRXIE; //接收中断

        }

void main()

{   Init_CLK();  

 Init_Port();  

 Init_Uart();  

  for(;;)  

{              

 if (RXBuffer==0xff)      

 {         UTX_PROC("5438")                            ;    

     __delay_cycles(500000);    

 P1OUT = 0xff;                           //P11 输出0,D1 LED亮    

 __delay_cycles(10240000);         

P1OUT = 0x00;                           //P11 输出0,D1 LED亮  

   __delay_cycles(10240000);

   RXBuffer=0;             }    

              }

}

void UTX_PROC(char *tx_buf)

{   unsigned char i,length                                           ;  

 length = strlen(tx_buf)                                          ;

  for(i=0;i<length;i++)  

 {     UCA1TXBUF = *tx_buf++                                          ; 

    while (!(UCA1IFG&UCTXIFG))                                     ;  

 }

 }

//UART1中断服务程序

#pragma vector=USCI_A1_VECTOR

__interrupt void USCI_A1_ISR(void)

 {   switch(__even_in_range(UCA1IV,4))  

 {     case 0: break;                          // Vector 0 - no interrupt    

 case 2:                                 // Vector 2 - RXIFG           

RXBuffer      = UCA1RXBUF                                 ;

      break                                                        ;    

 case 4: break;                          // Vector 4 - TXIFG    

 default: break;   }

}

  • Jiejie Dai 说:

    UCA1CTL1 |= UCSSEL_1;               //选择UCLK = MCLK  //

    UCA1BR0   = 0x02  ; // 选择UCLK = MCLK=18.432MHz

    i其中:UCA1CTL1 |= UCSSEL_1;               //选择UCLK = MCLK  //UCA1BR0   = 0x02  ; // 选择UCLK = MCLK=18.432MHz

    两句改为UCA1CTL1 |= UCSSEL_3;

  • 已解决,忘了开中断了。

    Jiejie Dai 说:

    UCA1CTL1 |= UCSSEL_1;               //选择UCLK = MCLK  //

    UCA1BR0   = 0x02  ; // 选择UCLK = MCLK=18.432MHz

    i其中:UCA1CTL1 |= UCSSEL_1;               //选择UCLK = MCLK  //UCA1BR0   = 0x02  ; // 选择UCLK = MCLK=18.432MHz

    两句改为UCA1CTL1 |= UCSSEL_3;

    [/quote]

  • 自己动手,丰衣足食啊。

    还是得仔细检查,在一个就是在线调试。