新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 USART 串口通信操作寄存器+庫函數

        stm32 USART 串口通信操作寄存器+庫函數

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

        本文引用地址:http://www.104case.com/article/201611/318194.htm

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 红原县| 沈阳市| 崇文区| 西贡区| 柯坪县| 车致| 休宁县| 淮滨县| 榕江县| 沽源县| 南平市| 长泰县| 灵石县| 九江县| 浑源县| 称多县| 定日县| 邹平县| 仪征市| 玛沁县| 茶陵县| 清流县| 台东县| 合江县| 阜平县| 德保县| 彩票| 宾阳县| 松桃| 宁化县| 汕尾市| 五台县| 诏安县| 崇左市| 温泉县| 建宁县| 嵊泗县| 商河县| 社旗县| 鸡西市| 南乐县|