嵌入式系統(tǒng)設計(STM32)第5講_第1頁
嵌入式系統(tǒng)設計(STM32)第5講_第2頁
嵌入式系統(tǒng)設計(STM32)第5講_第3頁
嵌入式系統(tǒng)設計(STM32)第5講_第4頁
嵌入式系統(tǒng)設計(STM32)第5講_第5頁
已閱讀5頁,還剩72頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、第5講 USARTUSART: Universal Synchronous & Asynchronous Receiver and Transmitter STM32通用同步通用同步/異步收發(fā)器異步收發(fā)器n5.1 串行通信相關概念串行通信相關概念n5.2 STM32的通用串口結(jié)構(gòu)的通用串口結(jié)構(gòu)n5.3 串口相關寄存器串口相關寄存器n5.5 庫函數(shù)庫函數(shù)n5.6 程序設計舉例程序設計舉例5.1 串行通信相關概念串行通信相關概念n串行通信:串行通信: 串行通信是指在單根數(shù)據(jù)線上將數(shù)據(jù)一位一位地依次串行通信是指在單根數(shù)據(jù)線上將數(shù)據(jù)一位一位地依次傳送。發(fā)送過程中,每發(fā)送完一個數(shù)據(jù),再發(fā)送第二個

2、,傳送。發(fā)送過程中,每發(fā)送完一個數(shù)據(jù),再發(fā)送第二個,依此類推。接受數(shù)據(jù)時,每次從單根數(shù)據(jù)線上一位一位地依此類推。接受數(shù)據(jù)時,每次從單根數(shù)據(jù)線上一位一位地依次接受,再把它們拼成一個完整的數(shù)據(jù)。依次接受,再把它們拼成一個完整的數(shù)據(jù)。n在遠距離數(shù)據(jù)通信中,一般采用串行通信方式,它具有占在遠距離數(shù)據(jù)通信中,一般采用串行通信方式,它具有占用通信線少、成本低等優(yōu)點。用通信線少、成本低等優(yōu)點。同步和異步通信方式同步和異步通信方式 n同步串行通信同步串行通信方式是指在相同的數(shù)據(jù)傳送速率下,發(fā)送端和方式是指在相同的數(shù)據(jù)傳送速率下,發(fā)送端和接受端的通信頻率保持嚴格同步。接受端的通信頻率保持嚴格同步。 由于不需要使

3、用起始位和停止位,可以提高數(shù)據(jù)的傳輸速由于不需要使用起始位和停止位,可以提高數(shù)據(jù)的傳輸速率,但發(fā)送器和接受器的成本較高。率,但發(fā)送器和接受器的成本較高。n異步串行通信異步串行通信是指發(fā)送端和接受端在相同的波特率下不需是指發(fā)送端和接受端在相同的波特率下不需要嚴格地同步,允許有相對的時間時延,即收、發(fā)兩端的要嚴格地同步,允許有相對的時間時延,即收、發(fā)兩端的頻率偏差在頻率偏差在1010以內(nèi),就能保證正確實現(xiàn)通信。以內(nèi),就能保證正確實現(xiàn)通信。 異步通信在不發(fā)送數(shù)據(jù)時,數(shù)據(jù)信號線上總是呈現(xiàn)高異步通信在不發(fā)送數(shù)據(jù)時,數(shù)據(jù)信號線上總是呈現(xiàn)高電平狀態(tài),稱為空閑狀態(tài)(又稱電平狀態(tài),稱為空閑狀態(tài)(又稱MARKMA

4、RK狀態(tài))。當有數(shù)據(jù)發(fā)狀態(tài))。當有數(shù)據(jù)發(fā)送時,信號線變成低電平,并持續(xù)一位的時間,用于表示送時,信號線變成低電平,并持續(xù)一位的時間,用于表示發(fā)送字符的開始,該位稱為起始位(也稱發(fā)送字符的開始,該位稱為起始位(也稱SPACESPACE狀態(tài))。狀態(tài))。 起始位之后,在信號線上依次出現(xiàn)待發(fā)送的每一位字起始位之后,在信號線上依次出現(xiàn)待發(fā)送的每一位字符數(shù)據(jù),并且按照先低位后高位的順序逐位發(fā)送。待發(fā)送符數(shù)據(jù),并且按照先低位后高位的順序逐位發(fā)送。待發(fā)送的每個字符的位數(shù)可以在的每個字符的位數(shù)可以在5 5、6 6、7 7或或8 8位之間選擇。數(shù)據(jù)位位之間選擇。數(shù)據(jù)位的后面可以加上一位奇偶校驗位,也可以不加,由編

5、程指的后面可以加上一位奇偶校驗位,也可以不加,由編程指定。最后傳送的是停止位(高電平),一般選擇定。最后傳送的是停止位(高電平),一般選擇1 1位、位、1.51.5位或位或2 2位。位。數(shù)據(jù)傳送方式n單工方式。單工方式。單工方式采用一根數(shù)據(jù)傳輸線,只允許數(shù)據(jù)按單工方式采用一根數(shù)據(jù)傳輸線,只允許數(shù)據(jù)按照固定的方向傳送。照固定的方向傳送。n半雙工方式。半雙工方式。半雙工方式采用一根數(shù)據(jù)傳輸線,允許數(shù)據(jù)半雙工方式采用一根數(shù)據(jù)傳輸線,允許數(shù)據(jù)分時地在兩個方向傳送,但不能同時雙向傳送。分時地在兩個方向傳送,但不能同時雙向傳送。n全雙工方式。全雙工方式。全雙工方式采用兩根數(shù)據(jù)傳輸線,允許數(shù)據(jù)全雙工方式采用

