基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第8章 STM32通用同步異步收發(fā)器_第1頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第8章 STM32通用同步異步收發(fā)器_第2頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第8章 STM32通用同步異步收發(fā)器_第3頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第8章 STM32通用同步異步收發(fā)器_第4頁
基于STM32Cube的嵌入式系統(tǒng)應(yīng)用 課件 第8章 STM32通用同步異步收發(fā)器_第5頁
已閱讀5頁,還剩58頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第8章STM32通用同步/異步收發(fā)器本章講述了STM32通用同步異步收發(fā)器,包括串行通信基礎(chǔ)、STM32的USART工作原理、USART的HAL驅(qū)動程序、采用STM32Cube和HAL庫的USART串行通信應(yīng)用實(shí)例。8.1串行通信基礎(chǔ)在串行通信中,參與通信的兩臺或多臺設(shè)備通常共享一條物理通路。發(fā)送者依次逐位發(fā)送一串?dāng)?shù)據(jù)信號,按一定的約定規(guī)則為接收者所接收。由于串行端口通常只是規(guī)定了物理層的接口規(guī)范,所以為確保每次傳送的數(shù)據(jù)報(bào)文能準(zhǔn)確到達(dá)目的地,使每一個接收者能夠接收到所有發(fā)向它的數(shù)據(jù),必須在通信連接上采取相應(yīng)的措施。8.1.1串行異步通信數(shù)據(jù)格式無論是RS-232還是RS-485,均可采用通用異步收發(fā)數(shù)據(jù)格式。串行異步收發(fā)(UART)通信的數(shù)據(jù)格式如圖8-1所示。圖8-1串行異步收發(fā)(UART)通信的數(shù)據(jù)格式8.1.2串行同步通信數(shù)據(jù)格式同步通信是由1~2個同步字符和多字節(jié)數(shù)據(jù)位組成,同步字符作為起始位以觸發(fā)同步時(shí)鐘開始發(fā)送或接收數(shù)據(jù);多字節(jié)數(shù)據(jù)之間不允許有空隙,每位占用的時(shí)間相等;空閑位需發(fā)送同步字符。同步通信傳送的多字節(jié)數(shù)據(jù)由于中間沒有空隙,因而傳輸速度較快,但要求有準(zhǔn)確的時(shí)鐘來實(shí)現(xiàn)收發(fā)雙方的嚴(yán)格同步,對硬件要求較高,適用于成批數(shù)據(jù)傳送。串行同步收發(fā)通信的數(shù)據(jù)格式如圖8-2所示。圖8-2串行同步收發(fā)通信的數(shù)據(jù)格式通信是嵌入式系統(tǒng)的重要功能之一嵌入式系統(tǒng)中使用的通信接口有很多,如UART、SPI、I2C、USB和CAN等。其中,UART(UniversalAsynchronousReceiver/Transmitter,通用異步收發(fā)器)是最常見、最方便、使用最頻繁的通信接口。在嵌入式系統(tǒng)中,很多微控制器或者外設(shè)模塊都帶有UART接口。例如,STM32F407系列微控制器、6軸運(yùn)動處理組件MPU6050(包括3軸陀螺儀和3軸加速器)、超聲波測距模塊US-100、GPS模塊UBLOX、13.56MHz非接觸式IC卡讀卡模塊RC522等。8.2STM32的USART工作原理它們彼此通過UART相互通信交換數(shù)據(jù),但由于UART通信距離較短,一般僅能支持板級通信,因此,通常在UART的基礎(chǔ)上,經(jīng)過簡單擴(kuò)展或變換,就可以得到實(shí)際生活中常用的各種適于較長距離的串行數(shù)據(jù)通信接口,如R-S232、RS-485和IrDA等。出于成本和功能兩方面的考慮,目前大多的半導(dǎo)體廠商選擇在微控制器內(nèi)部集成UART模塊。ST有限公司的STM32F407系列微控制器也不例外,在它內(nèi)部配備了強(qiáng)大的UART模塊USART(UniversalSynchronous/AsynchronousReceiver/Transmitter,通用同步/異步收發(fā)器)。STM32F407的USART模塊不僅具備UART接口的基本功能,而且還支持同步單向通信、LIN(局部互聯(lián)網(wǎng))協(xié)議、智能卡協(xié)議、IrDASIR編碼/解碼規(guī)范、調(diào)制解調(diào)器(CTS/RTS)操作。8.2.1USART介紹通用同步/異步收發(fā)器可以說是嵌入式系統(tǒng)中除了GPIO外最常用的一種外設(shè)。USART常用的原因不在于其性能超強(qiáng),而是因?yàn)閁SART的簡單、通用。USART通信的另一個優(yōu)勢是可以適應(yīng)不同的物理層。例如,使用RS-232或RS-485可以明顯提升USART通信的距離,無線FSK調(diào)制可以降低布線施工的難度。所以USART口在工控領(lǐng)域也有著廣泛的應(yīng)用,是串行接口的工業(yè)標(biāo)準(zhǔn)(IndustryStandard)。SM32F407微控制器的小容量產(chǎn)品有2個USART,中等容量產(chǎn)品有3個USART,大容量產(chǎn)品有3個USART+2個UART(UniversalAsynchronousReceiver/Transmitter)。8.2.2USART的主要特性USART主要特性如下:(1)全雙工的,異步通信。(2)NRZ標(biāo)準(zhǔn)格式。(3)分?jǐn)?shù)波特率發(fā)生器系統(tǒng)。發(fā)送和接收共用的可編程波特率,最高達(dá)10.5Mb/s。(4)可編程數(shù)據(jù)字長度(8位或9位)。(5)可配置的停止位-支持1或2個停止位。(6)LIN主發(fā)送同步斷開符的能力以及LIN從檢測斷開符的能力。當(dāng)USART硬件配置成LIN時(shí),生成13位斷開符;檢測10/11位斷開符。(7)發(fā)送方為同步傳輸提供時(shí)鐘。(8)IRDASIR編碼器解碼器。在正常模式下支持3/16位的持續(xù)時(shí)間。(9)智能卡模擬功能。智能卡接口支持ISO7816-3標(biāo)準(zhǔn)里定義的異步智能卡協(xié)議;智能卡用到0.5和1.5個停止位。(10)單線半雙工通信。(11)可配置的使用DMA的多緩沖器通信。在SRAM里利用集中式DMA緩沖接收/發(fā)送字節(jié)。(12)單獨(dú)的發(fā)送器和接收器使能位。(13)檢測標(biāo)志。接收緩沖器滿;發(fā)送緩沖器空;傳輸結(jié)束標(biāo)志。(14)校驗(yàn)控制。發(fā)送校驗(yàn)位;對接收數(shù)據(jù)進(jìn)行校驗(yàn)。(15)四個錯誤檢測標(biāo)志。溢出錯誤;噪聲錯誤;幀錯誤;校驗(yàn)錯誤。(16)10個帶標(biāo)志的中斷源。CTS改變;LIN斷開符檢測;發(fā)送數(shù)據(jù)寄存器空;發(fā)送完成;接收數(shù)據(jù)寄存器滿;檢測到總線為空閑;溢出錯誤;幀錯誤;噪聲錯誤;校驗(yàn)錯誤。(17)多處理器通信。如果地址不匹配,則進(jìn)入靜默模式。(18)從靜默模式中喚醒。通過空閑總線檢測或地址標(biāo)志檢測。(19)兩種喚醒接收器的方式。地址位(MSB,第9位),總線空閑。8.2.3USART的功能STM32F407微控制器USART接口通過三個引腳與其他設(shè)備連接在一起,其內(nèi)部結(jié)構(gòu)如圖8-3所示。圖8-3USART結(jié)構(gòu)框圖(1)總線在發(fā)送或接收前應(yīng)處于空閑狀態(tài)。(2)一個起始位。(3)一個數(shù)據(jù)字(8或9位),最低有效位在前。(4)0.5,1.5,2個的停止位,由此表明數(shù)據(jù)幀的結(jié)束。(5)使用分?jǐn)?shù)波特率發(fā)生器-12位整數(shù)和4位小數(shù)的表示方法。(6)一個狀態(tài)寄存器(USART_SR)。(7)數(shù)據(jù)寄存器(USART_DR)。(8)一個波特率寄存器(USART_BRR),12位的整數(shù)和4位小數(shù)。(9)一個智能卡模式下的保護(hù)時(shí)間寄存器(USART_GTPR)。1.波特率控制波特率控制即圖8-3下部虛線框的部分。通過對USART時(shí)鐘的控制,可以控制USART的數(shù)據(jù)傳輸速度。通過改變USART外設(shè)時(shí)鐘源的分頻系數(shù)USARTDIV,可以設(shè)置USART的波特率。波特率決定了USART數(shù)據(jù)通信的速率,通過設(shè)置波特率寄存器(USART_BRR)來配置波特率。標(biāo)準(zhǔn)USART的波特率計(jì)算公式:波特率=fPCLK/(8x(2-OVER8)xUSARTDIV)式中,fpcLk是USART總線時(shí)鐘;OVER8是過采樣設(shè)置;USARTDIV是需要存儲在USART_BRR中的數(shù)據(jù)。一般根據(jù)需要的波特率計(jì)算USARTDIV,然后換算成存儲到USART_BRR的數(shù)據(jù)。2.收發(fā)控制收發(fā)控制即圖8-3的中間部分。該部分由若干個控制寄存器組成,如USART控制寄存器(controlregister)CR1、CR2、CR3和USART狀態(tài)寄存器(statusregister)SR等。通過向以上控制寄存器寫入各種參數(shù),控制USART數(shù)據(jù)的發(fā)送和接收。同時(shí),通過讀取狀態(tài)寄存器,可以查詢USART當(dāng)前的狀態(tài)。USART狀態(tài)的查詢和控制可以通過庫函數(shù)來實(shí)現(xiàn),因此,無須深入了解這些寄存器的具體細(xì)節(jié)(如各個位代表的意義),而只需學(xué)會使用USART相關(guān)的庫函數(shù)即可。3.數(shù)據(jù)存儲轉(zhuǎn)移數(shù)據(jù)存儲轉(zhuǎn)移即圖8-3上部灰色的部分。它的核心是兩個移位寄存器:發(fā)送移位寄存器和接收移位寄存器。這兩個移位寄存器負(fù)責(zé)收發(fā)數(shù)據(jù)并做并串轉(zhuǎn)換。(1)USART數(shù)據(jù)發(fā)送過程當(dāng)USART發(fā)送數(shù)據(jù)時(shí),內(nèi)核指令或DMA外設(shè)先將數(shù)據(jù)從內(nèi)存(變量)寫入發(fā)送數(shù)據(jù)寄存器TDR。然后,發(fā)送控制器適時(shí)地自動把數(shù)據(jù)從TDR加載到發(fā)送移位寄存器,將數(shù)據(jù)一位一位地通過Tx引腳發(fā)送出去。(2)USART數(shù)據(jù)接收過程USART數(shù)據(jù)接收是USART數(shù)據(jù)發(fā)送的逆過程。當(dāng)USART接收數(shù)據(jù)時(shí),數(shù)據(jù)從Rx引腳一位一位地輸入到接收移位寄存器中。然后,接收控制器自動將接收移位寄存器的數(shù)據(jù)轉(zhuǎn)移到接收數(shù)據(jù)寄存器RDR中。最后,內(nèi)核指令或DMA將接收數(shù)據(jù)寄存器RDR的數(shù)據(jù)讀入內(nèi)存(變量)中。8.2.4USART的通信時(shí)序字長可以通過編程USART_CR1寄存器中的M位,選擇8或9位,如圖8-4所示。圖8-4中的LBCL,最后一位時(shí)鐘脈沖(Lastbitclockpulse),為控制寄存器2(USART_CR2)的位8。在同步模式下,該位用于控制是否在CK引腳上輸出最后發(fā)送的那個數(shù)據(jù)位(最高位)對應(yīng)的時(shí)鐘脈沖。0:最后一位數(shù)據(jù)的時(shí)鐘脈沖不從CK輸出;1:最后一位數(shù)據(jù)的時(shí)鐘脈沖會從CK輸出。(2)UART4和UART5上不存在這一位。

