版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
串口通信第7章《嵌入式系統(tǒng)基礎(chǔ)與實(shí)踐》(第2版)主講教師:(
學(xué)院)知識(shí)目標(biāo)能力目標(biāo)思維與素養(yǎng)目標(biāo)
理解和掌握通信(異步串行通信)的基本概念,熟知常見的串行通信接口(RS-232、RS-485、SPI、I2C等接口)及通信協(xié)議。
了解STM32微控制器的USART的內(nèi)部結(jié)構(gòu)、特性,理解其通信原理及過程。
熟悉標(biāo)準(zhǔn)外設(shè)庫和HAL庫中有關(guān)USART的接口函數(shù),理解USART接口函數(shù)的編程思想。
能夠根據(jù)硬件原理圖,正確配置串口相關(guān)參數(shù)并搭建實(shí)際電路。
熟練運(yùn)用串口通信的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)和HAL庫接口函數(shù),實(shí)現(xiàn)輪詢方式、中斷方式、DMA方式下串口通信程序的編寫,進(jìn)而實(shí)現(xiàn)系統(tǒng)功能。
借鑒ModBus通信協(xié)議和CRC校驗(yàn)算法,自定義通信協(xié)議的編程思想并應(yīng)用于實(shí)際工程項(xiàng)目。
通過借鑒ModBus通信協(xié)議和CRC校驗(yàn)算法,將自定義通信協(xié)議的編程思想應(yīng)用于實(shí)際工程項(xiàng)目,拓展裸機(jī)編程的邊界,踐行“知識(shí)—技能—思維”的教育閉環(huán)。
初步形成創(chuàng)新設(shè)計(jì)思維。學(xué)習(xí)目標(biāo)7.1通信概述7.2異步串行通信7.3STM32的USART模塊7.4USART模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用7.5USART模塊的HAL庫接口函數(shù)及應(yīng)用7.6編程思想之自定義串口通信協(xié)議第7章串口通信7.1通信概述通信方式分類按數(shù)據(jù)傳送方式串行通信并行通信按通信數(shù)據(jù)同步方式同步通信異步通信按數(shù)據(jù)傳輸方向及與時(shí)間的關(guān)系單工通信半雙工通信全雙工通信7.1通信概述
串行通信(SerialTransmission),是指通過一根數(shù)據(jù)線或少量數(shù)據(jù)線(少于8根)將數(shù)據(jù)一位一位地按順序依次傳送。
并行通信(ParallelTransmission),是指用多條數(shù)據(jù)線同時(shí)傳送多位數(shù)據(jù),通常以8位、16位、32位等數(shù)據(jù)位傳送。串行通信與并行通信7.1通信概述
并行通信一次可傳輸多個(gè)數(shù)據(jù)位的數(shù)據(jù),并行通信傳輸數(shù)據(jù)量是串行傳輸?shù)臄?shù)倍,如早期的并行接口的硬盤、打印機(jī),采用PCI(PeripheralComponentInterconnect,外設(shè)部件互連標(biāo)準(zhǔn))并行接口的顯卡等。并行傳輸?shù)娜秉c(diǎn)長距離傳輸成本較高;信號(hào)線之間的干擾大,傳輸速率很難達(dá)到很高;體積大,占用空間大,不利于設(shè)備的小型化、微型化。計(jì)算機(jī)內(nèi)部的總線結(jié)構(gòu),即CPU與內(nèi)部寄存器及接口之間采用并行傳輸。7.1通信概述串行通信是目前最為流行的一種通信方式,如U盤以及采用USB接口的設(shè)備、工業(yè)上常用的RS-485和RS-232等,都是串行通信設(shè)備。USB的串行通信接口U盤的串行通信接口計(jì)算機(jī)網(wǎng)絡(luò)中所使用的傳輸方式均是串行傳輸,單片機(jī)與外設(shè)之間也大多采用各類串行接口,比如USART、USB、IIC、SPI等。7.1通信概述同步通信與異步通信
同步通信是連續(xù)串行傳送數(shù)據(jù)的通信方式,要求收發(fā)雙方的時(shí)鐘必須保持嚴(yán)格的同步。
特點(diǎn):輸速率較高
異步通信在發(fā)送的有效數(shù)據(jù)中增加一些用于同步的控制位,比如開始位和停止位等,數(shù)據(jù)以字符為單位組成數(shù)據(jù)幀進(jìn)行傳送,收發(fā)雙方需約定數(shù)據(jù)的傳輸速率。特點(diǎn):
傳輸效率較低;通信設(shè)備實(shí)現(xiàn)簡單、成本低。7.1通信概述單工、半雙工、全雙工通信根據(jù)數(shù)據(jù)傳輸方向以及與時(shí)間的關(guān)系,串行通信可以分為單工、半雙工和全雙工三種通信方式。通信方式描述舉例單工任何時(shí)刻都只能單方向通信的工作方式,即一端固定為發(fā)送端,另一端固定為接收端燈塔、廣播和電視半雙工兩個(gè)設(shè)備均可以收發(fā)數(shù)據(jù),但不能在同一時(shí)刻進(jìn)行對講機(jī)全雙工兩個(gè)設(shè)備可以同時(shí)收發(fā)數(shù)據(jù)手機(jī)7.1通信概述通信傳輸速率每秒傳輸?shù)亩M(jìn)制位數(shù),單位為比特每秒(bit/s,bps),是衡量串行數(shù)據(jù)傳輸速度快慢的指標(biāo)。波特率每秒所傳輸?shù)淖址麛?shù):波特率=字符速率×每個(gè)字符包含的位數(shù)字符速率為120字符/秒,若每個(gè)字符包含10位(1個(gè)起始位,7個(gè)數(shù)據(jù)位,1個(gè)校驗(yàn)位,1個(gè)結(jié)束位),則波特率為10位/字符×120字符/秒=1200bps。字符速率常用的串口傳輸速率(波特率)有1200、2400、4800、9600、19200和115200等。舉例7.2異步串行通信目錄7.2.1異步串行通信協(xié)議7.2.2異步串行通信接口異步串行通信標(biāo)準(zhǔn)的數(shù)據(jù)幀由起始位、數(shù)據(jù)位、校驗(yàn)位、停止位四部分組成。數(shù)據(jù)傳輸速率為50、75、100、150、300、600、1200、2400、4800、9600、19200和38400波特。通信傳輸速率和數(shù)據(jù)幀格式一起稱為通信協(xié)議。起始位:占一位,位于數(shù)據(jù)幀的開頭,以邏輯“0”表示傳輸數(shù)據(jù)的開始。數(shù)據(jù)位:要發(fā)送的數(shù)據(jù),數(shù)據(jù)長度可以是5~8位。校驗(yàn)位:占一位,用于檢測數(shù)據(jù)是否有效。停止位:一幀傳送結(jié)束的標(biāo)志,根據(jù)實(shí)際情況定,可以是1、1.5或2位??臻e位:數(shù)據(jù)傳輸完畢,用“1”表示當(dāng)前線路上沒有數(shù)據(jù)傳輸。7.2.1異步串行通信協(xié)議7.2.1異步串行通信接口UART(UniversalAsynchronousReceiverTransmitter,通用異步收發(fā)傳輸器)是一個(gè)全雙工通用異步串行收/發(fā)模塊,主要用于打印程序調(diào)試信息、上位機(jī)和下位機(jī)的通信以及ISP程序下載等場合。UART至少需要兩根數(shù)據(jù)線用于通信雙方進(jìn)行數(shù)據(jù)雙向同時(shí)傳輸,最簡單的UART接口由TxD、RxD、GND共3根線組成。其中,TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),GND為信號(hào)地線,通過交叉連接實(shí)現(xiàn)兩個(gè)芯片間的串口通信。RS-232是美國電子工業(yè)協(xié)會(huì)(EIA,ElectronicIndustryAssociation)制定的串行通信物理接口標(biāo)準(zhǔn),規(guī)定了相應(yīng)的電氣特性和物理特性,通常采用DB-9或DB-25的形式,以DB-9最為常見。外形針腳號(hào)符號(hào)功能1DCD數(shù)據(jù)載波檢測,輸入2RxD接收數(shù)據(jù),輸入3TxD發(fā)送數(shù)據(jù),輸出4DTR數(shù)據(jù)終端準(zhǔn)備就緒,輸出5GND信號(hào)地6DSR數(shù)據(jù)設(shè)備準(zhǔn)備就緒,輸入7RTS請求發(fā)送,輸出8CTS清除發(fā)送,輸入9RI振鈴指示,輸入7.2.1異步串行通信接口對可靠性要求不高的場合,DB-9通常采用三線制串口,僅需發(fā)送(Tx)、接收(Rx)和地(GND)三條線,即可實(shí)現(xiàn)全雙工通信,進(jìn)行最基本的數(shù)據(jù)收發(fā)傳送,最高傳輸速率可達(dá)20kbps7.2.1異步串行通信接口
RS-232為異步串行通信接口,其電氣標(biāo)準(zhǔn)采用負(fù)邏輯,不能與TTL電平設(shè)備直接相連,而微控制器中的UART采用的是TTL電平標(biāo)準(zhǔn),因此,RS-232與微控制器相連時(shí)必須進(jìn)行電平轉(zhuǎn)換。7.2.1異步串行通信接口7.3STM32的USART模塊7.3.1USART內(nèi)部結(jié)構(gòu)7.3.2USART接口7.3.3USART編程模式USART內(nèi)部功能實(shí)現(xiàn)由三部分構(gòu)成:7.3.1USART內(nèi)部結(jié)構(gòu)波特率發(fā)生器發(fā)送器/接收器控制單元數(shù)據(jù)收發(fā)寄存器單元
通過USART_BRR寄存器實(shí)現(xiàn)串口通信數(shù)據(jù)傳輸速率的設(shè)置。
通過向USART的控制寄存器(ControlRegister)CR1、CR2、CR3和USART的狀態(tài)寄存器SR(StatusRegister)寫入相應(yīng)的參數(shù),實(shí)現(xiàn)USART數(shù)據(jù)的發(fā)送和接收控制7.3.1USART內(nèi)部結(jié)構(gòu)波特率發(fā)生器發(fā)送器/接收器控制單元CR1主要用于配置USART的數(shù)據(jù)位、校驗(yàn)位及中斷使能;CR2用于配置USART停止位以及SCLK時(shí)鐘控制;CR3主要涉及CTS硬件流控制和單字節(jié)/DMA多緩沖傳輸控制的配置。USART狀態(tài)寄存器SR各bit位所代表的含義7.3.1USART內(nèi)部結(jié)構(gòu)bit位寄存器名稱功能描述31-10保留,硬件強(qiáng)制設(shè)置為“0”9CTSCTS標(biāo)志0:nCTS狀態(tài)線上沒有變化;1:nCTS狀態(tài)線上發(fā)生變化。8LBDLIN斷開檢測標(biāo)志(LINbreakdetectionflag)0:沒有檢測到LIN斷開;1:檢測到LIN斷開。7TXE發(fā)送數(shù)據(jù)寄存器空(Transmitdataregisterempty)0:數(shù)據(jù)還沒有被轉(zhuǎn)移到移位寄存器;1:數(shù)據(jù)已經(jīng)被轉(zhuǎn)移到移位寄存器。6TC發(fā)送完成(Transmissioncomplete)0:發(fā)送還未完成;1:發(fā)送完成。5RXNE讀數(shù)據(jù)寄存器非空(Readdataregisternotempty)0:數(shù)據(jù)沒有收到;1:收到數(shù)據(jù),可以讀出。USART狀態(tài)寄存器SR各bit位所代表的含義7.3.1USART內(nèi)部結(jié)構(gòu)bit位寄存器名稱功能描述4IDLE監(jiān)測到總線空閑(IDLElinedetected)0:沒有檢測到空閑總線;1:檢測到空閑總線。3ORE過載錯(cuò)誤(Overrunerror)0:沒有過載錯(cuò)誤;1:檢測到過載錯(cuò)誤2NE噪聲錯(cuò)誤標(biāo)志(Noiseerrorflag)0:沒有檢測到噪聲;1:檢測到噪聲。1FE幀錯(cuò)誤(Framingerror)0:沒有檢測到幀錯(cuò)誤;1:檢測到幀錯(cuò)誤或者break符。0PE校驗(yàn)錯(cuò)誤(Parityerror)0:沒有奇偶校驗(yàn)錯(cuò)誤;1:奇偶校驗(yàn)錯(cuò)誤。
組成:發(fā)送數(shù)據(jù)寄存器(TDR)接收數(shù)據(jù)寄存器(RDR)發(fā)送移位寄存器接收移位寄存器7.3.1USART內(nèi)部結(jié)構(gòu)數(shù)據(jù)收發(fā)寄存器單元數(shù)據(jù)發(fā)送過程數(shù)據(jù)發(fā)送數(shù)據(jù)寄存器(TDR)發(fā)送移位寄存器觸發(fā)TXE中斷下一幀數(shù)據(jù)寫入TDR寄存器TC位被置位一幀發(fā)送結(jié)束傳送數(shù)據(jù)數(shù)據(jù)接收過程數(shù)據(jù)接收移位寄存器接收數(shù)據(jù)寄存器RXNE中斷RXNE位被清零準(zhǔn)備接收下一幀處理數(shù)據(jù)7.3.2USART接口STM32F103大容量產(chǎn)品有5個(gè)串行通信接口,USART4和USART5為2個(gè)通用異步收發(fā)器,不支持同步模式,只有異步通信功能。USART模式USART1USART2USART3USART4USART5異步模式
(支持)
硬件流控制
(不支持)
多緩存通信(DMA)
多處理器通信
同步
智能卡
半雙工(單線模式)
IrDA
LIN
USART異步模式至少需要兩個(gè)引腳:Rx(接收數(shù)據(jù)引腳)和Tx(發(fā)送數(shù)據(jù)引腳),使用了復(fù)用I/O功能??偩€USARTx復(fù)用功能USART1_REMAP=0USART1_REMAP=1GPIO配置APB2總線USART1USART1_TXPA9PB6復(fù)用推挽輸出USART1_RXPA10PB7浮空輸入APB1總線USART2USART2_TXPA2PD5復(fù)用推挽輸出USART2_RXPA3PD6浮空輸入U(xiǎn)SART3USART3_TXPB10PC10復(fù)用推挽輸出USART3_RXPB11PC11浮空輸入7.3.2USART接口7.3.3
USART編程模式輪詢模式CPU不斷地查詢I/O設(shè)備是否準(zhǔn)備就緒,如果準(zhǔn)備就緒就發(fā)送,否則提示超時(shí)錯(cuò)誤;會(huì)占用CPU的大量時(shí)間,效率低。中斷方式通過中斷請求線,在I/O設(shè)備準(zhǔn)備就緒時(shí)向CPU發(fā)出中斷請求,CPU中止正在進(jìn)行的工作轉(zhuǎn)向處理I/O設(shè)備的中斷事件中斷方式相比輪詢方式效率較高。DMA方式直接存儲(chǔ)器傳送,不經(jīng)過CPU直接在內(nèi)存和外設(shè)之間進(jìn)行批量數(shù)據(jù)交換,適用于高速大批量成組數(shù)據(jù)的傳輸;滿足高速I/O設(shè)備的傳輸要求,有利于提高CPU的利用率。通過定期或循環(huán)查詢USART狀態(tài)寄存器SR各位的狀態(tài),編寫應(yīng)用程序?qū)邮栈虬l(fā)送的數(shù)據(jù)進(jìn)行處理,有兩種方式實(shí)現(xiàn)對USART相關(guān)寄存器的操作:輪詢方式寄存器開發(fā)方式在編程代碼中直接配置這些功能寄存器基于庫的開發(fā)方式
間接對寄存器操作實(shí)現(xiàn)相應(yīng)的USART通信功能7.3.3
USART編程模式USART主要有以下中斷事件:發(fā)送期間:發(fā)送完成、清除發(fā)送和發(fā)送數(shù)據(jù)寄存器空;接收期間:空閑總線檢測、溢出錯(cuò)誤、接收數(shù)據(jù)寄存器非空、校驗(yàn)錯(cuò)誤、LIN斷開符號(hào)檢測、噪音標(biāo)志(僅在多緩沖器通信)和幀錯(cuò)誤(僅在多緩沖器通信)。中斷方式USART中斷映射7.3.3
USART編程模式中斷方式中斷標(biāo)志中斷使能位STM32中的定義中斷事件TXETXEIEUART_IT_TXE發(fā)送數(shù)據(jù)寄存器空CTSCTSIEUART_IT_CTSCTS標(biāo)志TCTCIEUART_IT_TC發(fā)送完成RXNERXNEIEUART_IT_RXNE接收數(shù)據(jù)就緒(可讀)ORETXNEIE
檢測到數(shù)據(jù)溢出IDLEIDLEIEUART_IT_IDLE檢測到空閑線路標(biāo)志PEPEIEUART_IT_PE奇偶檢驗(yàn)錯(cuò)誤標(biāo)志LBDLBDIEUART_IT_LBD斷開標(biāo)志NE或ORT或PEEIEUART_IT_ERR噪聲標(biāo)志,溢出錯(cuò)誤和幀錯(cuò)誤USART中斷事件及中斷使能標(biāo)志位7.3.3
USART編程模式STM32F103微控制器的USART的發(fā)送和接收分別映射到不同的DMA通道上,如USART1_Rx被映射到DMA1的通道5,USART1_Tx被映射到DMA1的通道4。DMA方式USART模塊可通過DMA方式進(jìn)行大批量數(shù)據(jù)的連續(xù)傳輸。7.3.3
USART編程模式7.4USART模塊的標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)及應(yīng)用7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)7.4.2USART串口應(yīng)用編程步驟7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例
STM32的USART標(biāo)準(zhǔn)外設(shè)庫函數(shù)定義在STM32F10x標(biāo)準(zhǔn)外設(shè)庫的stm32f10x_usart.c文件中,其相應(yīng)的stm32f10x_usart.h頭文件定義了USART相關(guān)的結(jié)構(gòu)體和宏定義,并聲明了相關(guān)的標(biāo)準(zhǔn)外設(shè)庫函數(shù),共29種。
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)typedefstruct{uint32_tUSART_BaudRate;uint16_tUSART_WordLength;uint16_tUSART_StopBits;uint16_tUSART_Parity;uint16_tUSART_Mode;uint16_tUSART_HardwareFlowControl;}USART_InitTypeDef;
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART初始化結(jié)構(gòu)體結(jié)構(gòu)體成員取值范圍USART_BaudRate(波特率)9600115200USART_WordLength(數(shù)據(jù)位數(shù))USART_WordLength_8b(8位)USART_WordLength_9b(9位)USART_StopBits(停止位)USART_StopBits_1(1位)USART_StopBits_0_5(0.5位)USART_StopBits_2(2位)USART_StopBits_1_5(1.5位)USART_Parity(校驗(yàn)?zāi)J剑︰SART_Parity_No(無校驗(yàn))USART_Parity_Even(偶校驗(yàn))USART_Parity_Odd(奇校驗(yàn))USART_Mode(收發(fā)模式)USART_Mode_Rx(接收模式)USART_Mode_Tx(發(fā)送模式)USART_HardwareFlowControl(硬件流控制)USART_HardwareFlowControl_None(不使用聯(lián)絡(luò)信號(hào))USART_HardwareFlowControl_RTS(使用RTS)USART_HardwareFlowControl_CTS(使用CTS)USART_HardwareFlowControl_RTS_CTS(使用RTC和CTS)USART_InitTypeDef結(jié)構(gòu)體成員及其取值
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART初始化函數(shù)voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);例如:USART_Init(USART1,&USART_InitStructurer);//初始化串口1庫函數(shù)1USART初始化復(fù)位函數(shù)voidUSART_DeInit(USART_TypeDef*USARTx);當(dāng)外設(shè)出現(xiàn)異常時(shí),可以通過復(fù)位操作,對外設(shè)重新進(jìn)行配置。例如:USART_DeInit(USART1);//復(fù)位串口1庫函數(shù)2
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART使能函數(shù)voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);例如:USART_Cmd(USART1,ENABLE);//使能串口1庫函數(shù)3USART發(fā)送單個(gè)數(shù)據(jù)函數(shù)voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);例如:USART_SendData(USART1,0x26);//通過串口1發(fā)送十六進(jìn)制數(shù)據(jù)26H庫函數(shù)4
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART接收數(shù)據(jù)函數(shù)uint16_tUSART_ReceiveData(USART_TypeDef*USARTx);例如:Temp=USART_SendData(USART1);//將接收串口1發(fā)來的數(shù)據(jù)存到變量Temp中庫函數(shù)5USART獲取串口狀態(tài)函數(shù)FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG);使用串口進(jìn)行數(shù)據(jù)發(fā)送或接收時(shí),先判斷狀態(tài)寄存器的狀態(tài)再進(jìn)行下一步操作,該函數(shù)實(shí)現(xiàn)對指定的USART標(biāo)志位是否設(shè)置進(jìn)行檢查。例如:FlagStatusStatus;Status=USART_GetFlagStatus(USART1,USART_FLAG_TXE);庫函數(shù)6
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)函數(shù)USART_GetFlagStatus()有兩個(gè)輸入?yún)?shù):參數(shù)1:USARTx,可選為USART1、USART2或USART3;參數(shù)2:USART_FLAG為待檢測的USART標(biāo)志位;函數(shù)返回值為SET(置位)或RESET(復(fù)位)。庫函數(shù)6USART_FLAG描述USART_FLAG_CTSCTS標(biāo)志位USART_FLAG_LBDLIN中斷檢測標(biāo)志位USART_FLAG_TXE發(fā)送數(shù)據(jù)寄存器空標(biāo)志位USART_FLAG_TC發(fā)送完成標(biāo)志位USART_FLAG_RXNE接收數(shù)據(jù)寄存器非空標(biāo)志位USART_FLAG_IDLE空閑總線標(biāo)志位USART_FLAG_ORE溢出錯(cuò)誤標(biāo)志位USART_FLAG_NE噪聲錯(cuò)誤標(biāo)志位USART_FLAG_FE幀錯(cuò)誤標(biāo)志位USART_FLAG_PE奇偶錯(cuò)誤標(biāo)志位
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)串口采用USART_SendData()函數(shù)發(fā)送數(shù)據(jù)時(shí),要先判斷USART_FLAG_TXE(發(fā)送數(shù)據(jù)寄存器空標(biāo)志位)或USART_FLAG_TC(發(fā)送完成標(biāo)志位)的狀態(tài),等發(fā)送完成后再執(zhí)行后面的程序,具體實(shí)現(xiàn)代碼如下:USART_SendData(USART1,(uint8_t)ch);//發(fā)送數(shù)據(jù)//判斷發(fā)送是否完成,循環(huán)等待直到發(fā)送完畢while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);returnch;或while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE)==RESET);return(ch);庫函數(shù)6
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)采用USART_ReceiveData()函數(shù)進(jìn)行接收數(shù)據(jù)時(shí),要先判斷USART_FLAG_RXNE(接收數(shù)據(jù)寄存器非空標(biāo)志位),非空時(shí)接收數(shù)據(jù),該位被置“1”時(shí),表示有數(shù)據(jù)被接收,并可以讀出。具體代碼如下://判斷接收寄存器是否為空,非空接收數(shù)據(jù)if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){ch=USART_ReceiveData(USART1);//接收數(shù)據(jù)}庫函數(shù)6
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART清除狀態(tài)標(biāo)志函數(shù)voidUSART_ClearFlag(USART_TypeDef*USARTx,uint16_tUSART_FLAG);例如:USART_ClearFlag(USART1,USART_FLAG_TC);//清除串口1的TC狀態(tài)標(biāo)志位庫函數(shù)7USART串口中斷使能函數(shù)voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalStateNewState);例如:USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟接收數(shù)據(jù)寄存器非空中斷USART_ITConfig(USART1,USART_IT_TC,ENABLE);//開啟發(fā)送完成中斷庫函數(shù)8
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART串口中斷使能函數(shù)USART_ITConfig()函數(shù)的參數(shù):參數(shù)1:USARTx,可選為USART1、USART2或USART3;參數(shù)2:USART_IT為待檢測的USART標(biāo)志位;參數(shù)3為ENABLE或DISABLE;函數(shù)返回值為SET(置位)或RESET(復(fù)位)。庫函數(shù)8USART_IT描述USART_IT_PE奇偶錯(cuò)誤中斷USART_IT_TXE發(fā)送中斷USART_IT_TC傳輸完成中斷USART_IT_RXNE接收中斷USART_IT_IDLE空閑總線中斷USART_IT_LBDLIN中斷檢測中斷USART_IT_CTSCTS中斷USART_IT_ERR錯(cuò)誤中斷
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART獲取串口中斷狀態(tài)函數(shù)ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT);庫函數(shù)9若使能了中斷,則會(huì)設(shè)置狀態(tài)寄存器中的某個(gè)標(biāo)志位,通過調(diào)用該函數(shù)來判斷是否是串口發(fā)送完成中斷,實(shí)現(xiàn)方式如下:USART_GetITStatus(USART1,USART_IT_TC);若返回值是SET,則說明串口1發(fā)送完成,產(chǎn)生了中斷。999
7.4.1USART標(biāo)準(zhǔn)外設(shè)庫接口函數(shù)USART清除串口中斷標(biāo)志函數(shù)voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT);例如,復(fù)位發(fā)送完成中斷標(biāo)志位:USART_ClearITPendingBit(USART1,USART_IT_TC);庫函數(shù)10USART串口DMA使能函數(shù)voidUSART_DMACmd(USART_TypeDef*USARTx,uint16_tUSART_DMAReq,FunctionalStateNewState);用于配置DMA與USART通道,例如:USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);//使能USART1的發(fā)送DMA請求USART_DMACmd(USART1,USART_DMAReq_RX,ENABLE);//使能USART1的接收DMA請求庫函數(shù)117.4.2USART串口應(yīng)用編程步驟聲明GPIO和USART初始化結(jié)構(gòu)體串口所用的GPIO時(shí)鐘使能,串口時(shí)鐘使能設(shè)置I/O引腳功能為復(fù)用推挽輸出、浮空輸入設(shè)置波特率,設(shè)置數(shù)據(jù)格式:數(shù)據(jù)位、停止位、校驗(yàn)位使用串口初始化函數(shù)USART_Init()初始化相應(yīng)串口利用串口使能函數(shù)USART_Cmd()使能相應(yīng)串口應(yīng)用程序編寫7.4.2USART串口應(yīng)用編程步驟
聲明GPIO和USART初始化結(jié)構(gòu)體USART_InitTypeDefUSART_InitStructure;1
串口所用的GPIO時(shí)鐘使能,串口時(shí)鐘使能開啟外設(shè)時(shí)鐘RCC_APB2PeriphClockCmd()。例如:使能USART1、GPIOA的時(shí)鐘,所用的函數(shù)為RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);27.4.2USART串口應(yīng)用編程步驟
設(shè)置I/O引腳功能為復(fù)用推挽輸出、浮空輸入串口使用的是I/O的復(fù)用功能。USART1的發(fā)送引腳為PA9,需將PA9配置為復(fù)用推挽輸出;USART1的輸入引腳為PA10,需將PA10配置為浮空輸入。3//USART1_TX,PA9,配置為復(fù)用推挽輸出,并初始化PA9GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
//復(fù)用推挽輸出GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1_RX,PA10,配置為浮空輸入,并初始化PA10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA107.4.2USART串口應(yīng)用編程步驟
設(shè)置波特率,設(shè)置數(shù)據(jù)格式:數(shù)據(jù)位、停止位、校驗(yàn)位USART_InitStructure.USART_BaudRate=115200;//串口波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;//設(shè)置數(shù)據(jù)位占8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//設(shè)置停止位占1位USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗(yàn)位//不采用硬件數(shù)據(jù)流控制USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//設(shè)置為收發(fā)模式47.4.2USART串口應(yīng)用編程步驟
使用串口初始化函數(shù)USART_Init()初始化相應(yīng)串口USART_Init(USART1,&USART_InitStructure);//初始化串口1USART15
利用串口使能函數(shù)USART_Cmd()使能相應(yīng)串口USART_Cmd(USART1,ENABLE);//使能串口6
應(yīng)用程序編寫若使用中斷,則編寫串口中斷函數(shù)voidUSART1_IRQHandler(void)77.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例應(yīng)用實(shí)例應(yīng)用實(shí)例一簡單實(shí)現(xiàn)串口通信應(yīng)用實(shí)例二重定向printf()函數(shù)和scanf()函數(shù)應(yīng)用實(shí)例三USART查詢方式7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例USART初始化頭文件USART_Init_Config.h,代碼如下:#ifndef__USART_INIT_CONFIG_H#define__USART_INIT_CONFIG_H#include"stm32f10x.h"voidUSART_Init_Config(void);#endif功能描述:
通過串口USART1實(shí)現(xiàn)簡單的收發(fā)功能。通過串口調(diào)試助手進(jìn)行數(shù)據(jù)的收發(fā)顯示。
應(yīng)用實(shí)例一——簡單實(shí)現(xiàn)串口通信編程代碼USART初始化頭文件USART_Init_Config.hUSART初始化程序USART_Init_Config.c文件主程序main.c文件7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例USART初始化程序USART_Init_Config.c文件#include<stdio.h>#include"USART_Init_Config.h"voidUSART_Init_Config(void){GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;//開啟GPIOA和USART1的時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//USART1_TX,設(shè)置PA9為復(fù)用輸出模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1_RX,設(shè)置PA10為浮空輸入模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;應(yīng)用實(shí)例一——簡單實(shí)現(xiàn)串口通信GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1參數(shù)配置USART_InitStructure.USART_BaudRate=115200;//設(shè)置波特率為115200USART_InitStructure.USART_WordLength=USART_WordLength_8b;//數(shù)據(jù)位占8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//1位停止位USART_InitStructure.USART_Parity=USART_Parity_No;//無校驗(yàn)USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);//初始化串口1USART_Cmd(USART1,ENABLE);//使能串口1}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例主程序main.c文件,代碼如下:#include"stm32f10x.h"#include<stdio.h>#include"led.h"#include"USART_Init_Config.h"intmain(void){LED_Init();USART_Init_Config();charTemp;while(1){if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){USART_ClearFlag(USART1,USART_FLAG_TC);Temp=USART_ReceiveData(USART1);USART_SendData(USART1,Temp);USART_ClearFlag(USART1,USART_FLAG_RXNE);} }}應(yīng)用實(shí)例一——簡單實(shí)現(xiàn)串口通信另一種實(shí)現(xiàn)方式:intmain(void){while(1){if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){ch=USART_ReceiveData(USART1);//接收數(shù)據(jù)USART_SendData(USART1,ch);//發(fā)送數(shù)據(jù)//循環(huán)等待發(fā)送完畢
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);}}}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例在嵌入式C語言開發(fā)中需要重新定義printf()函數(shù)和scanf()函數(shù),將標(biāo)準(zhǔn)的輸入和輸出重新定向到串口,才能實(shí)現(xiàn)串口輸出或LCD輸出。重定向printf()函數(shù)和scanf()函數(shù)也就是重寫fput()函數(shù)和fget()函數(shù)。應(yīng)用實(shí)例二——重定向printf()函數(shù)和scanf()函數(shù)
fputc()函數(shù)fgetc()函數(shù)函數(shù)原型intfputc(intch,FILE*f)intfgetc(FILE*f)功能將一個(gè)字符寫入到文件中從文件f中讀出一個(gè)字符參數(shù)ch為要輸出的字符,f指向FILE結(jié)構(gòu)的指針f指向FILE結(jié)構(gòu)的指針返回值發(fā)送成功,返回ch的值;失敗,則返回EOF(通常為-1)成功,則返回讀取的字符;失敗,則返回EOF(通常為-1)7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例重定向printf()函數(shù)和scanf()函數(shù),需要在串口初始化頭文件usart.h中添加#include<stdio.h>頭文件,同時(shí)在KeilMDK編譯器的Target中勾選UseMicroLIB。按照fget()函數(shù)和fput()函數(shù)的原型,重寫相應(yīng)的USART接口程序應(yīng)用實(shí)例二——重定向printf()函數(shù)和scanf()函數(shù)//重定向C庫函數(shù)printf()到串口intfputc(intch,FILE*f){/*發(fā)送一個(gè)字節(jié)數(shù)據(jù)到串口*/USART_SendData(DEBUG_USARTx,(uint8_t)ch);/*等待發(fā)送完畢*/while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_TXE)==RESET);return(ch);}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例使用上述代碼輸出字符串時(shí),會(huì)出現(xiàn)丟失第一個(gè)字符的現(xiàn)象,可以在發(fā)送字符前調(diào)用USART_ClearFlag()復(fù)位TC標(biāo)志位應(yīng)用實(shí)例二——重定向printf()函數(shù)和scanf()函數(shù)USART_ClearFlag(USARTx,USART_FLAG_TC);//重定向C庫函數(shù)scanf()到串口,重定向后可使用scanf()函數(shù)intfgetc(FILE*f){/*等待串口輸入數(shù)據(jù)*/while(USART_GetFlagStatus(DEBUG_USARTx,USART_FLAG_RXNE)==RESET); return(int)USART_ReceiveData(DEBUG_USARTx);}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例通過串口1利用查詢方式實(shí)現(xiàn)發(fā)送字符命令“Y”點(diǎn)亮LED燈,發(fā)送字符命令“N”熄滅LED燈。應(yīng)用實(shí)例三——USART查詢方式功能描述USART可以采用查詢方式進(jìn)行數(shù)據(jù)通信,根據(jù)各狀態(tài)寄存器的狀態(tài)決定下一步是否要執(zhí)行發(fā)送接收或轉(zhuǎn)入相應(yīng)錯(cuò)誤處理。7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例USART初始化頭文件USART_Init_Config.h,代碼如下:#ifndef__USART_INIT_CONFIG_H#define__USART_INIT_CONFIG_H#include"stm32f10x.h"voidUSART_Init_Config(void);#endif應(yīng)用實(shí)例三——USART查詢方式USART_Init_Config.hUSART_Init_Config.c文件main.c程序7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例USART初始化程序USART_Init_Config.c文件,代碼如下:#include<stdio.h>#include"USART_Init_Config.h"voidUSART_Init_Config(void){GPIO_InitTypeDefGPIO_InitStructure;USART_InitTypeDefUSART_InitStructure;//使能USART1和GPIOA的時(shí)鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);USART_DeInit(USART1);//復(fù)位串口1//USART1_TXPA9為復(fù)用推挽輸出GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//PA.9GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1_RX,PA10為浮空輸入
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;應(yīng)用實(shí)例三——USART查詢方式GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1參數(shù)配置:波特率115200,8位數(shù)據(jù)位,1位停止位,無校驗(yàn),不使用硬件流控制USART_InitStructure.USART_BaudRate=115200;USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=SART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例應(yīng)用實(shí)例三——USART查詢方式//重定向printf函數(shù)intfputc(intch,FILE*f){/*發(fā)送一個(gè)字節(jié)數(shù)據(jù)到USART1*/USART_SendData(USART1,(uint8_t)ch);/*等待發(fā)送寄存器為空*/
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); return(ch);}//重定向scanf函數(shù)intfgetc(FILE*f){/*等待串口1輸入數(shù)據(jù)*/while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);return(int)USART_ReceiveData(USART1);}7.4.3USART標(biāo)準(zhǔn)外設(shè)庫應(yīng)用實(shí)例main.c程序#include"stm32f10x.h"#include<stdio.h>#include"led.h"#include"USART_Init_Config.h"intmain(void){charch;//定義一個(gè)字符變量,用于接收字符LED_Init();//LED燈初始化USART_Init_Config();//USART初始化
while(1){ch=getchar();printf("接收到的指令%c\n",ch);應(yīng)用實(shí)例三——USART查詢方式switch(ch){case'N':GPIO_SetBits(GPIOB,GPIO_Pin_5);printf("熄滅LED燈\n");break;case'Y':GPIO_ResetBits(GPIOB,GPIO_Pin_5);printf("點(diǎn)亮LED燈\n");break;default:printf("請輸入正確的指令:N熄滅燈,Y點(diǎn)亮燈!\n");break;}}}7.5USART模塊的HAL庫接口函數(shù)及應(yīng)用7.5.1UART的HAL庫接口函數(shù)7.5.2USART的HAL庫應(yīng)用實(shí)例7.5.3USART模塊應(yīng)用實(shí)例拓展
7.5.1UART的HAL庫接口函數(shù)
UART模塊的HAL庫相關(guān)接口函數(shù)定義在源文件stm32f1xx_hal_uart.c中,在stm32f1xx_hal_uart.h頭文件中可以查看相關(guān)庫函數(shù)聲明以及相關(guān)的結(jié)構(gòu)體定義。
7.5.1UART的HAL庫接口函數(shù)USART模塊的HAL庫常用接口函數(shù)類型函數(shù)及功能描述引腳功能操作函數(shù)輪詢方式HAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);功能描述:串口輪詢模式發(fā)送函數(shù),使用超時(shí)管理機(jī)制HAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);功能描述:串口輪詢模式接收函數(shù),使用超時(shí)管理機(jī)制中斷方式HAL_UART_Transmit_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);功能描述:串口中斷模式發(fā)送函數(shù)HAL_UART_Receive_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);功能描述:串口中斷模式接收函數(shù)DMA方式HAL_UART_Transmit_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);功能描述:串口DMA模式發(fā)送函數(shù)HAL_UART_Receive_DMA(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize);功能描述:串口DMA模式接收函數(shù)HAL_UART_DMAPause(UART_HandleTypeDef*huart);功能描述:串口DMA模式暫停函數(shù)HAL_UART_DMAStop(UART_HandleTypeDef*huart);功能描述:串口DMA模式停止函數(shù)
7.5.1UART的HAL庫接口函數(shù)USART模塊的HAL庫常用接口函數(shù)類型函數(shù)及功能描述初始化及復(fù)位函數(shù)HAL_UART_Init(UART_HandleTypeDef*huart)功能描述:UART初始化函數(shù)HAL_UART_DeInit(UART_HandleTypeDef*huart)功能描述:UART復(fù)位函數(shù)中斷處理函數(shù)(回調(diào)函數(shù))voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);功能描述:UART中斷處理函數(shù)voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)發(fā)送完成時(shí)的回調(diào)函數(shù),用戶在該函數(shù)內(nèi)編寫中斷處理程序voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)發(fā)送一半時(shí)的回調(diào)函數(shù)voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)接收完成時(shí)的回調(diào)函數(shù),用戶在該函數(shù)內(nèi)編寫中斷處理程序voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)接收一半時(shí)的回調(diào)函數(shù)voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);功能描述:UART傳輸出現(xiàn)錯(cuò)誤時(shí)調(diào)用的回調(diào)函數(shù)外設(shè)狀態(tài)函數(shù)HAL_UART_GetState(UART_HandleTypeDef*huart);功能描述:獲取串口狀態(tài)函數(shù)HAL_UART_GetError(UART_HandleTypeDef*huart);功能描述:獲取串口錯(cuò)誤函數(shù)
7.5.1UART的HAL庫接口函數(shù)HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);UART發(fā)送函數(shù)HAL_UART_Transmit()采用串口2發(fā)送固定數(shù)據(jù),無限等待,間隔1s循環(huán)發(fā)送。constchar*Send_Data="WelcometoSchool!\r\n";HAL_UART_Transmit(&huart2,(uint8_t*)Send_Data,strlen(Send_Data),0xFFFF);HAL_Delay(1000);函數(shù)原型函數(shù)解析該函數(shù)為串口在輪詢方式下發(fā)送指定長度的數(shù)據(jù),采用超時(shí)管理機(jī)制,若超出設(shè)定值時(shí)數(shù)據(jù)還沒有發(fā)送完成,則不再發(fā)送,返回超時(shí)標(biāo)志(HAL_TIMEOUT)。使用范例
7.5.1UART的HAL庫接口函數(shù)UART發(fā)送函數(shù)HAL_UART_Transmit()HAL_UART_Transmit()共有四個(gè)參數(shù)第一個(gè)參數(shù)huart為結(jié)構(gòu)體類型UART_HandleTypeDef定義的指針,取值為huart1~huart5。第二個(gè)參數(shù)uint8_t*pData為要發(fā)送的數(shù)據(jù),pData為指向數(shù)據(jù)緩沖區(qū)的指針,類型為uint8_t,若發(fā)送的數(shù)據(jù)不是此類型,需要進(jìn)行類型轉(zhuǎn)換。第三個(gè)參數(shù)uint16_tSize為要發(fā)送數(shù)據(jù)的大小。第四個(gè)參數(shù)uint32_tTimeout為超時(shí)等待時(shí)間。
7.5.1UART的HAL庫接口函數(shù)HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);UART接收函數(shù)HAL_UART_Receive()uint8_tch;HAL_UART_Receive(&huart3,(uint8_t*)&ch,1,1000);函數(shù)原型函數(shù)解析
HAL_UART_Receive()為UART在輪詢模式下的接收函數(shù),采用超時(shí)管理機(jī)制,使用方式同HAL_UART_Transmit()使用范例
7.5.1UART的HAL庫接口函數(shù)HAL_StatusTypeDefHAL_UART_Receive_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize){if(huart->RxState==HAL_UART_STATE_READY)//如果串口處于空閑狀態(tài),則執(zhí)行以下語句
{
if((pData==NULL)||(Size==0U)){returnHAL_ERROR;}__HAL_LOCK(huart);//配置huart參數(shù)前先上鎖
/*以下為結(jié)構(gòu)體變量huart的參數(shù)配置 */
huart->pRxBuffPtr=pData;//設(shè)置緩存指針
huart->RxXferSize=Size;//設(shè)置接收數(shù)據(jù)數(shù)量
huart->RxXferCount=Size;//設(shè)置接收計(jì)數(shù)器
huart->ErrorCode=HAL_UART_ERROR_NONE;//ErrorCode設(shè)置為無錯(cuò)誤
huart->RxState=HAL_UART_STATE_BUSY_RX;//接收狀態(tài)設(shè)置為接收忙碌 UART中斷接收函數(shù)HAL_UART_Receive_IT()/*huart解鎖*/__HAL_UNLOCK(huart);/*使能UART的PE(奇偶檢驗(yàn)錯(cuò)誤)中斷*/__HAL_UART_ENABLE_IT(huart,UART_IT_PE);/*使能UART錯(cuò)誤中斷*/__HAL_UART_ENABLE_IT(huart,UART_IT_ERR);/*使能UART數(shù)據(jù)寄存器非空中斷*/__HAL_UART_ENABLE_IT(huart,UART_IT_RXNE);returnHAL_OK;//配置完成,則返回HAL_OK}else{returnHAL_BUSY;//若huart不是READY狀態(tài),則返回HAL_BUSY忙狀態(tài)
}}例:uint8_tRxBuffer[10];HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);實(shí)現(xiàn)簡單的STM32串口發(fā)送和接收數(shù)據(jù),調(diào)試此應(yīng)用實(shí)例,需要在PC機(jī)端安裝“串口調(diào)試助手”。實(shí)例效果:STM32目標(biāo)板每隔1s循環(huán)發(fā)送字符“歡迎來到串口通信模塊”到PC機(jī)上的串口助手。功能硬件設(shè)計(jì)通過STM32F103目標(biāo)板上的串口1實(shí)現(xiàn)與上位機(jī)的通信,可通過串口調(diào)試助手查看測試結(jié)果。
7.5.2USART的HAL庫應(yīng)用實(shí)例新建STM32CubeMX工程,選擇MCUSTM32CubeMX功能參數(shù)配置生成工程代碼編寫應(yīng)用程序下載調(diào)試驗(yàn)證軟件設(shè)計(jì)流程RCC和時(shí)鐘配置串口配置
7.5.2USART的HAL庫應(yīng)用實(shí)例軟件設(shè)計(jì)——新建STM32CubeMX工程,選擇MCU新建一個(gè)STM32CubeMx工程,選擇選擇MCU,這里選擇STM32F103ZETx芯片,讀者可根據(jù)自己的目標(biāo)板選擇相應(yīng)的芯片軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置HSE選擇“Crystal/CeramicResonator”(晶振/陶瓷諧振器RCC配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置通過圖形化方式直觀地對系統(tǒng)時(shí)鐘進(jìn)行配置,系統(tǒng)時(shí)鐘采用外部高速時(shí)鐘,配置STM32F103系列芯片最大時(shí)鐘為72MHz,配置APB2為72MHz,配置APB1為36MHz。時(shí)鐘配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“Connectivity”中選擇“USART1”;設(shè)置“Mode”為“Asynchronous”(異步傳輸模式)設(shè)置USART1的相關(guān)參數(shù),配置為默認(rèn)值:115200、8、None和1。串口配置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置USART1的發(fā)送引腳USART1_Tx默認(rèn)連接在PA9;接收引腳USART1_Rx默認(rèn)連接在PA10;在配置USART1時(shí)已經(jīng)將PA9引腳設(shè)置為復(fù)用推挽輸出,PA10設(shè)置為輸入模式。串口引腳參數(shù)設(shè)置軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“Configeration”配置頁面的“NVICSettings”中勾選“USART1globalinterrupt”。開啟串口USART1的中斷軟件設(shè)計(jì)——STM32CubeMX功能參數(shù)配置在“SystemCore”的“NVIC”中可選擇NVIC中斷優(yōu)先級(jí)分組,默認(rèn)為“4bitsforpre-amptionpriority”,勾選“USART1globalinterrupt”。選擇NVIC中斷優(yōu)先級(jí)分組軟件設(shè)計(jì)——生成工程代碼配置工程名稱、工程保存位置、選擇“MDK-ARMV5”編譯器等配置keil工程名稱和存放位置軟件設(shè)計(jì)——生成工程代碼在“CodeGenerator”選項(xiàng)欄中找到“Generatedfiles”框,勾選“Generateperipheralinitializationasapairof’.c/.h’filesperIP”,將外設(shè)初始化的代碼設(shè)置生成為獨(dú)立的.c源文件和.h頭文件。軟件設(shè)計(jì)——編寫應(yīng)用程序/*USERCODEBEGINPV*/uint8_tRxBuffer[10];uint8_tTxBuffer[10];/*USERCODEENDPV*/在main.c文件中添加代碼:在main.c文件中添加代碼。先定義兩個(gè)數(shù)組RxBuffer和TxBuffer,用于接收數(shù)據(jù)和發(fā)送數(shù)據(jù);在main.c文件的/*USERCODEBEGINPV*/和/*USERCODEENDPV*/之間添加代碼軟件設(shè)計(jì)——編寫應(yīng)用程序/*USERCODEBEGIN2*//*使能USART1接收,調(diào)用中斷處理函數(shù)*/HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);/*USERCODEEND2*/在intmain(void)函數(shù)中的/*USERCODEBEGIN2*/和/*USERCODEEND2*/之間添加代碼:/*USERCODEBEGIN4*/voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart){HAL_UART_Transmit(&huart1,(uint8_t*)&RxBuffer,1,0);HAL_UART_Receive_IT(&huart1,(uint8_t*)&RxBuffer,1);}/*USERCODEEND4*/中斷處理函數(shù)進(jìn)行相應(yīng)功能程序的處理,在/*USERCODEBEGIN4*/和/*USERCODEEND4*/之間添加代碼:基于HAL庫采用中斷控制方式實(shí)現(xiàn)上位機(jī)(PC)通過串口通信控制STM32目標(biāo)板上LED燈的亮滅,發(fā)送字符命令“Y”點(diǎn)亮LED燈,發(fā)送字符命令“N”熄滅LED燈。功能硬件設(shè)計(jì)使用STM32F103的串口1(USART1),PE5引腳連接一個(gè)LED燈。
7.5.3USART應(yīng)用實(shí)例拓展將PE5配置為“OutputPushPull”(推挽輸出),初始化電平為低電平
7.5.3USART應(yīng)用實(shí)例拓展首先定義一個(gè)字符變量Receive_data用于存放接收的字符,在main.c文件中的while()中添加如下程序代碼:while(1){/*USERCODEENDWHILE*//*USERCODEBEGIN3*/uint8_tReceive_data;//定義一個(gè)字符變量Receive_data=getchar();//獲取輸入的命令字符printf("TheReceiveorderis:%c\n",Receive_data);編寫應(yīng)用程序if(Receive_data=='Y')//發(fā)送字符命令Y,點(diǎn)亮LED燈{HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_RESET);printf("TheLEDisON!\r\n"); }elseif(Receive_data=='N')//發(fā)送字符命令N,熄滅LED燈{HAL_GPIO_WritePin(GPIOE,GPIO_PIN_5,GPIO_PIN_SET);printf("TheLEDisOFF!\r\n");}}/*USERCODEEND3*/
7.5.3USART應(yīng)用實(shí)例拓展//重定向C庫函數(shù)scanf()到串口,重定向后可使用scanf()函數(shù)intfgetc(FILE*f){uint8_tch=0;HAL_UART_Receive(&huart1,&ch,1,0xffff);returnch;}/*USERCODEEND1*/
編寫應(yīng)用程序重新編譯工程,無錯(cuò)誤無警告后,下載到目標(biāo)開發(fā)板進(jìn)行驗(yàn)證。
7.5.3USART應(yīng)用實(shí)例拓展7.6編程思想之自定義串口通信協(xié)議
復(fù)雜的通信控制往往是以數(shù)據(jù)幀為單位進(jìn)行傳
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026甘肅酒泉市玉門市招聘供熱人員15人參考題庫附答案
- 2026福建省面向東北林業(yè)大學(xué)選調(diào)生選拔工作考試備考題庫附答案
- 2026福建福州市羅源縣城市管理和綜合執(zhí)法局執(zhí)法輔助人員招聘參考題庫附答案
- 公共交通車輛安全駕駛操作制度
- 2026陜西省面向中南大學(xué)招錄選調(diào)生參考題庫附答案
- 2026青海班瑪縣面向社會(huì)招聘臨聘教師3人參考題庫附答案
- 中共玉山縣委社會(huì)工作部公開選調(diào)事業(yè)單位工作人員備考題庫附答案
- 中國汽研2026屆春招備考題庫附答案
- 南充市高坪區(qū)事業(yè)單位2025年公開考調(diào)工作人員的(6人)考試備考題庫附答案
- 瀘州市政府投資建設(shè)工程管理第一中心招聘編外聘用人員的備考題庫附答案
- 2024年4月自考00167勞動(dòng)法試題
- (正式版)SHT 3115-2024 石油化工管式爐輕質(zhì)澆注料襯里工程技術(shù)規(guī)范
- 高溫高壓CFB鍋爐安裝技術(shù)交底
- 防職場性騷擾培訓(xùn)課件
- 設(shè)備維護(hù)與管理培訓(xùn)課件
- 01管道儀表流程圖中常用圖例符號(hào)
- 如何組織臨床小講課(全科師資培訓(xùn)課程)
- 繼電保護(hù)課后習(xí)題答案第二版-張保會(huì)-尹項(xiàng)根
- 播種施肥機(jī)械
- 初中校本課程-【課堂實(shí)錄】美麗的24節(jié)氣教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- GB/T 12496.19-2015木質(zhì)活性炭試驗(yàn)方法鐵含量的測定
評(píng)論
0/150
提交評(píng)論