zoukankan      html  css  js  c++  java
  • msp430学习笔记-USART

    本文引用:http://bbs.ednchina.com/BLOG_ARTICLE_3013784.HTM

     MSP430F149有两个USART通讯端口,其性能完全一样,每个通讯口可通过RS232和RS485等芯片转换,与之相应的串行接口电路通讯。MSP430F149支持串行异步和同步通讯,每种方式都具有独立的帧格式和独立的控制寄存器。



                               
     USART异步通信
    MSP430串行异步通信模式通过两个引脚:接收引脚URXD和发送引脚UTXD与外界相连。异步帧格式由一个起始位,7或8个数据位,校验位(奇/偶/无),1个地址位,和1或2个停止位。从最低位开始发送和接收。异步模式下,传送数据以字符为单位。
     
    在异步模式下,USART支持两种多机模式,即线路空闲和地址位多机模式。
    (1)线路空闲多机模式:
     
    在这种模式下,数据块被空闲时间分隔。在字符的第一个停止位之后,收到10个以上的1则标识检测到接收线路空闲,如果采用两位停止位,则第二个停止位被认为是空闲周期的第一个标志。空闲周期后的第一个字符是地址字符。当接收到的字符是地址字符时,RXWAKE置位,并送入接收缓存。
    (2)地址位多机模式
     
     
    在这种模式下,字符包含一个附加的位作为地址标志。数据块的第ige字符带有一个置位的地址位,用以表明该字符是一个地址。
     
    波特率的产生:
        在异步串行通信中,波特率是哼重要的指标,定义为每秒钟传送二进制数码的位数。波特率反映了异步串行通信的速度。波特率部分由时钟输入选择和分频,波特率发生器,调整器和波特率寄存器等组成。
    下面是波特率发生器的框图:
     
    分频因子N由送到分频计数器的时钟(BRCLK)频率和所需的波特率来决定:
      N=BRCLK/波特率
    分频因子定义如下:
     N=UBR+(M7+M6+M5+M4+M3+M2+M1+M0)/8
     
    中断:
    USART模块有接收和发送两个独立的中断源。使用两个独立的中断向量,一个用于接收中断时间,一个用于发送中断事件。USART模块的中断控制位在特殊的功能寄存器中。
     USART0
     特殊功能寄存器 接收中断控制位  发送中断控制位 
     IFG1 接收中断标志URXIFG0  发送中断标志 UTXIFG0
     IE1 接收中断使能URXIE0  发送中断使能UTXIE0 
     ME1 接收允许URXE0  发送允许UTXE0 
    MSP430F149有USART0和USART1两个通信硬件模块,因此有两套寄存器。
     
    一次正确的USART模块初始化应该是这样的顺序:
    (1)先在控制位SWRST=1(默认)的情况下设置串口
    (2)然后设置SWRST=0;
     (3)最后如果需要中断,则设置相应的中断使能
     
    例程:MCU不停向PC发送数据,在屏幕上显示0-127对应的ASCII字符。数据格式无奇偶校验,8位数据位,1个停止位,波特率115200.
     
    #include "io430.h"
    #define uchar unsigned char
    #define uint unsigned int
    void InitSys()
    {
       uint iq0;
     
    //使用XT2振荡器
       BCSCTL1&=~XT2OFF;      //打开XT2振荡器
       do
       {
      IFG1 &= ~OFIFG; // 清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
      }
      while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
     
      BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2,四分频
     
    }
    void delay(void);
    void PutString(uchar *ptr);
    void main( void )
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      InitSys();
      uchar value=0;
      //以下是串口设置
      P3SEL|=0XC0;                 //P3.6,7选为USART0收发端
      P3DIR|=0x40;                 //P3.6为输出
      ME2|=UTXE1+URXE1;           // 使能USART0的接收和发送
      UCTL1|=CHAR;                //8-bit
      UTCTL1|=SSEL1;              //UCLK=SMCLK
      UBR01=0x45;                 //设置波特率32/2400=13.65
      UBR11=0x00;
      UMCTL1=0x049;
      UCTL1&=~SWRST;              //初始USART0状态机
      
      while(1)
      {
       while(!(IFG2&UTXIFG1));     //USART1发送缓冲器是否准备好
       TXBUF1=value++;
       value&=0x7f;                //保证value的数值小于128
       while(!(IFG2&UTXIFG1));
       TXBUF1=' ';                //发送换行符
       delay();
       }
    }
     
    void PutString(uchar *ptr)           //向PC机发送字符串
    {
     while(*ptr !='' )                  //不为字符串结束符
     {
      while(!(IFG2&UTXIFG1));
      TXBUF1=*ptr++;                     //发送数据
     }
    }
     
     
    void delay(void)
    {
      uchar i=20;
      uint j;
      while(i--)
      {
       j=2000;
       while(j--);
      }
     
     
    i
    例2:PC机想MSP430发送一个数据,+1在发回PC机
     
    #include "io430.h"
    #define uint unsigned int
    void delay();
    void InitSys()
    {
       uint iq0;
     
    //使用XT2振荡器
       BCSCTL1&=~XT2OFF;      //打开XT2振荡器
       do
       {
      IFG1 &= ~OFIFG; // 清除振荡器失效标志
      for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
      }
      while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
      BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT
    }
     
    void main( void )
     
    {
      // Stop watchdog timer to prevent time out reset
      WDTCTL = WDTPW + WDTHOLD;
      InitSys();
     
     //串口设置
      P3SEL|=BIT6+BIT7;      //P3.6,7=USART0 TXD,RXD
      P3DIR|=BIT6;
      ME2 |=URXE1+UTXE1; // 使能发送和接收
      UCTL1|=CHAR;       //8位
      U1TCTL=SSEL1;      //UCLK=SMCLK
      U1BR0 = 0x45;                             // 波特率115200
      U1BR1 = 0x00;                             //
      UMCTL1 = 0x49;                            // Modulation
      UCTL1&=~SWRST;     //usart模块初始化 
      IE2 |=URXIE1;      //社能接收中断
      for(;;)
     {   
       __bis_SR_register(LPM0_bits+GIE);
       while(!(IFG2&UTXIFG1));           //USART1发送缓冲器是否准备好
       TXBUF1=RXBUF1+1;                 //发送数据
       delay();  
     }
    }
     
    #pragma vector=UART1RX_VECTOR
    __interrupt void usart0_rx(void)
    {
     LPM0_EXIT;
    }
     
    void delay(void)
    {
     unsigned i=50000;
     while(i!=0)
     {i--;}
    }
  • 相关阅读:
    递归算法浅谈
    c语言中的位移位操作
    程序猿面试金典-数组和字符串
    很好的理解遗传算法的样例
    垂直搜索的相关知识点总结
    php单元測试
    Android中ExpandableListView控件基本使用
    几种代价函数
    ZJU-PAT 1065. A+B and C (64bit) (20)
    谷歌技术"三宝"之MapReduce
  • 原文地址:https://www.cnblogs.com/xubeiping0930/p/4451774.html
Copyright © 2011-2022 走看看