圖8-4USART通信時(shí)序8.2.5USART的中斷STM32F407系列微控制器的USART主要有以下各種中斷事件:(1)發(fā)送期間的中斷事件包括發(fā)送完成(TC)、清除發(fā)送(CTS)、發(fā)送數(shù)據(jù)寄存器空(TXE)。(2)接收期間:空閑總線檢測(IDLE)、溢出錯誤(ORE)、接收數(shù)據(jù)寄存器非空(RXNE)、校驗(yàn)錯誤(PE)、LIN斷開檢測(LBD)、噪聲錯誤(NE,僅在多緩沖器通信)和幀錯誤(FE,僅在多緩沖器通信)。如果設(shè)置了對應(yīng)的使能控制位,這些事件就可以產(chǎn)生各自的中斷,如表8-1所示。中斷事件事件標(biāo)志使能位發(fā)送數(shù)據(jù)寄存器空TXETXEIECTS標(biāo)志CTSCTSIE發(fā)送完成TCTCIE接收數(shù)據(jù)就緒可讀RXNERXNEIE檢測到數(shù)據(jù)溢出OREOREIE檢測到空閑線路IDLEIDLEIE奇偶檢驗(yàn)錯PEPEIE斷開標(biāo)志LBDLBDIE噪聲標(biāo)志、溢出錯誤和幀錯誤NE或ORT或FEEIE表8-1STM32F407系列微控制器USART的中斷事件及其使能標(biāo)志位8.2.6USART的相關(guān)寄存器現(xiàn)將STM32F407的USART相關(guān)寄存器名稱介紹如下,可以用半字(16位)或字(32位)的方式操作這些外設(shè)寄存器,由于采用庫函數(shù)方式編程,故不做進(jìn)一步的探討。(1)狀態(tài)寄存器(USART_SR)。(2)數(shù)據(jù)寄存器(USART_DR)。(3)波特比率寄存器(USART_BRR)。(4)控制寄存器1(USART_CR1)。(5)控制寄存器2(USART_CR2)。(6)控制寄存器3(USART_CR3)。(7)保護(hù)時(shí)間和預(yù)分頻寄存器(USART_GTPR)。8.3.1常用功能函數(shù)串口的驅(qū)動程序頭文件是stm32f4xx_hal_uart.h。串口操作的常用HAL函數(shù)如表8-2所示。8.3USART的HAL驅(qū)動程序分組函數(shù)名功能說明初始化和總體功能