6、兩根數(shù)據(jù)傳輸線,允許數(shù)據(jù)同時進行雙向傳送。同時進行雙向傳送。波特率波特率 n波特率是指每秒內(nèi)傳送二進制數(shù)據(jù)的位數(shù),以波特率是指每秒內(nèi)傳送二進制數(shù)據(jù)的位數(shù),以b/s和和bps(位(位/秒,秒,bit per second)為單位。它是衡量串行數(shù)據(jù)傳)為單位。它是衡量串行數(shù)據(jù)傳送速度快慢的重要指標和參數(shù)。送速度快慢的重要指標和參數(shù)。n計算機通信中常用的波特率是:計算機通信中常用的波特率是:110,300,600,1200,2400,4800,9600,19200bps。PC機串口通信流控制n這里講到的這里講到的“流流”,當然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個串口之當然指的是數(shù)據(jù)流。數(shù)據(jù)在兩個串口之間傳輸時間

7、傳輸時,常常會出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象常常會出現(xiàn)丟失數(shù)據(jù)的現(xiàn)象, 或者兩臺計算機的或者兩臺計算機的處理速度不同處理速度不同, 如臺式機與單片機之間的通訊如臺式機與單片機之間的通訊,接收端數(shù)據(jù)接收端數(shù)據(jù)緩沖區(qū)已滿緩沖區(qū)已滿,則此時繼續(xù)發(fā)送來的數(shù)據(jù)就會丟失。則此時繼續(xù)發(fā)送來的數(shù)據(jù)就會丟失。 n流控制能解決這個問題流控制能解決這個問題, , 當接收端數(shù)據(jù)處理不過來時當接收端數(shù)據(jù)處理不過來時, ,就就發(fā)出發(fā)出“不再接收不再接收”的信號的信號, ,發(fā)送端就停止發(fā)送發(fā)送端就停止發(fā)送, ,直到收到直到收到“可以繼續(xù)發(fā)送可以繼續(xù)發(fā)送”的信號再發(fā)送數(shù)據(jù)。因此流控制可以控的信號再發(fā)送數(shù)據(jù)。因此流控制可以控制數(shù)據(jù)傳輸?shù)倪M

8、制數(shù)據(jù)傳輸?shù)倪M 程程, ,防止數(shù)據(jù)的丟失。防止數(shù)據(jù)的丟失。nPC機中常用的兩種流控制是硬件流控制(包括機中常用的兩種流控制是硬件流控制(包括RTS/CTS、 DTR/DSR等)和軟件流控制等)和軟件流控制XON/XOFF(繼續(xù)(繼續(xù)/停止)停止) 硬件流控制硬件流控制 n硬件流控制常用的有硬件流控制常用的有RTS/CTS流控制和流控制和DTR/DSR(數(shù)據(jù)終端(數(shù)據(jù)終端就緒就緒/數(shù)據(jù)設置就緒)流控制。數(shù)據(jù)設置就緒)流控制。n硬件流控制必須將相應的電纜線連上硬件流控制必須將相應的電纜線連上,用用RTS/CTS(請求發(fā)送(請求發(fā)送/清除發(fā)送)流控制時清除發(fā)送)流控制時,應將通訊兩端的應將通訊兩端的

