嵌入式系統(tǒng)基礎與實踐-基于 ARM Cortex-M3 內核的 STM32 微控制器(第2版) 課件 第7章 串口通信_第1頁
嵌入式系統(tǒng)基礎與實踐-基于 ARM Cortex-M3 內核的 STM32 微控制器(第2版) 課件 第7章 串口通信_第2頁
嵌入式系統(tǒng)基礎與實踐-基于 ARM Cortex-M3 內核的 STM32 微控制器(第2版) 課件 第7章 串口通信_第3頁
嵌入式系統(tǒng)基礎與實踐-基于 ARM Cortex-M3 內核的 STM32 微控制器(第2版) 課件 第7章 串口通信_第4頁
嵌入式系統(tǒng)基礎與實踐-基于 ARM Cortex-M3 內核的 STM32 微控制器(第2版) 課件 第7章 串口通信_第5頁
已閱讀5頁,還剩87頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章串口通信STM32本章知識與能力要求理解和掌握通信的基本概念;了解常見的串行通信接口;熟悉標準外設庫和HAL庫中有關USART的庫函數(shù);掌握STM32F103微控制器USART標準外設庫異步模式的配置方法;掌握USART查詢方式、中斷方式以及DMA方式三種方式的應用;掌握基于標準外設庫開發(fā)USART應用的方法;掌握基于HAL庫開發(fā)USART應用的方法。7.1通信概述7.2異步串行通信7.3STM32的USART模塊7.4USART模塊的標準外設庫接口函數(shù)及應用7.5USART模塊的HAL庫接口函數(shù)及應用7.6編程思想之自定義串口通信協(xié)議第7章串口通信7.1通信概述通信方式分類按數(shù)據(jù)傳送方式串行通信并行通信按通信數(shù)據(jù)同步方式同步通信異步通信按數(shù)據(jù)傳輸方向及與時間的關系單工通信半雙工通信全雙工通信7.1通信概述

串行通信(SerialTransmission),是指通過一根數(shù)據(jù)線或少量數(shù)據(jù)線(少于8根)將數(shù)據(jù)一位一位地按順序依次傳送。

并行通信(ParallelTransmission),是指用多條數(shù)據(jù)線同時傳送多位數(shù)據(jù),通常以8位、16位、32位等數(shù)據(jù)位傳送。串行通信與并行通信7.1通信概述

并行通信一次可傳輸多個數(shù)據(jù)位的數(shù)據(jù),并行通信傳輸數(shù)據(jù)量是串行傳輸?shù)臄?shù)倍,如早期的并行接口的硬盤、打印機,采用PCI(PeripheralComponentInterconnect,外設部件互連標準)并行接口的顯卡等。并行傳輸?shù)娜秉c長距離傳輸成本較高;信號線之間的干擾大,傳輸速率很難達到很高;體積大,占用空間大,不利于設備的小型化、微型化。計算機內部的總線結構,即CPU與內部寄存器及接口之間采用并行傳輸。7.1通信概述串行通信是目前最為流行的一種通信方式,如U盤以及采用USB接口的設備、工業(yè)上常用的RS-485和RS-232等,都是串行通信設備。USB的串行通信接口U盤的串行通信接口計算機網(wǎng)絡中所使用的傳輸方式均是串行傳輸,單片機與外設之間也大多采用各類串行接口,比如USART、USB、IIC、SPI等。7.1通信概述同步通信與異步通信

同步通信是連續(xù)串行傳送數(shù)據(jù)的通信方式,要求收發(fā)雙方的時鐘必須保持嚴格的同步。

特點:輸速率較高

異步通信在發(fā)送的有效數(shù)據(jù)中增加一些用于同步的控制位,比如開始位和停止位等,數(shù)據(jù)以字符為單位組成數(shù)據(jù)幀進行傳送,收發(fā)雙方需約定數(shù)據(jù)的傳輸速率。特點:

