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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > stm32 USART 串口通信操作寄存器+庫函數(shù)

          stm32 USART 串口通信操作寄存器+庫函數(shù)

          作者: 時間:2016-11-19 來源:網(wǎng)絡(luò) 收藏
          串口通信雖然在如今的電腦上使用的越來越少,因為其在通信速率,距離已經(jīng)不適應(yīng)pc的要求,取而代之的是USB口。但是在嵌入式領(lǐng)域,USART仍然廣泛運用著。
          stm32的最多可以提供5路串口,有分數(shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通信、具有DMA等。使用USART時,stm32的I/O口經(jīng)RS232電平轉(zhuǎn)換電路 和電腦的串口連接。
          串口使用只需要開始串口時鐘,設(shè)置相應(yīng)的I/O口模式,配置波特率、數(shù)據(jù)位長度、奇偶校驗位等信息就可以使用了。
          我使用了三種方式使用串口通信,只可以開啟一項:
          • USART通過使用printf()函數(shù)發(fā)送信息;
          • USART和上位機通信,接收到數(shù)據(jù)后原數(shù)據(jù)輸出;
          • USART主動發(fā)送數(shù)據(jù)。
          操作寄存器
          串口的復(fù)位是通過配置APB2RSTR 寄存器的第14位,當(dāng)外設(shè)出現(xiàn)故障時,可以通過復(fù)位寄存器復(fù)位,在系統(tǒng)初始化時,都會執(zhí)行復(fù)位操作。
          串口的波特率設(shè)置是在USART_BRR寄存器上, 實際上這個寄存器配置的是波特比率的分頻觸發(fā)因子的值,波特率是一秒鐘通過的字符,而波特比率是一秒鐘通過的二進制位數(shù),所以設(shè)置了波特率需要經(jīng)過一段算法處理 ,得出特定時鐘下,實現(xiàn)這個波特率的,時鐘分頻值。
          串口控制寄存器有3個 USART_CR1~3,常用到的就是USART_CR1,各位描述如下:
          UE:USART使能 (USART enable)
          M:字長 (Word length)該位定義了數(shù)據(jù)字的長度,0:一個起始位,8個數(shù)據(jù)位,n個停止位;
          1:一個起始位,9個數(shù)據(jù)位,n個停止位。 n由USART_CR2中設(shè)置。
          WAKE:喚醒的方法 (Wakeup method) 0:被空閑總線喚醒; 1:被地址標記喚醒。
          PCE:檢驗控制使能 (Parity control enable)
          PS:校驗選擇 (Parity selection) 0:偶校驗;1:奇校驗。
          PEIE:PE中斷使能 (PE interrupt enable)
          TXEIE:發(fā)送緩沖區(qū)空中斷使能 (TXE interrupt enable)
          TCIE:發(fā)送完成中斷使能 (Transmission complete interrupt enable)
          RXNEIE:接收緩沖區(qū)非空中斷使能 (RXNE interrupt enable)
          IDLEIE:IDLE中斷使能 (IDLE interrupt enable) 0:禁止產(chǎn)生中斷;1:當(dāng)USART_SR中的IDLE為’1’時,產(chǎn)生USART中斷。
          TE:發(fā)送使能 (Transmitter enable)
          RE:接收使能 (Receiver enable)
          RWU:接收喚醒 (Receiver wakeup) 0:接收器處于正常工作模式;1:接收器處于靜默模式。
          注意:1.在把USART置于靜默模式(設(shè)置RWU位)之前,USART要已經(jīng)先接收了一個數(shù)據(jù)字節(jié)。否則在靜默模式下,不能被空閑總線檢測喚醒。
          2.當(dāng)配置成地址標記檢測喚醒(WAKE位=1),在RXNE位被置位時,不能用軟件修改RWU位。
          SBK:發(fā)送斷開幀 (Send break)
          數(shù)據(jù)的發(fā)送和接收是在USART_DR來實現(xiàn)的,這是一個雙寄存器,包含了TDR和RDR,當(dāng)向該寄存器寫入數(shù)據(jù)時,串口就會自動發(fā)送數(shù)據(jù);當(dāng)收到數(shù)據(jù)時,也是存在該寄存器內(nèi)中,可以直接讀出。該寄存器只有低9位有效(8:0),其他位都是保留的。

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

          串口狀態(tài)是通過狀態(tài)寄存器USART_SR讀取的,各位描述如下:
          TXE:發(fā)送數(shù)據(jù)寄存器空 (Transmit data register empty)
          當(dāng)TDR寄存器中的數(shù)據(jù)被硬件轉(zhuǎn)移到移位寄存器的時候,該位被硬件置位。如果USART_CR1寄存器中的TXEIE為1,則產(chǎn)生中斷。對USART_DR的寫操作,將該位清零。
          0:數(shù)據(jù)還沒有被轉(zhuǎn)移到移位寄存器;
          1:數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到移位寄存器。
          TC:發(fā)送完成 (Transmission complete)
          當(dāng)包含有數(shù)據(jù)的一幀發(fā)送完成后,并且TXE=1時,由硬件將該位置’1’。如果USART_CR1中的TCIE為’1’,則產(chǎn)生中斷。由軟件序列清除該位(先讀USART_SR,然后寫入USART_DR)。TC位也可以通過寫入’0’來清除,只有在多緩存通訊中才推薦這種清除程序。
          RXNE:讀數(shù)據(jù)寄存器非空 (Read data register not empty)
          當(dāng)RDR移位寄存器中的數(shù)據(jù)被轉(zhuǎn)移到USART_DR寄存器中,該位被硬件置位,表示已經(jīng)接收到了數(shù)據(jù)。如果USART_CR1寄存器中的RXNEIE為1,則產(chǎn)生中斷。對USART_DR的讀操作可以將該位清零。RXNE位也可以通過寫入0來清除,只有在多緩存通訊中才推薦這種清除程序。
          直接操作寄存器代碼如下:(system.h 和stm32f10x_it.h等相關(guān)代碼參照stm32 直接操作寄存器開發(fā)環(huán)境配置)
          User/main.c
          view source
          #endif



          評論


          技術(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); })();