9、RTS、CTS線對應相連線對應相連,數(shù)據(jù)終端設備(如計算機)使用數(shù)據(jù)終端設備(如計算機)使用RTS來起始調(diào)制解調(diào)器或其來起始調(diào)制解調(diào)器或其它數(shù)據(jù)通訊設備的數(shù)據(jù)流它數(shù)據(jù)通訊設備的數(shù)據(jù)流,而數(shù)據(jù)通訊設備(如調(diào)制解調(diào)器)而數(shù)據(jù)通訊設備(如調(diào)制解調(diào)器)則用則用CTS來起動和暫停來自計算機的數(shù)據(jù)流。來起動和暫停來自計算機的數(shù)據(jù)流。n這種硬件握手方式的過程為:我們在編程時根據(jù)接收端緩沖這種硬件握手方式的過程為:我們在編程時根據(jù)接收端緩沖區(qū)大小設置一個高位標志(可為緩沖區(qū)大小的區(qū)大小設置一個高位標志(可為緩沖區(qū)大小的75)和一個)和一個低位標志(可為緩沖區(qū)大小的低位標志(可為緩沖區(qū)大小的25),當緩沖區(qū)內(nèi)數(shù)

10、據(jù)量達到當緩沖區(qū)內(nèi)數(shù)據(jù)量達到高位時高位時,我們在接收端將我們在接收端將CTS線置低電平(送邏輯線置低電平(送邏輯0),當發(fā)送當發(fā)送端的程序檢測到端的程序檢測到CTS為低后為低后,就停止發(fā)送數(shù)據(jù)就停止發(fā)送數(shù)據(jù),直到接收端緩沖直到接收端緩沖區(qū)的數(shù)據(jù)量低于低位而將區(qū)的數(shù)據(jù)量低于低位而將CTS置高電平。置高電平。RTS則用來標明接則用來標明接收設備有沒有準備好接收數(shù)據(jù)。收設備有沒有準備好接收數(shù)據(jù)。n常用的流控制還有還有常用的流控制還有還有DTR/DSR(數(shù)據(jù)終端就緒(數(shù)據(jù)終端就緒/數(shù)據(jù)設置就數(shù)據(jù)設置就緒)。我們在此不再詳述。緒)。我們在此不再詳述。 RS-232-CnRS-232-C是美國電子工業(yè)協(xié)會

11、是美國電子工業(yè)協(xié)會EIA(Electronic Industry Association)制定的一種串行物理接口標準。)制定的一種串行物理接口標準。RS是英文是英文“推薦標準推薦標準”的縮寫,的縮寫,232為標識號,為標識號,C表示修改次數(shù)。表示修改次數(shù)。 nRS-232-C標準規(guī)定的數(shù)據(jù)傳輸速率為標準規(guī)定的數(shù)據(jù)傳輸速率為50、75、100、150、300、600、1200、2400、4800、9600、19200、38400波特。波特。nRS-232-C標準規(guī)定,驅(qū)動器允許有標準規(guī)定,驅(qū)動器允許有2500pF的電容負載,的電容負載,通信距離將受此電容限制,例如,采用通信距離將受此電容限制,例

12、如,采用150pF/m的通信電的通信電纜時,最大通信距離為纜時,最大通信距離為15m;若每米電纜的電容量減小,;若每米電纜的電容量減小,通信距離可以增加。傳輸距離短的另一原因是通信距離可以增加。傳輸距離短的另一原因是RS-232屬屬單端信號傳送,存在共地噪聲和不能抑制共模干擾等問題,單端信號傳送,存在共地噪聲和不能抑制共模干擾等問題,因此一般用于因此一般用于20m以內(nèi)的通信。以內(nèi)的通信。 nEIA-RS-232C規(guī)定:在規(guī)定:在TxD和和RxD上,上, 邏輯邏輯1(MARK)=-3V-15V;邏輯;邏輯0(SPACE)=+3+15V 5.2 USART簡介簡介n通用同步異步收發(fā)器通用同步異步收

13、發(fā)器(USART)提供了一種靈活的方法與使用提供了一種靈活的方法與使用工業(yè)標準工業(yè)標準NRZ異步串行數(shù)據(jù)格式的外部設備之間進行全雙工異步串行數(shù)據(jù)格式的外部設備之間進行全雙工數(shù)據(jù)交換。數(shù)據(jù)交換。USART利用分數(shù)波特率發(fā)生器提供寬范圍的波特利用分數(shù)波特率發(fā)生器提供寬范圍的波特率選擇。率選擇。 n它支持同步單向通信和半雙工單線通信,也支持它支持同步單向通信和半雙工單線通信,也支持LIN(局部互局部互連網(wǎng)連網(wǎng)),智能卡協(xié)議,智能卡協(xié)議,IrDA (Infra Red Data Association,紅外數(shù)據(jù)組織)SIR ENDEC(Serial Infrared,串行紅外協(xié)議)規(guī)范,規(guī)范,以及調(diào)制

14、解調(diào)器以及調(diào)制解調(diào)器(CTS/RTS)操作。它還允許多處理器通信。操作。它還允許多處理器通信。使用多緩沖器配置的使用多緩沖器配置的DMA方式,可以實現(xiàn)高速數(shù)據(jù)通信。方式,可以實現(xiàn)高速數(shù)據(jù)通信??傊傊?,STM32F10 x系列芯片所提供的系列芯片所提供的USART串口功能十分強大,串口功能十分強大,基本上所有的串口功能,它都能通過硬件實現(xiàn)基本上所有的串口功能,它都能通過硬件實現(xiàn)USART模式配置。(模式配置。(X=支持,支持,NA=不支持)不支持)(STM32F103內(nèi)置內(nèi)置3個個USART和和2個個UART)STM32的的USART主要特性n全雙工的,異步通信全雙工的,異步通信 nNRZN

15、RZ(Not Return to Zero,不歸零碼,不歸零碼)標準格式)標準格式 n分數(shù)波特率發(fā)生器系統(tǒng)分數(shù)波特率發(fā)生器系統(tǒng)-發(fā)送和接收共用的可編程波特率,發(fā)送和接收共用的可編程波特率,最高達最高達4.5Mbits/s 4.5Mbits/s n可編程數(shù)據(jù)字長度可編程數(shù)據(jù)字長度(8(8位或位或9 9位位) ) n可配置的停止位。支持可配置的停止位。支持1 1或或2 2個停止位個停止位 n單線半雙工通信單線半雙工通信 n檢測標志。接收緩沖器滿、發(fā)送緩沖器空、傳輸結(jié)束標志。檢測標志。接收緩沖器滿、發(fā)送緩沖器空、傳輸結(jié)束標志。n四個錯誤檢測標志四個錯誤檢測標志n1010個帶標志的中斷源個帶標志的中斷

16、源 n USART功能概述:功能概述:n總線在發(fā)送或接收前應處于空閑狀態(tài)(高電平)總線在發(fā)送或接收前應處于空閑狀態(tài)(高電平) n一個起始位一個起始位 n一個數(shù)據(jù)字一個數(shù)據(jù)字(8(8或或9 9位位) ),最低有效位在前,最低有效位在前 n0.50.5,1.51.5,2 2個的停止位,由此表明數(shù)據(jù)幀的結(jié)束個的停止位,由此表明數(shù)據(jù)幀的結(jié)束 n使用分數(shù)波特率發(fā)生器使用分數(shù)波特率發(fā)生器-12-12位整數(shù)和位整數(shù)和4 4位小數(shù)的表示方法。位小數(shù)的表示方法。 n一個狀態(tài)寄存器一個狀態(tài)寄存器(USART_SR) (USART_SR) n數(shù)據(jù)寄存器數(shù)據(jù)寄存器(USART_DR) (USART_DR) n一個波特