傳輸效率較低;通信設備實現(xiàn)簡單、成本低。7.1通信概述單工、半雙工、全雙工通信根據(jù)數(shù)據(jù)傳輸方向以及與時間的關系,串行通信可以分為單工、半雙工和全雙工三種通信方式。通信方式描述舉例單工任何時刻都只能單方向通信的工作方式,即一端固定為發(fā)送端,另一端固定為接收端燈塔、廣播和電視半雙工兩個設備均可以收發(fā)數(shù)據(jù),但不能在同一時刻進行對講機全雙工兩個設備可以同時收發(fā)數(shù)據(jù)手機7.1通信概述通信傳輸速率每秒傳輸?shù)亩M制位數(shù),單位為比特每秒(bit/s,bps),是衡量串行數(shù)據(jù)傳輸速度快慢的指標。波特率每秒所傳輸?shù)淖址麛?shù):波特率=字符速率×每個字符包含的位數(shù)字符速率為120字符/秒,若每個字符包含10位(1個起始位,7個數(shù)據(jù)位,1個校驗位,1個結束位),則波特率為10位/字符×120字符/秒=1200bps。字符速率常用的串口傳輸速率(波特率)有1200、2400、4800、9600、19200和115200等。舉例7.2異步串行通信目錄7.2.1異步串行通信協(xié)議7.2.2異步串行通信接口異步串行通信標準的數(shù)據(jù)幀由起始位、數(shù)據(jù)位、校驗位、停止位四部分組成。數(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位。校驗位:占一位,用于檢測數(shù)據(jù)是否有效。停止位:一幀傳送結束的標志,根據(jù)實際情況定,可以是1、1.5或2位??臻e位:數(shù)據(jù)傳輸完畢,用“1”表示當前線路上沒有數(shù)據(jù)傳輸。7.2.1異步串行通信協(xié)議7.2.1異步串行通信接口

UART(UniversalAsynchronousReceiverTransmitter,通用異步收發(fā)傳輸器)是一個全雙工通用異步串行收/發(fā)模塊,主要用于打印程序調試信息、上位機和下位機的通信以及ISP程序下載等場合。

UART至少需要兩根數(shù)據(jù)線用于通信雙方進行數(shù)據(jù)雙向同時傳輸,最簡單的UART接口由TxD、RxD、GND共3根線組成。其中,TxD用于發(fā)送數(shù)據(jù),RxD用于接收數(shù)據(jù),GND為信號地線,通過交叉連接實現(xiàn)兩個芯片間的串口通信。RS-232是美國電子工業(yè)協(xié)會(EIA,ElectronicIndustryAssociation)制定的串行通信物理接口標準,規(guī)定了相應的電氣特性和物理特性,通常采用DB-9或DB-25的形式,以DB-9最為常見。外形針腳號符號功能1DCD數(shù)據(jù)載波檢測,輸入2RxD接收數(shù)據(jù),輸入3TxD發(fā)送數(shù)據(jù),輸出4DTR數(shù)據(jù)終端準備就緒,輸出5GND信號地6DSR數(shù)據(jù)設備準備就緒,輸入7RTS請求發(fā)送,輸出8CTS清除發(fā)送,輸入9RI振鈴指示,輸入7.2.1異步串行通信接口對可靠性要求不高的場合,DB-9通常采用三線制串口,僅需發(fā)送(Tx)、接收(Rx)和地(GND)三條線,即可實現(xiàn)全雙工通信,進行最基本的數(shù)據(jù)收發(fā)傳送,最高傳輸速率可達20kbps7.2.1異步串行通信接口

RS-232為異步串行通信接口,其電氣標準采用負邏輯,不能與TTL電平設備直接相連,而微控制器中的UART采用的是TTL電平標準,因此,RS-232與微控制器相連時必須進行電平轉換。7.2.1異步串行通信接口7.3STM32的USART模塊7.3.1USART內部結構7.3.2USART接口7.3.3USART編程模式USART內部功能實現(xiàn)由三部分構成:7.3.1USART內部結構波特率發(fā)生器發(fā)送器/接收器控制單元數(shù)據(jù)收發(fā)寄存器單元

通過USART_BRR寄存器實現(xiàn)串口通信數(shù)據(jù)傳輸速率的設置。

通過向USART的控制寄存器(ControlRegister)CR1、CR2、CR3和USART的狀態(tài)寄存器SR(StatusRegister)寫入相應的參數(shù),實現(xiàn)USART數(shù)據(jù)的發(fā)送和接收控制7.3.1USART內部結構波特率發(fā)生器發(fā)送器/接收器控制單元CR1主要用于配置USART的數(shù)據(jù)位、校驗位及中斷使能;CR2用于配置USART停止位以及SCLK時鐘控制;CR3主要涉及CTS硬件流控制和單字節(jié)/DMA多緩沖傳輸控制的配置。USART狀態(tài)寄存器SR各bit位所代表的含義7.3.1USART內部結構bit位寄存器名稱功能描述31-10保留,硬件強制設置為“0”9CTSCTS標志0:nCTS狀態(tài)線上沒有變化;1:nCTS狀態(tài)線上發(fā)生變化。8LBDLIN斷開檢測標志(LINbreakdetectionflag)0:沒有檢測到LIN斷開;1:檢測到LIN斷開。7TXE發(fā)送數(shù)據(jù)寄存器空(Transmitdataregisterempty)0:數(shù)據(jù)還沒有被轉移到移位寄存器;1:數(shù)據(jù)已經(jīng)被轉移到移位寄存器。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內部結構bit位寄存器名稱功能描述4IDLE監(jiān)測到總線空閑(IDLElinedetected)0:沒有檢測到空閑總線;1:檢測到空閑總線。3ORE過載錯誤(Overrunerror)0:沒有過載錯誤;1:檢測到過載錯誤2NE噪聲錯誤標志(Noiseerrorflag)0:沒有檢測到噪聲;1:檢測到噪聲。1FE幀錯誤(Framingerror)0:沒有檢測到幀錯誤;1:檢測到幀錯誤或者break符。0PE校驗錯誤(Parityerror)0:沒有奇偶校驗錯誤;1:奇偶校驗錯誤。

組成:發(fā)送數(shù)據(jù)寄存器(TDR)接收數(shù)據(jù)寄存器(RDR)發(fā)送移位寄存器接收移位寄存器7.3.1USART內部結構數(shù)據(jù)收發(fā)寄存器單元數(shù)據(jù)發(fā)送過程數(shù)據(jù)發(fā)送數(shù)據(jù)寄存器(TDR)發(fā)送移位寄存器觸發(fā)TXE中斷下一幀數(shù)據(jù)寫入TDR寄存器TC位被置位一幀發(fā)送結束傳送數(shù)據(jù)數(shù)據(jù)接收過程數(shù)據(jù)接收移位寄存器接收數(shù)據(jù)寄存器RXNE中斷RXNE位被清零準備接收下一幀處理數(shù)據(jù)7.3.2USART接口STM32F103大容量產(chǎn)品有5個串行通信接口,USART4和USART5為2個通用異步收發(fā)器,不支持同步模式,只有異步通信功能。USART模式USART1USART2USART3USART4USART5異步模式

(支持)

硬件流控制

(不支持)

多緩存通信(DMA)

多處理器通信

同步

智能卡

半雙工(單線模式)

IrDA

LIN

USART異步模式至少需要兩個引腳:Rx(接收數(shù)據(jù)引腳)和Tx(發(fā)送數(shù)據(jù)引腳),使用了復用I/O功能??偩€USARTx復用功能USART1_REMAP=0USART1_REMAP=1GPIO配置APB2總線USART1USART1_TXPA9PB6復用推挽輸出USART1_RXPA10PB7浮空輸入APB1總線USART2USART2_TXPA2PD5復用推挽輸出USART2_RXPA3PD6浮空輸入USART3USART3_TXPB10PC10復用推挽輸出USART3_RXPB11PC11浮空輸入7.3.2USART接口7.3.3

USART編程模式輪詢模式CPU不斷地查詢I/O設備是否準備就緒,如果準備就緒就發(fā)送,否則提示超時錯誤;會占用CPU的大量時間,效率低。中斷方式通過中斷請求線,在I/O設備準備就緒時向CPU發(fā)出中斷請求,CPU中止正在進行的工作轉向處理I/O設備的中斷事件中斷方式相比輪詢方式效率較高。DMA方式直接存儲器傳送,不經(jīng)過CPU直接在內存和外設之間進行批量數(shù)據(jù)交換,適用于高速大批量成組數(shù)據(jù)的傳輸;滿足高速I/O設備的傳輸要求,有利于提高CPU的利用率。通過定期或循環(huán)查詢USART狀態(tài)寄存器SR各位的狀態(tài),編寫應用程序對接收或發(fā)送的數(shù)據(jù)進行處理,有兩種方式實現(xiàn)對USART相關寄存器的操作:輪詢方式寄存器開發(fā)方式在編程代碼中直接配置這些功能寄存器基于庫的開發(fā)方式

間接對寄存器操作實現(xiàn)相應的USART通信功能7.3.3

USART編程模式USART主要有以下中斷事件:發(fā)送期間:發(fā)送完成、清除發(fā)送和發(fā)送數(shù)據(jù)寄存器空;接收期間:空閑總線檢測、溢出錯誤、接收數(shù)據(jù)寄存器非空、校驗錯誤、LIN斷開符號檢測、噪音標志(僅在多緩沖器通信)和幀錯誤(僅在多緩沖器通信)。中斷方式USART中斷映射7.3.3

USART編程模式中斷方式中斷標志中斷使能位STM32中的定義中斷事件TXETXEIEUART_IT_TXE發(fā)送數(shù)據(jù)寄存器空CTSCTSIEUART_IT_CTSCTS標志TCTCIEUART_IT_TC發(fā)送完成RXNERXNEIEUART_IT_RXNE接收數(shù)據(jù)就緒(可讀)ORETXNEIE

檢測到數(shù)據(jù)溢出IDLEIDLEIEUART_IT_IDLE檢測到空閑線路標志PEPEIEUART_IT_PE奇偶檢驗錯誤標志LBDLBDIEUART_IT_LBD斷開標志NE或ORT或PEEIEUART_IT_ERR噪聲標志,溢出錯誤和幀錯誤USART中斷事件及中斷使能標志位7.3.3

USART編程模式STM32F103微控制器的USART的發(fā)送和接收分別映射到不同的DMA通道上,如USART1_Rx被映射到DMA1的通道5,USART1_Tx被映射到DMA1的通道4。DMA方式USART模塊可通過DMA方式進行大批量數(shù)據(jù)的連續(xù)傳輸。7.3.3

USART編程模式7.4USART模塊的標準外設庫接口函數(shù)及應用7.4.1USART標準外設庫接口函數(shù)7.4.2USART串口應用編程步驟7.4.3USART標準外設庫應用實例

STM32的USART標準外設庫函數(shù)定義在STM32F10x標準外設庫的stm32f10x_usart.c文件中,其相應的stm32f10x_usart.h頭文件定義了USART相關的結構體和宏定義,并聲明了相關的標準外設庫函數(shù),共29種。

7.4.1USART標準外設庫接口函數(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標準外設庫接口函數(shù)USART初始化結構體結構體成員取值范圍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(校驗模式)USART_Parity_No(無校驗)USART_Parity_Even(偶校驗)USART_Parity_Odd(奇校驗)USART_Mode(收發(fā)模式)USART_Mode_Rx(接收模式)USART_Mode_Tx(發(fā)送模式)USART_HardwareFlowControl(硬件流控制)USART_HardwareFlowControl_None(不使用聯(lián)絡信號)USART_HardwareFlowControl_RTS(使用RTS)USART_HardwareFlowControl_CTS(使用CTS)USART_HardwareFlowControl_RTS_CTS(使用RTC和CTS)USART_InitTypeDef結構體成員及其取值

7.4.1USART標準外設庫接口函數(shù)USART初始化函數(shù)voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);例如:USART_Init(USART1,&USART_InitStructurer);//初始化串口1庫函數(shù)1USART初始化復位函數(shù)voidUSART_DeInit(USART_TypeDef*USARTx);當外設出現(xiàn)異常時,可以通過復位操作,對外設重新進行配置。例如:USART_DeInit(USART1);//復位串口1庫函數(shù)2

7.4.1USART標準外設庫接口函數(shù)USART使能函數(shù)voidUSART_Cmd(USART_TypeDef*USARTx,FunctionalStateNewState);例如:USART_Cmd(USART1,ENABLE);//使能串口1庫函數(shù)3USART發(fā)送單個數(shù)據(jù)函數(shù)voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);例如:USART_SendData(USART1,0x26);//通過串口1發(fā)送十六進制數(shù)據(jù)26H庫函數(shù)4

7.4.1USART標準外設庫接口函數(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);使用串口進行數(shù)據(jù)發(fā)送或接收時,先判斷狀態(tài)寄存器的狀態(tài)再進行下一步操作,該函數(shù)實現(xiàn)對指定的USART標志位是否設置進行檢查。例如:FlagStatusStatus;Status=USART_GetFlagStatus(USART1,USART_FLAG_TXE);庫函數(shù)6

7.4.1USART標準外設庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)函數(shù)USART_GetFlagStatus()有兩個輸入?yún)?shù):參數(shù)1:USARTx,可選為USART1、USART2或USART3;參數(shù)2:USART_FLAG為待檢測的USART標志位;函數(shù)返回值為SET(置位)或RESET(復位)。庫函數(shù)6USART_FLAG描述USART_FLAG_CTSCTS標志位USART_FLAG_LBDLIN中斷檢測標志位USART_FLAG_TXE發(fā)送數(shù)據(jù)寄存器空標志位USART_FLAG_TC發(fā)送完成標志位USART_FLAG_RXNE接收數(shù)據(jù)寄存器非空標志位USART_FLAG_IDLE空閑總線標志位USART_FLAG_ORE溢出錯誤標志位USART_FLAG_NE噪聲錯誤標志位USART_FLAG_FE幀錯誤標志位USART_FLAG_PE奇偶錯誤標志位

