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

          新聞中心

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

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

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

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

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



          評(píng)論


          技術(shù)專(zhuān)區(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); })();