17、率寄存器一個波特率寄存器(USART_BRR)(USART_BRR),1212位的整數(shù)和位的整數(shù)和4 4位小數(shù)位小數(shù) n一個智能卡模式下的保護時間寄存器一個智能卡模式下的保護時間寄存器(USART_GTPR) (USART_GTPR) nCKCK:發(fā)送器時鐘輸出。:發(fā)送器時鐘輸出。nIrDA_RDI: IrDAIrDA_RDI: IrDA模式下的數(shù)據(jù)輸入。模式下的數(shù)據(jù)輸入。 nIrDA_TDO: IrDAIrDA_TDO: IrDA模式下的數(shù)據(jù)輸出。模式下的數(shù)據(jù)輸出。 nnCTS: nCTS: 清除發(fā)送,若是高電平,在當前數(shù)據(jù)傳輸結(jié)束時阻斷下一次的數(shù)據(jù)清除發(fā)送,若是高電平,在當前數(shù)據(jù)傳輸結(jié)束時

18、阻斷下一次的數(shù)據(jù)發(fā)送。發(fā)送。nnRTS: nRTS: 發(fā)送請求,若是低電平,表明發(fā)送請求,若是低電平,表明USARTUSART準備好接收數(shù)據(jù)準備好接收數(shù)據(jù) 5.3 STM32的通用串口結(jié)構(gòu)的通用串口結(jié)構(gòu)n任何任何USART雙向通信至少需要兩個腳:接收數(shù)據(jù)雙向通信至少需要兩個腳:接收數(shù)據(jù)輸入輸入(RX)和發(fā)送數(shù)據(jù)輸出和發(fā)送數(shù)據(jù)輸出(TX)。 nRX:接收數(shù)據(jù)串行輸入端。通過采樣技術來區(qū)別數(shù):接收數(shù)據(jù)串行輸入端。通過采樣技術來區(qū)別數(shù)據(jù)和噪音,從而恢復數(shù)據(jù)。據(jù)和噪音,從而恢復數(shù)據(jù)。 nTX:發(fā)送數(shù)據(jù)輸出端。當發(fā)送器被禁止時,輸出引:發(fā)送數(shù)據(jù)輸出端。當發(fā)送器被禁止時,輸出引腳恢復到它的腳恢復到它的I/

19、O端口配置。當發(fā)送器被激活,并且端口配置。當發(fā)送器被激活,并且不發(fā)送數(shù)據(jù)時,不發(fā)送數(shù)據(jù)時,TX引腳處于高電平。引腳處于高電平。在單線和智能在單線和智能卡模式里,此卡模式里,此I/O口被同時用于數(shù)據(jù)的發(fā)送和接收??诒煌瑫r用于數(shù)據(jù)的發(fā)送和接收。 端口重映射 nP132.圖7-1.重映射步驟為重映射步驟為:1.打開復用打開復用IO時鐘和時鐘和USART重映射后的重映射后的I/O口引腳時鐘口引腳時鐘, RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);2.I/O口重映射開啟口重映射開啟. GPIO_P

20、inRemapConfig(GPIO_Remap_USART1,ENABLE);3.配制重映射引腳配制重映射引腳, 這里只需配置重映射后的這里只需配置重映射后的I/O,原來的不需要去原來的不需要去配置配置.GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_InitStructure

21、.GPIO_Pin = GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB,&GPIO_InitStructure);起始位偵測:起始位偵測:在在USARTUSART中,如果辨認出一個特殊的采樣序列,那么就中,如果辨認出一個特殊的采樣序列,那么就認為偵測到一個起始位。認為偵測到一個起始位。 該序列為:該序列為:1 1 1 0 X 0 X 0 X 0 0 0 0 1 1 1 0 X 0 X 0 X 0 0 0 0 接收器起始位偵測接收器起始位偵測n如果如果3個采樣點都為個采樣點都為

22、0(在第在第3、5、7位的第一次采樣,和在位的第一次采樣,和在第第8、9、10的第二次采樣都為的第二次采樣都為0),則確認收到起始位,這,則確認收到起始位,這時設置時設置RXNE標志位,如果標志位,如果RXNEIE=1,則產(chǎn)生中斷。,則產(chǎn)生中斷。n如果兩次如果兩次3個采樣點上僅有個采樣點上僅有2個是個是0(第第3、5、7位的采樣點位的采樣點和第和第8、9、10位的采樣點位的采樣點),那么起始位仍然是有效的,但,那么起始位仍然是有效的,但是會設置是會設置NE噪聲標志位。如果不能滿足這個條件,則中止起噪聲標志位。如果不能滿足這個條件,則中止起始位的偵測過程,接收器會回到空閑狀態(tài)始位的偵測過程,接收

