MSP430学习总结:UART串口通信详解

文章目录

  • 一、MSP430串口
  • 二、串口配置
  • 三、发送函数
  • 四、接收函数
  • 总结
  • 一、MSP430串口

    我用的这个单片机是MSP430F5529,这个单片机有两个串口,分别是USCI_A0和USCI_A1,以下是关于MSP430串口的配置以及接收函数和发送函数。

    二、串口配置

    说到串口,那肯定离不开起始位、数据位、校验位、停止位以及波特率。
    先来说一下常用的寄存器。
    串口控制寄存器0

    这个寄存器可以设置数据位,停止位和校验位等
    串口控制寄存器1

    这里可以设置时钟源和中断使能等
    波特率设置寄存器
    波特率设置涉及到三个寄存器UCA0BR,UCA0BR1,UCA0MCTL
    具体的设置方法在芯片手册上有写,也可以参考一下这位大佬的博客https://blog.csdn.net/weixin_27070451/article/details/112595854

    简单来说,波特率的设置分为两个模式,一个是低频模式(UCOS16=0),一个是过采样模式,我理解成高频模式(UCOS16=0),芯片默认是低频模式。UCOS16通过下面这个及寄存器设置在手册中还给出了一些常见的波特率设置例子。

    接收和发送寄存器


    把要发送的数据写入发送寄存器就可以发送出去,每次发送一个字节
    接收到的数据也会自动写入接收寄存器,每次接收一个字节

    下面就是串口配置的完整程序

    void USART0_Config(void)
    {
        //串口初始化
         P3SEL    |=  BIT3+BIT4 ;                        // P3.3,4 = USCI_A1 TXD/RXD
         UCA0CTL1 |=  UCSWRST;                      // **Put state machine in reset**
         UCA0CTL1 |=  UCSSEL__SMCLK;                     // SMCLK
         UCA0BR0   =  0x22;                         // 32768Hz 9600 波特率为115200
         UCA0BR1   =  0x00;                             // 32768Hz 9600
         UCA0MCTL |=  UCBRS_6 + UCBRF_0;           // Modulation UCBRSx=1, UCBRFx=0
         UCA0CTL1 &= ~UCSWRST;                   // **Initialize USCI state machine**
         UCA0IE   |=  UCRXIE;                       // Enable USCI_A1 RX interrupt 使能接收中断
         UCA0IFG  &=~UCRXIFG;//清除中断标志位
    }
    

    这段程序先是引脚复用了串口USCI_A0的发送和接收引脚,P3.3和P3.4。然后就是把串口设置位为软件复用,接着设置波特率,然后设置接收中断。
    下面来总结串口的设置步骤

  • 设置发送和接收IO作为引脚复用
  • 设置 UCA0CTL1 |= UCSWRST; 串口软件复位
  • 选择时钟源UCA0CTL1 |= UCSSEL__SMCLK;
  • 默认为数据位是8位,一位停止位,没有校验位
  • 设置波特率
  • 设置接收中断UCA0IE |= UCRXIE;
  • 三、发送函数

    前面已经提到过,只要把要发送的字节写入发送寄存器UCA0TXBUF,就可以实现发送字节,知道了这个就可以写出发送函数了。

    void send0_buf(unsigned char *ptr)    //发送字符串
    {
        while(*ptr != '\0')
        {
            while(!(UCA0IFG & UCTXIFG));
            UCA0TXBUF = *ptr;
            ptr++;
            delay_ms(10);
        }
    }
    

    其中while(!(UCA0IFG & UCTXIFG));是在判断发送完成标志位,也就是说看上一次发送是不是完成了,发完了才能发这一次的

    四、接收函数

    相对于发送函数,接收函数就显得很灵活了,我们要根据实际情况来写接收函数,前面也说到过,接收也是一个字节一个字节地接收,每个字节都会存放在UCA0RXBUF,但是大部分发过来的数据都不止一个字节,所以总体思路就是定义一个接收缓冲数组,在接收中断里面把每个字节都放在接收缓冲数组里面。下面是一个我用过的接收函数,以0x55和0x56作为帧头,先判断帧头是否正确,如果不正确,就直接接收下一个字节,如果是,就把收到的数据放在缓冲数组中,最后中断里面一定要记得清除中断标志位。

    #pragma vector = USCI_A0_VECTOR
    __interrupt void USCI_A0_ISR()
    {
        static int i=0;
                    if(UCA0IV==0x02) //接收到数据
        {
                        buff[i]=UCA0RXBUF;//把收到的数据放入缓冲数组中
                        if(buff[0]!=0x55)//如果第一个不是0x55就令i=0,无效数据
                            i=-1;
                        if(i==1&&(buff[1]!=0x56))//如果到第二个数据了不是0x56,也无效 重来。
                         i=-1;
                         if(i==9)//(识别到目标),且有11个数据了
                            {
                              for(i=0;i<8;i++)
                                  {
                                    Di[i]=buff[i+2];
                                   }
                                   i=-1;
                                  }
             UCA0IFG  &=~UCRXIFG;//清除中断标志位
            i++;
        }
    
    }
    

    总结

    今天关于MSP430的串口就写到这里,我觉得易错点在于波特率设置时的低频模式和过采样模式,其他的可以类比STM32来学习。如果有什么更好的理解或者思路,欢迎各位在评论区提出!
    学习是永无止境的,我们只需纯粹于理想,执着于当下。

    物联沃分享整理
    物联沃-IOTWORD物联网 » MSP430学习总结:UART串口通信详解

    发表评论