HAL_UART_Init()串口初始化,設(shè)置串口通信參數(shù)HAL_UART_MspInit()串口初始化的MSP弱函數(shù),在HAL_UART_Init()中被調(diào)用。重新實(shí)現(xiàn)的這個函數(shù)一般用于串口引腳的GPIO初始化和中斷設(shè)置HAL_UART_GetState()獲取串口當(dāng)前狀態(tài)HAL_UART_GetError()返回串口錯誤代碼HAL_UART_Transmit()阻塞方式發(fā)送一個緩沖區(qū)的數(shù)據(jù),發(fā)送完成或超時(shí)后才返回HAL_UART_Receive()阻塞方式將數(shù)據(jù)接收到一個緩沖區(qū),接收完成或超時(shí)后才返回阻塞式傳輸HAL_UART_Transmit_IT()以中斷方式(非阻塞式)發(fā)送一個緩沖區(qū)的數(shù)據(jù)HAL_UART_Receive_IT()以中斷方式(非阻塞式)將指定長度的數(shù)據(jù)接收到緩沖區(qū)中斷方式傳輸HAL_UART_Transmit_DMA()以DMA方式發(fā)送一個緩沖區(qū)的數(shù)據(jù)HAL_UART_Receive_DMA()以DMA方式將指定長度的數(shù)據(jù)接收到緩沖區(qū)DMA方式傳輸HAL_UART_Transmit_DMA()以DMA方式發(fā)送一個緩沖區(qū)的數(shù)據(jù)HAL_UART_Receive_DMA()以DMA方式將指定長度的數(shù)據(jù)接收到緩沖區(qū)表8-2串口操作的常用HAL函數(shù)HAL_UART_DMAPause()暫停DMA傳輸過程HAL_UART_DMAResume()繼續(xù)先前暫停的DMA傳輸過程HAL_UART_DMAStop()停止DMA傳輸過程HAL_UART_Abort()終止以中斷方式或DMA方式啟動的傳輸過程,函數(shù)自身以阻塞方式運(yùn)行HAL_UART_AbortTransmit()終止以中斷方式或DMA方式啟動的數(shù)據(jù)發(fā)送過程,函數(shù)自身以阻塞方式運(yùn)行HAL_UART_AbortReceive()終止以中斷方式或DMA方式啟動的數(shù)據(jù)接收過程,函數(shù)自身以阻塞方式運(yùn)行HAL_UART_Abort_IT()終止以中斷方式或DMA方式啟動的傳輸過程,函數(shù)自身以非阻塞方式運(yùn)行HAL_UART_AbortTransmit_IT()終止以中斷方式或DMA方式啟動的數(shù)據(jù)發(fā)送過程,函數(shù)自身以非阻塞方式運(yùn)行HAL_UART_AbortReceive_IT()終止以中斷方式或DMA方式啟動的數(shù)據(jù)接收過程,函數(shù)自身以非阻塞方式運(yùn)行1. 串口初始化函數(shù)HAL_UART_Init()用于串口初始化,主要是設(shè)置串口通信參數(shù)。其原型定義如下:HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart)2. 阻塞式數(shù)據(jù)傳輸串口數(shù)據(jù)傳輸有兩種模式:阻塞模式和非阻塞模式。(1)阻塞模式(blockingmode)就是輪詢模式,例如,使用函數(shù)HAL_UART_Transmit()發(fā)送一個緩沖區(qū)的數(shù)據(jù)時(shí),這個函數(shù)會一直執(zhí)行,直到數(shù)據(jù)傳輸完成或超時(shí)之后,函數(shù)才返回。(2)非阻塞模式(non-blockingmode)是使用中斷或DMA方式進(jìn)行數(shù)據(jù)傳輸,例如,使用函數(shù)HAL_UART_Transmit_IT()啟動一個緩沖區(qū)的數(shù)據(jù)傳輸后,該函數(shù)立刻返回。數(shù)據(jù)傳輸?shù)倪^程引發(fā)各種事件中斷,用戶在相應(yīng)的回調(diào)函數(shù)里進(jìn)行處理。以阻塞模式發(fā)送數(shù)據(jù)的函數(shù)是HAL_UART_Transmit(),其原型定義如下:HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout)3. 非阻塞式數(shù)據(jù)傳輸以中斷或DMA方式啟動的數(shù)據(jù)傳輸是非阻塞式的。我們將在第12章介紹DMA方式,在本章只介紹中斷方式。以中斷方式發(fā)送數(shù)據(jù)的函數(shù)是HAL_UART_Transmit_IT(),其原型定義如下:HAL_StatuaTypeDetHAL_UART_Transmit_IT(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize)8.3.2常用的宏函數(shù)在HAL驅(qū)動程序中,每個外設(shè)都有一些以“_HAL”為前綴的宏函數(shù)。這些宏函數(shù)直接操作寄存器,主要是進(jìn)行啟用或禁用外設(shè)、開啟或禁止事件中斷、判斷和清除中斷標(biāo)志位等操作。串口操作常用的宏函數(shù)如表8-3所示。宏函數(shù)功能描述_HAL_UART_ENABLE(_HANDLE_)啟用某個串口,例如_HAL_UART_ENABLE(&huart1)_HAL_UART_DISABLE(_HANDLE_)禁用某個串口,例如_HAL_UART_DISABLE(&huartl)_HAL_UART_ENABLE_IT(_HANDLE,INTERRUPT)允許某個事件產(chǎn)生硬件中斷,例如_HAL_UART_ENABLE_IT(&huartl,UART_IT_IDLE)_HAL_UART_ENABLE_IT(_HANDLE,INTERRUPT)禁止某個事件產(chǎn)生硬件中斷,例如_HAL_UART_ENABLE_IT(&huartl,UART_IT_IDLE)_HAL_UART_GET_IT_SOURCE(_HANDLE,IT)檢查某個事件是否被允許產(chǎn)生硬件中斷_HAL_UART_GET_FLAG(HANDLE,FLAG_)檢查某個事件的中斷標(biāo)志位是否被置位_HAL_UART_CLEAR_FLAG(HANDLE,FLAG)清除某個事件的中斷標(biāo)志位表8-3串口操作常用的宏函數(shù)這些宏函數(shù)中的參數(shù)_HANDLE_是串口外設(shè)對象指針,參數(shù)_INTERRUPT_和_IT_都是中斷事件類型。一個串口只有一個中斷號,但是中斷事件類型較多,文件stm32f4xx_h(yuǎn)al_uart.h定義了這些中斷事件類型的宏,全部中斷事件類型定義如下:#defineUART_IT_PE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_PEIE))#defineUART_IT_TXE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_TXEIE))#defineUART_IT_TC((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_TCIE))#defineUART_IT_RXNE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_RXNEIE))#defineUART_IT_IDLE((uint32_t)(UART_CR1_REG_INDEX<<28U|USART_CR1_IDLEIE))#defineUART_IT_LBD((uint32_t)(UART_CR2_REG_INDEX<<28U|USART_CR2_LBDIE))#defineUART_IT_CTS((uint32_t)(UART_CR3_REG_INDEX<<28U|USART_CR3_CTSIE))#defineUART_IT_ERR((uint32_t)(UART_CR3_REG_INDEX<<28U|USART_CR3_EIE))