23、器會回到空閑狀態(tài)(不設置標志位不設置標志位)。n如果有一次如果有一次3個采樣點上僅有個采樣點上僅有2個是個是0(第第3、5、7位的采樣位的采樣點或第點或第8、9、10位的采樣點位的采樣點),那么起始位仍然是有效的,那么起始位仍然是有效的,但是會設置但是會設置NE噪聲標志位。噪聲標志位。5.4 USART寄存器描述寄存器描述n狀態(tài)寄存器狀態(tài)寄存器(USART_SR) n數(shù)據(jù)寄存器數(shù)據(jù)寄存器(USART_DR) n波特比率寄存器波特比率寄存器(USART_BRR) n控制寄存器控制寄存器1(USART_CR1) n控制寄存器控制寄存器2(USART_CR2) n控制寄存器控制寄存器3(USART_

24、CR3) n保護時間和預分頻寄存器保護時間和預分頻寄存器(USART_GTPR) 可以用半字可以用半字(16位位)或字或字(32位位)的方式操作這些外設寄存器。的方式操作這些外設寄存器。 狀態(tài)寄存器(USART_SR)D31-D10:保留D9-D0:狀態(tài)位D4-IDLE:監(jiān)測到總線空閑:監(jiān)測到總線空閑 (IDLE line detected) D3-ORE:溢出錯誤:溢出錯誤 (Overrun error) D2-NE: 噪聲錯誤標志噪聲錯誤標志 (Noise error flag) D1-FE: 幀錯誤幀錯誤 (Framing error) D0-PE: 校驗錯誤校驗錯誤 (Parity e

25、rror) n溢出錯誤溢出錯誤:如果:如果RXNERXNE還沒有被復位,又接收到一個字符,還沒有被復位,又接收到一個字符,則發(fā)生溢出錯誤。數(shù)據(jù)只有當則發(fā)生溢出錯誤。數(shù)據(jù)只有當RXNERXNE位被清零后才能從移位位被清零后才能從移位寄存器轉(zhuǎn)移到寄存器轉(zhuǎn)移到RDRRDR寄存器。寄存器。n噪音錯誤噪音錯誤:使用過采樣技術:使用過采樣技術( (同步模式除外同步模式除外) ),通過區(qū)別有,通過區(qū)別有效輸入數(shù)據(jù)和噪音來進行數(shù)據(jù)恢復。效輸入數(shù)據(jù)和噪音來進行數(shù)據(jù)恢復。n幀錯誤幀錯誤:由于沒有同步上或大量噪音的原因,停止位沒有:由于沒有同步上或大量噪音的原因,停止位沒有在預期的時間上接和收識別出來。在預期的時間

26、上接和收識別出來。 噪音錯誤當在接收幀中檢測到噪音時: 在RXNE位的上升沿設置NE標志。 無效數(shù)據(jù)從移位寄存器傳送到USART_DR寄存器。 nRXNE:讀數(shù)據(jù)寄存器非空讀數(shù)據(jù)寄存器非空 (Read data register not empty) 。 當當RDR移位寄存器中的數(shù)據(jù)被轉(zhuǎn)移到移位寄存器中的數(shù)據(jù)被轉(zhuǎn)移到USART_DR寄存器中,該位被硬寄存器中,該位被硬件置位。如果件置位。如果USART_CR1寄存器中的寄存器中的RXNEIE為為1,則產(chǎn)生中斷。對,則產(chǎn)生中斷。對USART_DR的讀操作可以將該位清零。的讀操作可以將該位清零。RXNE位也可以通過寫入位也可以通過寫入0來清來清除,

27、只有在多緩存通訊中才推薦這種清除程序。除,只有在多緩存通訊中才推薦這種清除程序。 0:數(shù)據(jù)沒有收到;:數(shù)據(jù)沒有收到;1:收到數(shù)據(jù),可以讀出。:收到數(shù)據(jù),可以讀出。 nTC:發(fā)送完成發(fā)送完成 (Transmission complete) 。 當包含有數(shù)據(jù)的一幀發(fā)送完成后,并且當包含有數(shù)據(jù)的一幀發(fā)送完成后,并且TXE=1時,由硬件將該位時,由硬件將該位置置1。如果。如果USART_CR1中的中的TCIE為為1,則產(chǎn)生中斷。由軟件序列清,則產(chǎn)生中斷。由軟件序列清除該位除該位(先讀先讀USART_SR,然后寫入,然后寫入USART_DR)。TC位也可以通過寫位也可以通過寫入入0來清除,只有在多緩存通

28、訊中才推薦這種清除程序。來清除,只有在多緩存通訊中才推薦這種清除程序。 0:發(fā)送還未完成;:發(fā)送還未完成; 1:發(fā)送完成。:發(fā)送完成。 數(shù)據(jù)寄存器(USART_DR) nDR8:0:數(shù)據(jù)值:數(shù)據(jù)值 (Data value)包含了發(fā)送或接收的數(shù)據(jù)。包含了發(fā)送或接收的數(shù)據(jù)。n當使能校驗位當使能校驗位(USART_CR1中中PCE位被置位位被置位)進行發(fā)送時,寫到進行發(fā)送時,寫到MSB的值的值(根據(jù)數(shù)據(jù)的長度不同,根據(jù)數(shù)據(jù)的長度不同,MSB是第是第7位或者第位或者第8位位)會被后來的校驗會被后來的校驗位該取代。位該取代。 n當使能校驗位進行接收時,讀到的當使能校驗位進行接收時,讀到的MSB位是接收到

29、的校驗位。位是接收到的校驗位。 波特比率寄存器(USART_BRR) n位位15:4:DIV_Mantissa11:0-USARTDIV的整數(shù)部分,這的整數(shù)部分,這12位定位定義了義了USART分頻器除法因子分頻器除法因子(USARTDIV)的整數(shù)部分。的整數(shù)部分。n位位3:0:DIV_Fraction3:0-USARTDIV的小數(shù)部分,這的小數(shù)部分,這4位定義了位定義了USART分頻器除法因子分頻器除法因子(USARTDIV)的小數(shù)部分。的小數(shù)部分。 n注意:注意: 如果如果TE或或RE被分別禁止,波特計數(shù)器停止計數(shù)被分別禁止,波特計數(shù)器停止計數(shù)分數(shù)波特率的產(chǎn)生:分數(shù)波特率的產(chǎn)生:nfCK是

