关于MSP430F5529单片机的串口问题 3C

一句话,我要疯了,,现在的问题是,使用的串口调试助手来调试的,开发环境从IAR低版本到高版本以及CCS,程序是官方程序和自己编写的,以及网友的。板子是标准板,还有个自己的板子。USB转串口线两条。但是结果都一样。
主要是使用串口调试助手发送字符串,然后接收相同的。结果是,如果我发较长的字符串,前四位会丢失。单个发送字符,根本没有任何返回信息。我简直要疯了,真的不知道原因了,期待大神拯救啊
代码如下:
#include

int main(void)
{

WDTCTL = WDTPW + WDTHOLD; // Stop WDT

P3SEL = BIT3+BIT4; // P3.4,5 = USCI_A0 TXD/RXD
UCA0CTL1 |= UCSWRST; // Put state machine in reset
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 1MHz 9600 (see User's Guide)
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRS_0 + UCBRF_13 + UCOS16; // Modln UCBRSx=0, UCBRFx=0,
// over sampling
UCA0CTL1 &= ~UCSWRST; // Initialize USCI state machine
UCA0IE |= UCRXIE; // Enable USCI_A0 RX interrupt
P4OUT=0;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, interrupts enabled
__no_operation(); // For debugger
}

// Echo back RXed character, confirm TX buffer is ready first
#pragma vector=USCI_A0_VECTOR
interrupt void USCI_A0_ISR(void)
{
switch(
even_in_range(UCA0IV,4))
{
case 0:break; // Vector 0 - no interrupt
case 2: // Vector 2 - RXIFG
while (!(UCA0IFG&UCTXIFG)); // USCI_A0 TX buffer ready?
UCA0TXBUF = UCA0RXBUF; // TX -> RXed character

break;

case 4:break; // Vector 4 - TXIFG
default: break;
}
}

3个回答

qq_18292553
qq_18292553 这个我用过了,没成功
4 年多之前 回复

当读入的数据长短小于端口最大长度时,那些没有用到的位会被视零。

这是msp430f5310,串口的初始化流程,都是一个系列的,如果没问题的话估计寄存器都是一样的。仅供参考。

 void InitUart(void)
{
    //初始化gpio
    P4SEL |= 0x30;
    P4DIR &= ~0x30;
    PMAPKEYID = PMAPKEY;
    PMAPCTL = 0x2;
    P4MAP45 = 0xB0C;

    //----------------------------------------------------------------
    //2014/07/20 19:12:47
    UCA1CTL1 |= 0x1;//

    UCA1CTL0 = 0x0;
    UCA1CTL1 |= 0x80;//smclk
    //----------------------------------------------------------------
    //2014/07/21 11:16:21
    //UCOS16 =1表示对输入源频率先进行16分频,然后在与波特率进行计算。
    //4M 9600 -->UCBRX = 26,UCBRSX = 0,UCBRFX = 1 
    ////UCBRx = 109, UCBRFx = 0, UCBRSx = 2, UCOS16 = 0
    UCA1BR0 = 109;
    UCA1BR1 = 0;
    //        UCOS16 UCBRSx    UCBRFx
    UCA1MCTL = 4;//1 | (0 << 1) | (0 << 4);

    UCA1CTL1 &= ~0x1;//

    UCA1IE = 0x1;
}
void put(char c)
{
    //If interrupts are not used, poll for flags
    if(!(UCA1IE & 0x2))
        //Poll for transmit interrupt flag
        while(!(UCA1IFG & 0x2));

    UCA1TXBUF = c;
}
void puts(char *data,unsigned long len)
{
    unsigned long i;
    for(i = 0; i < len;i++)
        put(data[i]);
}
#pragma vector=USCI_A1_VECTOR
__interrupt void USCI_A1_ISR(void)
{
    char rv;
    switch(UCA1IV)
    {
        //Vector 2 - RXIFG
    case 2:
        rv = UCA1RXBUF;
        UCA1TXBUF = rv;
        break;
    default: break;
    }
}

本人上传资源中有嵌入式编程相关的辅助工具,如果有意的可以下载使用,以及arm启动框架的工程,上传的工具和软件根据自己多年的工作经验自己编写的。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问