qq_18292553
qq_18292553
采纳率0%
2015-12-11 10:59 阅读 3.6k

关于MSP430F5529单片机的串口问题

3

一句话,我要疯了,,现在的问题是,使用的串口调试助手来调试的,开发环境从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条回答 默认 最新

  • devmiao devmiao 2015-12-11 12:36
  • qq_17695469 追风丶少年 2015-12-11 14:26

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

    点赞 1 评论 复制链接分享
  • abcd_123457 abcd_123457 2016-01-10 05:25

    这是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启动框架的工程,上传的工具和软件根据自己多年的工作经验自己编写的。

    点赞 评论 复制链接分享

相关推荐