30、給外設的時鐘是給外設的時鐘(PCLK1用于用于USART2、3、4、5,PCLK2用于用于USART1) n只有只有USART1使用使用PCLK2(最高最高72MHz)。其它。其它USART使用使用PCLK1(最高最高36MHz)。nUSARTDIV是一個無符號的定點數(shù)。這是一個無符號的定點數(shù)。這12位的值設置在位的值設置在USART_BRR寄存器。寄存器。 如何從如何從USART_BRR寄存器值得到寄存器值得到USARTDIV ?n例例1: 如果如果 DIV_Mantissa = 27 , DIV_Fraction = 12 (USART_BRR=0 x1BC), 于是于是 , Mantis

31、sa (USARTDIV) = 27 , Fraction (USARTDIV) = 12/16 = 0.75 , 所以,所以, USARTDIV = 27.75 n例例2:要求:要求 USARTDIV = 25.62, 就有:就有: DIV_Fraction = 16*0.62 = 9.92,最接近的整數(shù)是:,最接近的整數(shù)是:10 = 0 x0A, DIV_Mantissa = mantissa (25.620) = 25 = 0 x19, 于是,于是,USART_BRR = 0 x19A n例例3: 要求要求 USARTDIV = 50.99 就有,就有,DIV_Fraction = 16

32、*0.99 = 15.84 最接近的整數(shù)是,最接近的整數(shù)是,16 = 0 x10 = DIV_frac3:0溢出溢出 = 進位必須加到整數(shù)部分進位必須加到整數(shù)部分 DIV_Mantissa = mantissa (50.990 + 進位進位) = 51 = 0 x33 于是,于是,USART_BRR = 0 x330,USARTDIV=51 設置波特率時的誤差計算設置波特率時的誤差計算 控制寄存器控制寄存器1 (USART_CR1) nUE:USART使能使能 (USART enable) nM:字長:字長 (Word length) 。0:一個起始位,:一個起始位,8個數(shù)據(jù)位,個數(shù)據(jù)位,n個

33、停止位;個停止位; 1:一個起始位,:一個起始位,9個數(shù)據(jù)位,個數(shù)據(jù)位,n個停止位。個停止位。 nWAKE:喚醒的方法:喚醒的方法 (Wakeup method) nPCE:檢驗控制使能:檢驗控制使能 (Parity control enable) nPS:校驗選擇:校驗選擇 (Parity selection) 。0:偶校驗;:偶校驗; 1:奇校驗。:奇校驗。 nPEIE:PE中斷使能中斷使能 (PE interrupt enable) nTXEIE:發(fā)送緩沖區(qū)空中斷使能:發(fā)送緩沖區(qū)空中斷使能 (TXE interrupt enable) nTCIE:發(fā)送完成中斷使能:發(fā)送完成中斷使能 (T

34、ransmission complete interrupt enable) nRXNEIE:接收緩沖區(qū)非空中斷使能:接收緩沖區(qū)非空中斷使能 (RXNE interrupt enable) n字長設置控制寄存器控制寄存器2 (USART_CR2) nLINEN:LIN(局域互聯(lián)網(wǎng))模式使能(局域互聯(lián)網(wǎng))模式使能 (LIN mode enable) 。該位由。該位由軟件設置或清除。軟件設置或清除。 0:禁止:禁止LIN模式;模式; 1:使能:使能LIN模式。模式。 在在LIN模式模式下,可以用下,可以用USART_CR1寄存器中的寄存器中的SBK位發(fā)送位發(fā)送LIN同步斷開符同步斷開符(低低13位

35、位),以及檢測,以及檢測LIN同步斷開符。同步斷開符。 nSTOP:停止位:停止位 (STOP bits) ,這這2位用來設置停止位的位數(shù)。位用來設置停止位的位數(shù)。 00:1個停止位;個停止位;01:0.5個停止位;個停止位; 10:2個停止位;個停止位;11:1.5個停個停止位;注:止位;注:UART4和和UART5不能用不能用0.5停止位和停止位和1.5停止位。停止位。 停止位的設置保護時間和預分頻寄存器(USART_GTPR) n用于紅外或智能卡模式。用于紅外或智能卡模式。n位位15:8:GT7:0-保護時間值保護時間值 (Guard time value) 。該位域規(guī)定了。該位域規(guī)定了

36、以波特時鐘為單位的保護時間。在智能卡模式下,需要這個功能。當以波特時鐘為單位的保護時間。在智能卡模式下,需要這個功能。當保護時間過去后,才會設置發(fā)送完成標志。保護時間過去后,才會設置發(fā)送完成標志。n位位7:0:PSC7:0-預分頻器值預分頻器值 (Prescaler value) - 在紅外在紅外(IrDA)低功耗模式下:低功耗模式下:PSC7:0=紅外低功耗波特率紅外低功耗波特率 - 在智能卡模式下:在智能卡模式下:PSC4:0:預分頻值。對系統(tǒng)時鐘進行分頻,給:預分頻值。對系統(tǒng)時鐘進行分頻,給智能卡提供時鐘。智能卡提供時鐘。 5.5 庫函數(shù)庫函數(shù)n5.5.1 USART寄存器結(jié)構(gòu)n5.5.

37、2 USART庫函數(shù)5.5.1 USART寄存器結(jié)構(gòu)typedef struct vu16 SR; u16 RESERVED1; vu16 DR; u16 RESERVED2; vu16 BRR; u16 RESERVED3; vu16 CR1; u16 RESERVED4; vu16 CR2; u16 RESERVED5; vu16 CR3; u16 RESERVED6; vu16 GTPR; u16 RESERVED7; USART_TypeDef; 寄存器:寄存器: SR - USART狀態(tài)寄存器狀態(tài)寄存器DR - USART數(shù)據(jù)寄存器數(shù)據(jù)寄存器BRR - USART波特率寄存器波特率寄