7.4.1USART標準外設庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)串口采用USART_SendData()函數(shù)發(fā)送數(shù)據(jù)時,要先判斷USART_FLAG_TXE(發(fā)送數(shù)據(jù)寄存器空標志位)或USART_FLAG_TC(發(fā)送完成標志位)的狀態(tài),等發(fā)送完成后再執(zhí)行后面的程序,具體實現(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標準外設庫接口函數(shù)USART獲取串口狀態(tài)函數(shù)采用USART_ReceiveData()函數(shù)進行接收數(shù)據(jù)時,要先判斷USART_FLAG_RXNE(接收數(shù)據(jù)寄存器非空標志位),非空時接收數(shù)據(jù),該位被置“1”時,表示有數(shù)據(jù)被接收,并可以讀出。具體代碼如下://判斷接收寄存器是否為空,非空接收數(shù)據(jù)if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){ch=USART_ReceiveData(USART1);//接收數(shù)據(jù)}庫函數(shù)6

7.4.1USART標準外設庫接口函數(shù)USART清除狀態(tài)標志函數(shù)voidUSART_ClearFlag(USART_TypeDef*USARTx,uint16_tUSART_FLAG);例如:USART_ClearFlag(USART1,USART_FLAG_TC);//清除串口1的TC狀態(tài)標志位庫函數(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標準外設庫接口函數(shù)USART串口中斷使能函數(shù)USART_ITConfig()函數(shù)的參數(shù):參數(shù)1:USARTx,可選為USART1、USART2或USART3;參數(shù)2:USART_IT為待檢測的USART標志位;參數(shù)3為ENABLE或DISABLE;函數(shù)返回值為SET(置位)或RESET(復位)。庫函數(shù)8USART_IT描述USART_IT_PE奇偶錯誤中斷USART_IT_TXE發(fā)送中斷USART_IT_TC傳輸完成中斷USART_IT_RXNE接收中斷USART_IT_IDLE空閑總線中斷USART_IT_LBDLIN中斷檢測中斷USART_IT_CTSCTS中斷USART_IT_ERR錯誤中斷

7.4.1USART標準外設庫接口函數(shù)USART獲取串口中斷狀態(tài)函數(shù)ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT);庫函數(shù)9若使能了中斷,則會設置狀態(tài)寄存器中的某個標志位,通過調用該函數(shù)來判斷是否是串口發(fā)送完成中斷,實現(xiàn)方式如下:USART_GetITStatus(USART1,USART_IT_TC);若返回值是SET,則說明串口1發(fā)送完成,產(chǎn)生了中斷。999