8.3.3中斷事件與回調(diào)函數(shù)一個串口只有一個中斷號,也就是只有一個ISR,例如,USART1的全局中斷對應(yīng)的ISR是USART1_IRQHandler()。在STM32CubeMX自動生成代碼時(shí),其ISR框架會在文件stm32f4xx_it.c中生成,代碼如下:voidUSART1_IRQHandler(void)//USART1中斷ISR{HAL_UART_IRQHandler(&huart1);//串口中斷通用處理函數(shù)}所有串口的ISR都是調(diào)用HAL_UART_IRQHandler()這個處理函數(shù),這個函數(shù)是中斷處理通用函數(shù)。這個函數(shù)會判斷產(chǎn)生中斷的事件類型、清除事件中斷標(biāo)志位、調(diào)用中斷事件對應(yīng)的回調(diào)函數(shù)。對函數(shù)HAL_UART_IRQHandler()進(jìn)行代碼跟蹤分析,整理出如表8-4所示的串口中斷事件類型與回調(diào)函數(shù)的對應(yīng)關(guān)系。注意,并不是所有中斷事件有對應(yīng)的回調(diào)函數(shù),例如,UART_IT_IDLE中斷事件就沒有對應(yīng)的回調(diào)函數(shù)。中斷事件類型宏定義中斷事件描述對應(yīng)的回調(diào)函數(shù)UARTIT_CTSCTS信號變化中斷無UARTIT_LBDLIN打斷檢測中斷無UART_IT_TXE發(fā)送數(shù)據(jù)寄存器非空中斷無UART_IT_TC傳輸完成中斷,用于發(fā)送完成HAL_UART_TxCpltCallback()UART_ITRXNE接收數(shù)據(jù)寄存器非空中斷HAL_UART_RxCpltCallback()UART_IT_IDLE線路空閑狀態(tài)中斷無UART_IT_PE奇偶校驗(yàn)錯誤中斷HAL_UART_ErrorCallback()UARTIT_ERR發(fā)生幀錯誤、噪聲錯誤、溢出錯誤的中斷HAL_UART_ErrorCallback()表8-4串口中斷事件類型及其回調(diào)函數(shù)STM32通常具有3個以上的串行通信口(USART),可根據(jù)需要選擇其中一個。在串行通信應(yīng)用的實(shí)現(xiàn)中,難點(diǎn)在于正確配置、設(shè)置相應(yīng)的USART。與51單片機(jī)不同的是,除了要設(shè)置串行通信口的波特率、數(shù)據(jù)位數(shù)、停止位和奇偶校驗(yàn)等參數(shù)外,還要正確配置USART涉及的GPIO和USART口本身的時(shí)鐘,即使能相應(yīng)的時(shí)鐘。否則,無法正常通信。8.4采用STM32Cube和HAL庫的USART串行通信應(yīng)用實(shí)例8.4.1STM32的USART的基本配置流程STM32F4的USART的功能有很多。最基本的功能就是發(fā)送和接收。其功能的實(shí)現(xiàn)需要串口工作方式配置、串口發(fā)送和串口接收三部分程序。本節(jié)只介紹基本配置,其他功能和技巧都是在基本配置的基礎(chǔ)上完成的,讀者可參考相關(guān)資料。HAL庫提供的串口相關(guān)操作函數(shù)。(1)串口參數(shù)初始化(波特率/停止位等),并使能串口。串口作為STM32的一個外設(shè),HAL庫為其配置了串口初始化函數(shù)。接下來看看串口初始化函數(shù)HAL_UART_Init相關(guān)知識,定義如下:HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDef*huart);(2)使能串口和GPIO口時(shí)鐘。要使用串口,所以必須使能串口時(shí)鐘和使用到的GPIO口時(shí)鐘。例如要使用串口1,所以必須使能串口1時(shí)鐘和GPIOA時(shí)鐘(串口1使用的是PA9和PA10)。(3)GPIO口初始化設(shè)置(速度,上下拉等)以及復(fù)用映射配置。在HAL庫中GPIO口初始化參數(shù)設(shè)置和復(fù)用映射配置是在函數(shù)HAL_GPIO_Init中一次性完成的。這里只需要注意,要復(fù)用PA9和PA10為串口發(fā)送接收相關(guān)引腳,需要配置GPIO口為復(fù)用,同時(shí)復(fù)用映射到串口1。配置源碼如下:GPIO_Initure.Pin=GPIO_PIN_9;//PA9GPIO_Initure.Mode=GPIO_MODE_AF_PP;//復(fù)用推挽輸出GPIO