38、存器CR1 - USART控制寄存器控制寄存器1 CR2 - USART控制寄存器控制寄存器2 CR3 - USART控制寄存器控制寄存器3 GTPR - USART保護時間和預分頻寄存器保護時間和預分頻寄存器5.5.2 USART庫函數(shù)串口常用函數(shù):uUSART_DeInit:將外設:將外設USARTx寄存器重設為缺省值寄存器重設為缺省值uUSART_Init:根據(jù):根據(jù)USART_InitStruct中指定的參數(shù)初始化外中指定的參數(shù)初始化外設設USARTx寄存器寄存器uUSART_Cmd:使能或者失能:使能或者失能USART外設外設uUSART_ITConfig:使能或者失能指定的:使能或

39、者失能指定的USART中斷中斷uUSART_SendData:通過外設:通過外設USARTx發(fā)送單個數(shù)據(jù)發(fā)送單個數(shù)據(jù)uUSART_ReceiveData:返回:返回USARTx最近接收到的數(shù)據(jù)最近接收到的數(shù)據(jù)uUSART_GetFlagStatus:檢查指定的:檢查指定的USART標志位設置與否標志位設置與否uUSART_ClearFlag:清除:清除USARTx的待處理標志位的待處理標志位uUSART_GetITStatus:檢查指定的:檢查指定的USART中斷發(fā)生與否中斷發(fā)生與否函數(shù)USART_DeInit n功能描述:將外設功能描述:將外設USARTx寄存器重設為缺省值寄存器重設為缺省值

40、n函數(shù)原形:函數(shù)原形: void USART_DeInit(USART_TypeDef* USARTx)n例:例:/* Resets the USART1 registers to their default reset value */ USART_DeInit(USART1); 函數(shù)USART_Init n功能:根據(jù)功能:根據(jù)USART_InitStruct中指定的參數(shù)初始化外設中指定的參數(shù)初始化外設USARTx寄存器寄存器n函數(shù)原形:函數(shù)原形: void USART_Init (USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStr

41、uct)USART_InitTypeDef structure typedef struct u32 USART_BaudRate; /波特率波特率u16 USART_WordLength; /字長字長u16 USART_StopBits; /停止位停止位u16 USART_Parity; /奇偶校驗奇偶校驗u16 USART_HardwareFlowControl; /硬件流控制硬件流控制u16 USART_Mode; /模式模式u16 USART_Clock; u16 USART_CPOL; u16 USART_CPHA; u16 USART_LastBit; USART_InitType

42、Def; 串口串口1配置舉例配置舉例/* The following example illustrates how to configure the USART1 */ USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructu

43、re.USART_Parity = USART_Parity_Odd; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_RTS_CTS; USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_InitStructure.USART_Clock = USART_Clock_Disable; USART_InitStructure.USART_CPOL = USART_CPOL_High; USART_InitSt

44、ructure.USART_CPHA = USART_CPHA_1Edge; USART_InitStructure.USART_LastBit = USART_LastBit_Enable; USART_Init(USART1, &USART_InitStructure); nUSART_WordLength USART_WordLength_8b:8位數(shù)據(jù)USART_WordLength_9b:9位數(shù)據(jù)nUSART_StopBits USART_StopBits_1:在幀結(jié)尾傳輸1個停止位USART_StopBits_0.5: 在幀結(jié)尾傳輸0.5個停止位USART_StopBits

45、_2:在幀結(jié)尾傳輸2個停止位USART_StopBits_1.5:在幀結(jié)尾傳輸1.5個停止位nUSART_Parity USART_Parity_No:奇偶失能 USART_Parity_Even:偶模式 USART_Parity_Odd:奇模式 nUSART_HardwareFlowControl USART_HardwareFlowControl_None:硬件流控制失能 USART_HardwareFlowControl_RTS:發(fā)送請求RTS使能USART_HardwareFlowControl_CTS:清除發(fā)送CTS使能USART_HardwareFlowControl_RTS_CT

46、S:RTS和CTS使能nUSART_Mode USART_Mode_Tx:發(fā)送使能 USART_Mode_Rx:接收使能nUSART_CLOCKUSART_Clock_Enable:時鐘高電平活動 USART_Clock_Disable:時鐘低電平活動 函數(shù)USART_StructInit n功能描述:功能描述: 把把USART_InitStruct中的每一個參數(shù)按缺省值填入中的每一個參數(shù)按缺省值填入n例:例: /* The following example illustrates how to initialize a USART_InitTypeDef structure */ USAR

47、T_InitTypeDef USART_InitStructure; USART_StructInit (&USART_InitStructure); USART_InitStruct缺省值函數(shù)USART_Cmd n功能描述:使能或者失能功能描述:使能或者失能USART外設。外設。n函數(shù)原形:函數(shù)原形: void USART_Cmd(USART_TypeDef* USARTx, FunctionalState NewState) n例:例: /* Enable the USART1 */ USART_Cmd (USART1, ENABLE); 函數(shù)USART_ITConfig n功能描

48、述功能描述:使能或者失能指定的使能或者失能指定的USART中斷中斷n函數(shù)原形函數(shù)原形:void USART_ITConfig (USART_TypeDef* USARTx, u16 USART_IT, FunctionalState NewState) n例:例:/* Enables the USART1 transmit interrupt */ USART_ITConfig(USART1, USART_IT_TC, ENABLE); USART_IT值:值:USART中斷請求函數(shù)USART_SendData n功能描述功能描述:通過外設通過外設USARTx發(fā)送單個數(shù)據(jù)發(fā)送單個數(shù)據(jù)n函數(shù)原形

