<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > msp430單片機(jī)之串口通信模塊

          msp430單片機(jī)之串口通信模塊

          作者: 時(shí)間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          串口通信

          單片機(jī)串口通信模塊在單片機(jī)中起到重要作用,通過串口它可以與PC機(jī)或者其他模塊進(jìn)行通信,傳輸數(shù)據(jù)或者控制命令,當(dāng)然在傳輸數(shù)據(jù)的時(shí)候我們必須有一定的協(xié)議,讓通信雙方能夠知道得到的數(shù)據(jù)是什么,所以我們必須設(shè)置一種格式,讓通信雙方能夠得到正確的數(shù)據(jù)信息,首先我們從整體上來看看這個(gè)模塊的結(jié)構(gòu),下圖是msp430單片機(jī)中的串口模塊:

          本文引用地址:http://www.ex-cimer.com/article/201611/318293.htm

          從上圖中我們可以看出串口模塊可以分為4部分:控制模塊,接收模塊,發(fā)送模塊,波特率控制模塊

          這些模塊有相應(yīng)的寄存器,我們的主要任務(wù)就是對這些寄存器進(jìn)行相關(guān)的配置,接下來就詳細(xì)介紹這些寄存器的作用。

          1.控制寄存器UXCTL (X為數(shù)字,不同型號的產(chǎn)品包含的串口模塊也不同,有些只有一個(gè),有些可能包含多個(gè))

          我們來看看每一位的作用吧

          PENA:校驗(yàn)允許位(0禁止,1允許)

          PEV :奇偶校驗(yàn)位,該位在校驗(yàn)允許時(shí)有效(0奇校驗(yàn),1偶校驗(yàn))

          SPB :停止位選擇,決定發(fā)送的停止位,但接收時(shí)接收器只檢測1位停止位(0 1位停止位,1 2位停止位)

          CHAR:發(fā)送數(shù)據(jù)長度(0 7位,1 8位)

          LISTEN:反饋信號

          SYNC:模塊的模式選擇(0UART模式(異步),1 SPI模式(同步)

          MM :多機(jī)模式選擇(0線路空閑多機(jī)協(xié)議,1 地址為多機(jī)協(xié)議)

          SWRST:控制位,上電時(shí)改位置位,一次正確的模塊初始化過程應(yīng)該是:先在SWRST = 1時(shí)設(shè)置,設(shè)置完串口后再設(shè)置SWRST = 0,最后如需中斷,再設(shè)置中斷使能。

          2.發(fā)送和接收控制寄存器

          發(fā)送控制寄存器主要是控制時(shí)鐘源的選擇等其他控制,而接受控制寄存器主要是一些標(biāo)志位,判斷時(shí)候出錯(cuò),溢出,中斷標(biāo)志等,具體內(nèi)容見相關(guān)數(shù)據(jù)手冊

          3.波特率發(fā)生器控制模塊

          這個(gè)模塊有3個(gè)寄存器,兩個(gè)寄存器用作波特率選擇,一個(gè)用于調(diào)整(UxBR0和UxBR1用于選擇波特率,UxMCTL用于調(diào)整)

          4接收和發(fā)送數(shù)據(jù)緩存

          URXBUF和UTXBUF這兩個(gè)寄存器用于存放接收和發(fā)送的數(shù)據(jù)。

          整個(gè)模塊大概就是這些內(nèi)容了,那么怎么編寫發(fā)送和接收的程序呢?

          一般地,接收過程使用中斷方式(因?yàn)椴恢朗裁磿r(shí)候會(huì)接收到數(shù)據(jù),這樣效率高),發(fā)送采用查詢方式。

          串口通信模塊的設(shè)置步驟如下:

          1.設(shè)置系統(tǒng)時(shí)鐘源

          2.設(shè)置串口模塊

          3.處理接收發(fā)送過程

          下面是一個(gè)簡單的程序,該程序?qū)崿F(xiàn)的功能是從PC機(jī)接收數(shù)據(jù),然后單片機(jī)又將接收的數(shù)據(jù)原封不動(dòng)的發(fā)送給PC機(jī)。

          #include


          #define CPU_F ((double)8000000)
          #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
          #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


          #define uchar unsigned char
          #define uint unsigned int
          #define ulong unsigned long


          /*當(dāng)BRCLK=CPU_F時(shí)用下面的公式可以計(jì)算,否則要根據(jù)設(shè)置加入分頻系數(shù)*/
          #define baud 9600 //設(shè)置波特率的大小
          #define baud_setting (uint)((ulong)CPU_F/((ulong)baud)) //波特率計(jì)算公式
          #define baud_h (uchar)(baud_setting>>8) //提取高位
          #define baud_l (uchar)(baud_setting) //低位


          //*
          // 系統(tǒng)時(shí)鐘初始化
          //*
          void Clock_Init()
          {
          uchar i;
          BCSCTL1&=~XT2OFF; //打開XT振蕩器
          BCSCTL2|=SELM1+SELS; //MCLK為8MHZ,SMCLK為8MHZ
          do{
          IFG1&=~OFIFG; //清除震蕩標(biāo)志
          for(i=0;i<100;i++)
          _NOP(); //延時(shí)等待
          }
          while((IFG1&OFIFG)!=0); //如果標(biāo)志為1,則繼續(xù)循環(huán)等待
          IFG1&=~OFIFG;
          }
          //*
          // MSP430內(nèi)部看門狗初始化
          //*
          void WDT_Init()
          {
          WDTCTL = WDTPW + WDTHOLD; //關(guān)閉看門狗
          }


          //*
          // MSP430串口初始化
          //*
          void UART_Init()
          {
          U0CTL|=SWRST; //復(fù)位SWRST
          U0CTL|=CHAR; //8位數(shù)據(jù)模式
          U0TCTL|=SSEL1; //SMCLK為串口時(shí)鐘
          U0BR1=baud_h; //BRCLK=8MHZ,Baud=BRCLK/N
          U0BR0=baud_l; //N=UBR+(UxMCTL)/8
          U0MCTL=0x00; //微調(diào)寄存器為0,波特率9600bps
          ME1|=UTXE0; //UART1發(fā)送使能
          ME1|=URXE0; //UART1接收使能
          U0CTL&=~SWRST;
          IE1|=URXIE0; //接收中斷使能位

          P3SEL|= BIT4; //設(shè)置IO口為普通I/O模式
          P3DIR|= BIT4; //設(shè)置IO口方向?yàn)檩敵?br /> P3SEL|= BIT5;
          }


          //*
          // 串口0發(fā)送數(shù)據(jù)函數(shù)
          //*


          void Send_Byte(uchar data)
          {
          while((IFG1&UTXIFG0)==0); //發(fā)送寄存器空的時(shí)候發(fā)送數(shù)據(jù)
          U0TXBUF=data;
          }


          //*
          // 處理來自串口 0 的接收中斷
          //*


          #pragma vector=UART0RX_VECTOR
          __interrupt void UART0_RX_ISR(void)
          {
          uchar data=0;
          data=U0RXBUF; //接收到的數(shù)據(jù)存起來
          Send_Byte(data); //將接收到的數(shù)據(jù)再發(fā)送出去
          }


          //*
          // 處理來自串口 0 的發(fā)送中斷,預(yù)留
          //*


          #pragma vector=UART0TX_VECTOR
          __interrupt void UART0_TX_ISR(void)
          {


          }


          //*
          // 主函數(shù)
          //*
          void main(void)
          {
          WDT_Init(); //看門狗設(shè)置
          Clock_Init(); //系統(tǒng)時(shí)鐘設(shè)置
          UART_Init(); //串口設(shè)置初始化
          _EINT(); //開中斷
          while(1) //無限循環(huán)
          {
          }
          }

          得到的結(jié)果如下:

          串口部分到此為止,這只是簡單的設(shè)置,在后續(xù)的學(xué)習(xí)中必然會(huì)用到串口傳輸復(fù)雜的數(shù)據(jù)進(jìn)行處理,這里先打個(gè)基礎(chǔ)。



          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();