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.
用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]