49、函數(shù)原形:void USART_SendData(USART_TypeDef* USARTx, u8 Data) nx可以是可以是1,2或者或者3,來選擇,來選擇USART外設。外設。n例:例:/* Send one HalfWord on USART3 */ USART_SendData(USART3, 0 x26); 函數(shù)USART_ReceiveData 例:例: /* Receive one halfword on USART2 */ u8 RxData; RxData = USART_ReceiveData(USART2);函數(shù)USART_GetFlagStatus n功能描述:檢查

50、指定的功能描述:檢查指定的USART標志位設置與否。標志位設置與否。n函數(shù)原形:函數(shù)原形:FlagStatus USART_GetFlagStatus (USART_TypeDef* USARTx, u16 USART_FLAG) n返回值返回值 :USART_FLAG的新狀態(tài)(的新狀態(tài)(SET或者或者RESET) n例:例: /* Check if the transmit data register is full or not */ FlagStatus Status; Status = USART_GetFlagStatus(USART1, USART_FLAG_TXE); USART

51、_FLAG值:值: 函數(shù)USART_ClearFlag n功能描述:清除功能描述:清除USARTx的待處理標志位的待處理標志位n函數(shù)原形:函數(shù)原形: void USART_ClearFlag(USART_TypeDef* USARTx, u16 USART_FLAG) n例:例: /* Clear Overrun error flag */ USART_ClearFlag(USART1,USART_FLAG_ORE); 函數(shù)USART_GetITStatus n功能描述功能描述:檢查指定的檢查指定的USART中斷發(fā)生與否中斷發(fā)生與否n函數(shù)原形函數(shù)原形:ITStatus USART_GetITS

52、tatus(USART_TypeDef* USARTx, u16 USART_IT) n輸入?yún)?shù)輸入?yún)?shù)1:USARTx:x可以是可以是1,2或者或者3,來選擇,來選擇USART外設外設n輸入?yún)?shù)輸入?yún)?shù)2 :USART_IT:待檢查的:待檢查的USART中斷源中斷源n返回值返回值: USART_IT的新狀態(tài)的新狀態(tài)n例:例:/* Get the USART1 Overrun Error interrupt status */ ITStatus ErrorITStatus; ErrorITStatus = USART_GetITStatus(USART1, USART_IT_OverrunEr

53、ror); USART_IT值:函數(shù)USART_ClearITPendingBit n功能描述:清除功能描述:清除USARTx的中斷待處理位。的中斷待處理位。n函數(shù)原形:函數(shù)原形:void USART_ClearITPendingBit (USART_TypeDef* USARTx, u16 USART_IT)其中,其中,USART_IT:待檢查的:待檢查的USART中斷源中斷源 USARTx:x可以是可以是1,2或者或者3,來選擇,來選擇USART外設外設n例:例: /* Clear the Overrun Error interrupt pending bit */ USART_Clear

54、ITPendingBit(USART1,USART_IT_OverrunError); 5.6 程序設計舉例程序設計舉例n聲明函數(shù)聲明函數(shù)n聲明變量聲明變量n主函數(shù)主函數(shù)配置系統(tǒng)時鐘配置系統(tǒng)時鐘使能外設時鐘使能外設時鐘配置配置GPIO配置中斷優(yōu)先級配置中斷優(yōu)先級配置串口、允許串口中斷配置串口、允許串口中斷串口發(fā)送字符串串口發(fā)送字符串主循環(huán)主循環(huán)n等待串口接受字符中斷等待串口接受字符中斷n延時子函數(shù)延時子函數(shù)n初始化系統(tǒng)時鐘函數(shù)初始化系統(tǒng)時鐘函數(shù)n初始化初始化GPIO、中斷優(yōu)先級、串口等子函數(shù)、中斷優(yōu)先級、串口等子函數(shù)n中斷處理子函數(shù)中斷處理子函數(shù)函數(shù)及變量聲明#include “stm32f1

55、0 x.h”void RCC_Configuration(void); /初始化系統(tǒng)時鐘函數(shù)初始化系統(tǒng)時鐘函數(shù)void uart_init(u32 baund); /初始化初始化GPIO、中斷、串口的函數(shù)、中斷、串口的函數(shù)void Delay(vu32 nTime); /延時函數(shù)延時函數(shù)void Uart1_PutString(u8 *buf , u8 len); /輸出字符串函數(shù)輸出字符串函數(shù)u8 Uart1_PutChar(u8 ch); /輸出一個字符的函數(shù)輸出一個字符的函數(shù)u8 buf=(“Please input:rn”); /定義一個字符串定義一個字符串u8 i; /定義變量定義變

56、量i主函數(shù)int main() RCC_Configuration(); uart_init(9600);Uart1_PutString(buf, 20);while(1) 配置系統(tǒng)時鐘,開啟外設時鐘void RCC_Configuration() ErrorStatus HSEStartUpStatus; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON); HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus = SUCCESS) RCC_HCLKConfig(RCC_SYSCLK_Div

57、1); RCC_PCLK2Config(RCC_HCLK_Div1); RCC_PCLK1Config(RCC_HCLK_Div2); FLASH_SetLatency(FLASH_Latency_2); FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); RCC_PLLCmd(ENABLE); while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) = RESET); RCC_SYSCLKConfig(RC

58、C_SYSCLKSource_PLLCLK); while(RCC_GetSYSCLKSource() != 0 x08); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);配置配置GPIO、USART、NVICvoid uart_init(u32 bound) /GPIO? GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef

59、 NVIC_InitStructure; /USART1_TX- PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); /USART1_RX- PA.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure

60、.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); 配置配置GPIO、USART、NVIC(續(xù))(續(xù))NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;NVIC_InitStructure.NVIC_IR

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論