Initure.Pull=GPIO_PULLUP;//上拉GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;//高速HAL_GPIO_Init(GPIOA,&GPIO_Initure);//初始化

PA9GPIO_Initure.Pin=GPIO_PIN_10;//PA10GPIO

Initure.Mode=GPIO_MODE_AF_INPUT;//模式要設(shè)置為復(fù)用輸入模式!HAL_GPIO_Init(GPIOA,&GPIO_Initure);//初始化

PA10(4)開啟串口相關(guān)中斷,配置串口中斷優(yōu)先級。HAL庫中定義了一個使能串口中斷的標(biāo)識符__HAL_UART_ENABLE_IT,可以把它當(dāng)一個函數(shù)來使用,具體定義請參考HAL庫文件stm32f4xx_hal_uart.h中該標(biāo)識符定義。例如要使能接收完成中斷,方法如下:HAL_UART_ENABLE_IT(huart,UART_IT_RXNE); //開啟接收完成中斷(5)編寫中斷服務(wù)函數(shù)。串口1中斷服務(wù)函數(shù)為:voidUSART1_IRQHandler(void);當(dāng)發(fā)生中斷的時(shí)候,程序就會執(zhí)行中斷服務(wù)函數(shù)。然后在中斷服務(wù)函數(shù)中編寫們相應(yīng)的邏輯代碼即可。(6)串口數(shù)據(jù)接收和發(fā)送。STM32F4的發(fā)送與接收是通過數(shù)據(jù)寄存器USART_DR來實(shí)現(xiàn)的,這是一個雙寄存器,包含了TDR和RDR。當(dāng)向該寄存器寫數(shù)據(jù)的時(shí)候,串口就會自動發(fā)送,當(dāng)收到數(shù)據(jù)的時(shí)候,也是存在該寄存器內(nèi)。HAL庫操作USART_DR寄存器發(fā)送數(shù)據(jù)的函數(shù)是:HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);通過該函數(shù)向串口寄存器USART_DR寫入一個數(shù)據(jù)。HAL庫操作USART_DR寄存器讀取串口接收到的數(shù)據(jù)的函數(shù)是:HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDef*huart,uint8_t*pData,uint16_tSize,uint32_tTimeout);通過該函數(shù)可以讀取串口接收到的數(shù)據(jù)。8.4.2USART串行通信應(yīng)用的硬件設(shè)計(jì)為利用USART實(shí)現(xiàn)開發(fā)板與計(jì)算機(jī)通信,需要用到一個USB轉(zhuǎn)USART的IC電路,選擇CH340G芯片來實(shí)現(xiàn)這個功能。CH340G是一個USB總線的轉(zhuǎn)接芯片,實(shí)現(xiàn)USB轉(zhuǎn)USART、USB轉(zhuǎn)IrDA紅外或者USB轉(zhuǎn)打印機(jī)接口。使用其USB轉(zhuǎn)USART功能,具體電路設(shè)計(jì)如圖8-6所示。將CH340G的TXD引腳與USART1的RX引腳連接CH340G的RXD引腳與USART1的TX引腳連接。CH340G芯片集成在開發(fā)板上,其地線(GND)已與控制器的GND相連。在本實(shí)例中,編寫一個程序?qū)崿F(xiàn)STM32通過串口1和上位機(jī)對話,STM32在收到上位機(jī)發(fā)過來的字符串(以回車換行結(jié)束)后,會返回給上位機(jī)。同時(shí)每隔一定時(shí)間,通過串口1輸出一段信息到電腦。DS0閃爍,提示程序在運(yùn)行。圖8-6USB轉(zhuǎn)串行接口的硬件電路設(shè)計(jì)8.4.3 USART串行通信應(yīng)用的軟件設(shè)計(jì)STM32F407ZGT6有四個USART和兩個UART,其中USART1和USART6的時(shí)鐘來源于APB2總線時(shí)鐘,其最大頻率為84MHz,其他四個的時(shí)鐘來源于APB1總線時(shí)鐘,其最大頻率為42MHz。USART_InitTypeDef結(jié)構(gòu)體成員用于設(shè)置USART工作參數(shù),并由外設(shè)初始化配置函數(shù),比如MX_USART1_UART_Init()調(diào)用,這些設(shè)定參數(shù)將會設(shè)置外設(shè)相應(yīng)的寄存器,達(dá)到配置外設(shè)工作環(huán)境的目的。初始化結(jié)構(gòu)體定義在stm32f4xx_hal_usart.h文件中,初始化庫函數(shù)定義在stm32f4xx_hal_usart.c文件中,編程時(shí)可以結(jié)合這兩個文件內(nèi)注釋使用。USART_InitTypeDef結(jié)構(gòu)體如下。typedefstruct{uint32_tBaudRate;//波特率uint32_tWordLength;//字長uint32_tStopBits;//停止位uint32_tParity;//校驗(yàn)位uint32_tMode;//UART模式uint32_tHwFlowCtl;//硬件流控制uint32_tOverSampling;//過采樣模式}USART_InitTypeDef;1.通過STM32CubeMX新建工程通過STM32CubeMX新建工程的步驟如下:(1)新建文件夾Demo目錄下新建文件夾USART,這是保存新建工程的文件夾。(2)新建STM32CubeMX工程在STM32CubeMX開發(fā)環(huán)境中新建工程。(3)選擇MCU或開發(fā)板CommercialPartNumber和MCUs/MPUsList選擇STM32F407ZGT6,選擇StartProject啟動工程。(4)保存STM32CubeMX工程使用STM32CubeMX菜單File→SaveProject,保存工程。(5)生成報(bào)告使用STM32CubeMX菜單File→GenerateReport生成當(dāng)前工程的報(bào)告文件。(6)配置MCU時(shí)鐘樹STM32CubeMXPinout&Configuration子頁面下,選擇SystemCore→RCC,HighSpeedClock(HSE)根據(jù)開發(fā)板實(shí)際情況,選擇Crystal/CeramicResonator(晶體/陶瓷晶振)。(7)配置MCU外設(shè)首先配置USART1,STM32CubeMXPinout&Configuration子頁面下選擇Connectivity→USART1,對USART1進(jìn)行設(shè)置。Mode選擇Asynchronous,HardwareFlowControl(RS232)選擇Disable,ParameterSettings具體配置如圖8-7所示。圖8-7USART1配置頁面NVIC配置頁面如圖8-8所示。

圖8-8NVIC配置頁面CodeGeneration頁面Selectforinitsequenceordering欄勾選USART1globalinterrupt。NVICCodeGeneration配置頁面如圖8-9所示。

圖8-9NVICCodeGeneration配置頁面根據(jù)LED和USART1電路,整理出MCU連接的GPIO引腳的輸入/輸出配置,如表8-5所示。。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論