各位无所不能的大神们,帮我看一下这个串口回显为啥不行。波特率这些都设置好了的,
//9600 低频模式
#include
// 函数使用前声明
void UART_init_port();
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= BIT3 +BIT4; //P3.3-----> TX P3.4 ---->RX
UART_init_port();
_bis_SR_register(LPM3_bits+GIE);
}
//函数名:UART_init_port
//函数功能:Baud = 9600,低频波特率模式
//函数说明:Baud参考时钟选择,Baud设置,调制器设置
//入口参数:无
//出口参数:无
// 注意例程:Baud = 9600,过采样波特率产生模式
void UART_init_port(void)
{
UCA0CTL1 |= UCSWRST;//复位寄存器,使得配置UCSI
UCA0CTL1 |= UCSSEL__ACLK;
UCA0BR0 =3;
UCA0BR1=0;
UCA0MCTL = UCBRS_3 + UCBRF_0;
UCA0CTL1 &= ~UCSWRST;
UCA0IE |= UCRXIE;//接收中断使能
}
//函数名:
// 函数功能:
// 函数说明:UCTXIFG:在USCI发送完成,自动置位。表示UCAxTXBUF已经准备好接收下一个字符
// 在将字符写入UCAxTXBUF中,UCTXIFG自动复位
// UCRXIFG:在每接收到一个字符并将其载入UCAxRXBUF时,将置位
// 当读取UCAxRXBUF中的值时,UCRXIFG自动复位
// 当UCAxTXBUF为空时:UCTXIFG置位
// 当UCAxTXBUF已经接收到一个完整的字符时:UCRXIFG置位
#pragma vector=UCSI_A0_VECTOR
interrupt void UCSI_A0_ISR(void)
{
switch(even_in_range(UCA0IV,4))
{
case 0: //无中断;
break;
case 2: //接收中断
while(!(UCA0IFG&UCTXIFG)); //UCAxTXBUF是否为空,不为空执行死循环,
// 直至为空(发送完成)
// UCA0RXBUF -----> UCA0TXBUF; 发送过程的伪代码
UCA0TXBUF = UCA0RXBUF; //串口回显
break ;
case 4: //发送中断
break;
default:
break;
}
}
More information,please add the weibo ID :_Tang辉,chat number :951141617
在低功耗后面加一个while(1); 本帖最后由 qwerghf 于 2017-3-5 11:40 编辑
只需要设置了波特率的参考时钟吧我觉得,系统时钟要配置吗?怎么配置呢?
More information,please add the weibo ID :_Tang辉,chat number :951141617
现在可以 发送接受了,但是为啥我无论发什么,串口回显都是这几个数呢?05 92 00 00 04 80 FE ED
More information,please add the weibo ID :_Tang辉,chat number :951141617
ACLK为时钟源的串口,跑9600的速度低,误差大,换2400可以
还是不行,刚才回显完全是偶然,现在我只想实现一个发送完成就亮灯提示,发现还是不行,说明是这个程序数据完全没有发送出去。
#include
// 函数使用前声明
void UART_init_port();
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P3SEL |= BIT3 +BIT4; //P3.3-----> TX P3.4 ---->RX
P1DIR |= BIT0;
P4DIR |= BIT7;
UART_init_port();
_bis_SR_register(GIE);
while(1);
}
//函数名:UART_init_port
//函数功能:Baud = 9600,低频波特率模式
//函数说明:Baud参考时钟选择,Baud设置,调制器设置
//入口参数:无
//出口参数:无
// 注意例程:Baud = 9600,过采样波特率产生模式
void UART_init_port(void)
{
UCA0CTL1 |= UCSWRST;//复位寄存器,使得配置UCSI
UCA0CTL1 |= UCSSEL_1;
UCA0BR0 =3;
UCA0BR1=0;
UCA0MCTL = UCBRS_3 + UCBRF_0;
UCA0CTL1 &= ~UCSWRST;
UCA0IE |= UCRXIE;//接收中断使能
}
//函数名:
// 函数功能:
// 函数说明:UCTXIFG:在USCI发送完成,自动置位。表示UCAxTXBUF已经准备好接收下一个字符
// 在将字符写入UCAxTXBUF中,UCTXIFG自动复位
// UCRXIFG:在每接收到一个字符并将其载入UCAxRXBUF时,将置位
// 当读取UCAxRXBUF中的值时,UCRXIFG自动复位
// 当UCAxTXBUF为空时:UCTXIFG置位
// 当UCAxTXBUF已经接收到一个完整的字符时:UCRXIFG置位
#pragma vector=UCSI_A0_VECTOR
interrupt void UCSI_A0_ISR(void)
{
switch(even_in_range(UCA0IV,4))
{
case 0: //无中断;
break;
case 2: //接收中断
//{
while(!(UCA0IFG&UCTXIFG)); //UCAxTXBUF是否为空,不为空执行死循环,
// 直至为空(发送完成)
// UCA0RXBUF -----> UCA0TXBUF; 发送过程的伪代码
//UCA0TXBUF = UCA0RXBUF; //串口回显
//if(UCA0RXBUF==0x31)
P1OUT ^= BIT0;
P4OUT ^=BIT7;
//}
break ;
case 4: //发送中断
break;
default:
break;
}
}
More information,please add the weibo ID :_Tang辉,chat number :951141617