7.4.1USART標準外設庫接口函數(shù)USART清除串口中斷標志函數(shù)voidUSART_ClearITPendingBit(USART_TypeDef*USARTx,uint16_tUSART_IT);例如,復位發(fā)送完成中斷標志位: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串口應用編程步驟聲明GPIO和USART初始化結構體串口所用的GPIO時鐘使能,串口時鐘使能設置I/O引腳功能為復用推挽輸出、浮空輸入設置波特率,設置數(shù)據(jù)格式:數(shù)據(jù)位、停止位、校驗位使用串口初始化函數(shù)USART_Init()初始化相應串口利用串口使能函數(shù)USART_Cmd()使能相應串口應用程序編寫7.4.2USART串口應用編程步驟

聲明GPIO和USART初始化結構體USART_InitTypeDefUSART_InitStructure;1

串口所用的GPIO時鐘使能,串口時鐘使能開啟外設時鐘RCC_APB2PeriphClockCmd()。例如:使能USART1、GPIOA的時鐘,所用的函數(shù)為RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);27.4.2USART串口應用編程步驟

設置I/O引腳功能為復用推挽輸出、浮空輸入串口使用的是I/O的復用功能。USART1的發(fā)送引腳為PA9,需將PA9配置為復用推挽輸出;USART1的輸入引腳為PA10,需將PA10配置為浮空輸入。3//USART1_TX,PA9,配置為復用推挽輸出,并初始化PA9GPIO_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,PA10,配置為浮空輸入,并初始化PA10GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//浮空輸入GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化PA107.4.2USART串口應用編程步驟

