最近在使用fr5992时,需要用到1200的波特率,根据文档设置完以后,发现串口接收不到任何数据,但是用官方的例程可以,说明硬件没有问题,不清楚哪里设置出了问题,源码如下,
#include <msp430fr5992.h>
char RecvBuf[20] = {0};
int dataLen = 0;
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
PM5CTL0 &= ~LOCKLPM5;
P2SEL1 &= ~( BIT5 + BIT6 );//TX,RX
P2SEL0 |= ( BIT5 + BIT6 );//TX,RX
UCA1CTLW0 |= UCSWRST; // **Put state machine in reset** UCA1CTLW0 |= UCSSEL__ACLK; // CLK = ACLK //Baudrate = 1200
//BRCLK BaudRate UCOS16 UCBRx UCBRFx UCBRSx(2) //32768 1200 1 1 11 0x25 UCA1BRW = 1;
UCA1MCTLW |= UCOS16 | UCBRF_11|0x2500; UCA1CTLW0 &= ~UCSWRST; // **Initialize USCI state machine**
UCA1IE |= UCRXIE; // Enable USCI_A1 RX interrupt
__bis_SR_register(GIE);
while(1)
_NOP();
return 0;
}
void Uart1_PutChar(char data)
{
while (!(UCA1IFG & UCTXIFG));
UCA1TXBUF = data;
}
/******************************************************************************
函数: void USCI_A1_ISR(void)
功能: 串口1中断处理函数
参数:返回值:
说明:
******************************************************************************/
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
switch( UCA1IV )
{
case 0:
break; // Vector 0 – no interrupt
case 2: // Vector 2 – RXIFG
{ dataLen = dataLen % 20;
RecvBuf[dataLen] = UCA1RXBUF; }
break;
case 4:
break; // Vector 4 – TXIFG
default: break; }
}
灰小子:
用这个工具http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSP430BaudRateConverter/index.html
Ruijie Li:
回复 灰小子:
可是我程序中的配置和那个工具算出来的参数是一致的
HG:
你在哪里看到的官方1200波特率的程序的,贴个链接呢
发送可以么?
Ruijie Li:
回复 HG:
我说的官方例程不是说1200波特率的例程,而是初始化时钟后的9600波特率的例程,我只是验证硬件没有问题。现在问题已经解决了,重新初始化了ACLK时钟源,按新的频率去设置波特率,不初始化时钟,示波器测量ACLK默认频率不是32768,而是37.6K左右。所以按照32768去设置波特率一直不对。