設置波特率,設置數(shù)據(jù)格式:數(shù)據(jù)位、停止位、校驗位USART_InitStructure.USART_BaudRate=115200;//串口波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;

//設置數(shù)據(jù)位占8位USART_InitStructure.USART_StopBits=USART_StopBits_1;//設置停止位占1位USART_InitStructure.USART_Parity=USART_Parity_No;//無奇偶校驗位//不采用硬件數(shù)據(jù)流控制USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//設置為收發(fā)模式47.4.2USART串口應用編程步驟

使用串口初始化函數(shù)USART_Init()初始化相應串口USART_Init(USART1,&USART_InitStructure);//初始化串口1USART15

利用串口使能函數(shù)USART_Cmd()使能相應串口USART_Cmd(USART1,ENABLE);//使能串口6

應用程序編寫若使用中斷,則編寫串口中斷函數(shù)voidUSART1_IRQHandler(void)77.4.3USART標準外設庫應用實例應用實例應用實例一簡單實現(xiàn)串口通信應用實例二重定向printf()函數(shù)和scanf()函數(shù)應用實例三USART查詢方式7.4.3USART標準外設庫應用實例USART初始化頭文件USART_Init_Config.h,代碼如下:#ifndef__USART_INIT_CONFIG_H#define__USART_INIT_CONFIG_H#include"stm32f10x.h"voidUSART_Init_Config(void);#endif功能描述:

通過串口USART1實現(xiàn)簡單的收發(fā)功能。通過串口調試助手進行數(shù)據(jù)的收發(fā)顯示。

應用實例一——簡單實現(xiàn)串口通信編程代碼USART初始化頭文件USART_Init_Config.hUSART初始化程序USART_Init_Config.c文件主程序main.c文件7.4.3USART標準外設庫應用實例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的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);//USART1_TX,設置PA9為復用輸出模式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,設置PA10為浮空輸入模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;應用實例一——簡單實現(xiàn)串口通信GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1參數(shù)配置USART_InitStructure.USART_BaudRate=115200;

//設置波特率為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;//無校驗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標準外設庫應用實例主程序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);}

}}應用實例一——簡單實現(xiàn)串口通信另一種實現(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標準外設庫應用實例在嵌入式C語言開發(fā)中需要重新定義printf()函數(shù)和scanf()函數(shù),將標準的輸入和輸出重新定向到串口,才能實現(xiàn)串口輸出或LCD輸出。重定向printf()函數(shù)和scanf()函數(shù)也就是重寫fput()函數(shù)和fget()函數(shù)。應用實例二——重定向printf()函數(shù)和scanf()函數(shù)

fputc()函數(shù)fgetc()函數(shù)函數(shù)原型intfputc(intch,FILE*f)intfgetc(FILE*f)功能將一個字符寫入到文件中從文件f中讀出一個字符參數(shù)ch為要輸出的字符,f指向FILE結構的指針f指向FILE結構的指針返回值發(fā)送成功,返回ch的值;失敗,則返回EOF(通常為-1)成功,則返回讀取的字符;失敗,則返回EOF(通常為-1)7.4.3USART標準外設庫應用實例重定向printf()函數(shù)和scanf()函數(shù),需要在串口初始化頭文件usart.h中添加#include<stdio.h>頭文件,同時在KeilMDK編譯器的Target中勾選UseMicroLIB。按照fget()函數(shù)和fput()函數(shù)的原型,重寫相應的USART接口程序應用實例二——重定向printf()函數(shù)和scanf()函數(shù)//重定向C庫函數(shù)printf()到串口intfputc(intch,FILE*f){/*發(fā)送一個字節(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標準外設庫應用實例使用上述代碼輸出字符串時,會出現(xiàn)丟失第一個字符的現(xiàn)象,可以在發(fā)送字符前調用USART_ClearFlag()復位TC標志位應用實例二——重定向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標準外設庫應用實例通過串口1利用查詢方式實現(xiàn)發(fā)送字符命令“Y”點亮LED燈,發(fā)送字符命令“N”熄滅LED燈。應用實例三——USART查詢方式功能描述USART可以采用查詢方式進行數(shù)據(jù)通信,根據(jù)各狀態(tài)寄存器的狀態(tài)決定下一步是否要執(zhí)行發(fā)送接收或轉入相應錯誤處理。7.4.3USART標準外設庫應用實例USART初始化頭文件USART_Init_Config.h,代碼如下:#ifndef__USART_INIT_CONFIG_H#define__USART_INIT_CONFIG_H#include"stm32f10x.h"voidUSART_Init_Config(void);#endif應用實例三——USART查詢方式USART_Init_Config.hUSART_Init_Config.c文件main.c程序7.4.3USART標準外設庫應用實例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的時鐘RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);USART_DeInit(USART1);//復位串口1//USART1_TXPA9為復用推挽輸出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;應用實例三——USART查詢方式GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);//USART1參數(shù)配置:波特率115200,8位數(shù)據(jù)位,1位停止位,無校驗,不使用硬件流控制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標準外設庫應用實例應用實例三——USART查詢方式//重定向printf函數(shù)intfputc(intch,FILE*f){

/*發(fā)送一個字節(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標準外設庫應用實例main.c程序#include"stm32f10x.h"#include<stdio.h>#include"led.h"#include"USART_Init_Config.h"intmain(void){charch;//定義一個字符變量,用于接收字符LED_Init();//LED燈初始化USART_Init_Config();//USART初始化

while(1){ch=getchar();printf("接收到的指令%c\n",ch);應用實例三——USART查詢方式switch(ch){case'N':GPIO_SetBits(GPIOB,GPIO_Pin_5);printf("熄滅LED燈\n");break;case'Y':

GPIO_ResetBits(GPIOB,GPIO_Pin_5);printf("點亮LED燈\n");break;default:printf("請輸入正確的指令:N熄滅燈,Y點亮燈!\n");break;

}}}7.5USART模塊的HAL庫接口函數(shù)及應用7.5.1UART的HAL庫接口函數(shù)7.5.2USART的HAL庫應用實例7.5.3USART模塊應用實例拓展

7.5.1UART的HAL庫接口函數(shù)

UART模塊的HAL庫相關接口函數(shù)定義在源文件stm32f1xx_hal_uart.c中,在stm32f1xx_hal_uart.h頭文件中可以查看相關庫函數(shù)聲明以及相關的結構體定義。

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ù),使用超時管理機制HAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);功能描述:串口輪詢模式接收函數(shù),使用超時管理機制中斷方式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ù)及功能描述初始化及復位函數(shù)HAL_UART_Init(UART_HandleTypeDef*huart)功能描述:UART初始化函數(shù)HAL_UART_DeInit(UART_HandleTypeDef*huart)功能描述:UART復位函數(shù)中斷處理函數(shù)(回調函數(shù))voidHAL_UART_IRQHandler(UART_HandleTypeDef*huart);功能描述:UART中斷處理函數(shù)voidHAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)發(fā)送完成時的回調函數(shù),用戶在該函數(shù)內編寫中斷處理程序voidHAL_UART_TxHalfCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)發(fā)送一半時的回調函數(shù)voidHAL_UART_RxCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)接收完成時的回調函數(shù),用戶在該函數(shù)內編寫中斷處理程序voidHAL_UART_RxHalfCpltCallback(UART_HandleTypeDef*huart);功能描述:UART數(shù)據(jù)接收一半時的回調函數(shù)voidHAL_UART_ErrorCallback(UART_HandleTypeDef*huart);功能描述:UART傳輸出現(xiàn)錯誤時調用的回調函數(shù)外設狀態(tài)函數(shù)HAL_UART_GetState(UART_HandleTypeDef*huart);功能描述:獲取串口狀態(tài)函數(shù)HAL_UART_GetError(UART_HandleTypeDef*huart);功能描述:獲取串口錯誤函數(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ù)還沒有發(fā)送完成,則不再發(fā)送,返回超時標志(HAL_TIMEOUT)。使用范例

7.5.1UART的HAL庫接口函數(shù)UART發(fā)送函數(shù)HAL_UART_Transmit()HAL_UART_Transmit()共有四個參數(shù)第一個參數(shù)huart為結構體類型UART_HandleTypeDef定義的指針,取值為huart1~huart5。第二個參數(shù)uint8_t*pData為要發(fā)送的數(shù)據(jù),pData為指向數(shù)據(jù)緩沖區(qū)的指針,類型為uint8_t,若發(fā)送的數(shù)據(jù)不是此類型,需要進行類型轉換。第三個參數(shù)uint16_tSize為要發(fā)送數(shù)據(jù)的大小。第四個參數(shù)uint32_tTimeout為超時等待時間。

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ù),采用超時管理機制,使用方式同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ù)前先上鎖

/*以下為結構體變量huart的參數(shù)配置

*/

huart->pRxBuffPtr=pData;//設置緩存指針

huart->RxXferSize=Size;//設置接收數(shù)據(jù)數(shù)量

huart->RxXferCount=Size;//設置接收計數(shù)器

huart->ErrorCode=HAL_UART_ERROR_NONE;

//ErrorCode設置為無錯誤

huart->RxState=HAL_UART_STATE_BUSY_RX;

//接收狀態(tài)設置為接收忙碌

UART中斷接收函數(shù)HAL_UART_Receive_IT()

/*huart解鎖*/__HAL_UNLOCK(huart);/*使能UART的PE(奇偶檢驗錯誤)中斷*/__HAL_UART_ENABLE_IT(huart,UART_IT_PE);/*使能UART錯誤中斷*/__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);實現(xiàn)簡單的STM32串口發(fā)送和接收數(shù)據(jù),調試此應用實例,需要在PC機端安裝“串口調試助手”。實例效果:

STM32目標板每隔1s循環(huán)發(fā)送字符“歡迎來到串口通信模塊”到PC機上的串口助手。功能硬件設計通過STM32F103目標板上的串口1實現(xiàn)與上位機的通信,可通過串口調試助手查看測試結果。

7.5.2USART的HAL庫應用實例新建STM32CubeMX工程,選擇MCUSTM32CubeMX功能參數(shù)配置生成工程代碼編寫應用程序下載調試驗證軟件設計流程RCC和時鐘配置串口配置

7.5.2USART的HAL庫應用實例軟件設計——新建STM32CubeMX工程,選擇MCU新建一個STM32CubeMx工程,選擇選擇MCU,這里選擇STM32F103ZETx芯片,讀者可根據(jù)自己的目標板選擇相應的芯片軟件設計——STM32CubeMX功能參數(shù)配置HSE選擇“Crystal/CeramicResonator”(晶振/陶瓷諧振器RCC配置軟件設計——STM32CubeMX功能參數(shù)配置通過圖形化方式直觀地對系統(tǒng)時鐘進行配置,系統(tǒng)時鐘采用外部高速時鐘,配置STM32F103系列芯片最大時鐘為72MHz,配置APB2為72MHz,配置APB1為36MHz。時鐘配置軟件設計——STM32CubeMX功能參數(shù)配置在“Connectivity”中選擇“USART1”;設置“Mode”為“Asynchronous”(異步傳輸模式)設置USART1的相關參數(shù),配置為默認值:115200、8、None和1。串口配置軟件設計——STM32CubeMX功能參數(shù)配置USART1的發(fā)送引腳USART1_Tx默認連接在PA9;接收引腳USART1_Rx默認連接在PA10;在配置USART1時已經(jīng)將PA9引腳設置為復用推挽輸出,PA10設置為輸入模式。串口引腳參數(shù)設置軟件設計——STM32CubeMX功能參數(shù)配置在“Configeration”配置頁面的“NVICSettings”中勾選“USART1globalinterrupt”。開啟串口USART1的中斷軟件設計——STM32CubeMX功能參數(shù)配置在“SystemCore”的“NVIC”中可選擇NVIC中斷優(yōu)先級分組,默認為“4bitsforpre-amptionpriority”,勾選“USART1globalinterrupt”。選擇NVIC中斷優(yōu)先級分組軟件設計——生成工程代碼配置工程名稱、工程保存位置、選擇“MDK-ARMV5”編譯器等配置keil工程名稱和存放位置軟件設計——生成工程代碼在“CodeGenerator”選項欄中找到“Generatedfiles”框,勾選“Generateperipheralinitializationasapairof’.c/.h’filesperIP”,將外設初始化的代碼設置生成為獨立的.c源文件和.h頭文件。軟件設計——編寫應用程序/*USERCODEBEGINPV*/uint8_tRxBuffer[10];uint8_tTxBuffer[10];/*USERCODEENDPV*/在main.c文件中添加代碼:在main.c文件中添加代碼。先定義兩個數(shù)組RxBuffer和TxBuffer,用于接收數(shù)據(jù)和發(fā)送數(shù)據(jù);在main.c文件的/*USERCODEBEGINPV*/和/*USERCODEENDPV*/之間添加代碼軟件設計——編寫應用程序/*USERCODEBEGIN2*//*使能USART1接收,調用中斷處理函數(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ù)進行相應功能程序的處理,在/*USERCODEBEGIN4*/和/*USERCODEEND4*/之間添加代碼:基于HAL庫采用中斷控制方式實現(xiàn)上位機(PC)通過串口通信控制STM32目標板上LED燈的亮滅,發(fā)送字符命令“Y”點亮LED燈,發(fā)送字符命令“N”熄滅LED燈。功能硬件設計使用STM32F103的串口1(USART1),PE5引腳連接一個LED燈。

7.5.3USART應用實例拓展將PE5配置為“OutputPushPull”(推挽輸出),初始化電平為低電平

7.5.3USART應用實例拓展首先定義一個字符變量Receive_data用于存放接收的字符,在main.c文件中的while()中添加如下程序代碼:while(1){/*USERCODEENDWHILE*//*USERCODEBEGIN3*/uint8_tReceive_data;//定義一個字符變量Receive_data=getchar();//獲取輸入的命令字符printf("TheReceiveorderis:%c\n",Receive_data);編寫應用程序if(Receive_data=='Y')//發(fā)送字符命令Y,點亮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");}}/*USERCODEEN

溫馨提示

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

評論

0/150

提交評論