版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第二課
串口通信第二課
串口通信C串口簡(jiǎn)介串行接口簡(jiǎn)稱串口,也成串行通信接口,是采用串行通信方式的擴(kuò)展接口。串口的使用對(duì)于開發(fā)調(diào)試過(guò)程的作用是非常大的,串口可以用來(lái)查看、打印及輸出相關(guān)信息,使我們?cè)谇度胧介_發(fā)中最先與中央處理器通信的接口。串行通訊的特點(diǎn)是:數(shù)據(jù)位傳送,傳按位順序進(jìn)行,最少只需一根傳輸線即可完成,成本低但傳送速度慢。串行通訊的距離可以從幾米到幾千米。C串口簡(jiǎn)介串行接口簡(jiǎn)稱串口,也成串行通信接口,是采用串行通信C串口簡(jiǎn)介串行通訊又分為異步通訊和同步通訊兩種:同步串行是指ISP(interfaceSerialPeripheral)的縮寫。ISP總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息,TRM450是ISP接口。異步串行是指UART(UniversalAsynchronousReceiver/Transmitter),通用異步接收/發(fā)送。UART是一個(gè)并行輸入成為串行輸出的芯片,通常集成在主板上。UART包含TTL電平的串口和RS232電平的串口。串行接口按電氣標(biāo)準(zhǔn)及協(xié)議來(lái)分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422與RS-485標(biāo)準(zhǔn)只對(duì)接口的電氣特性做出規(guī)定,不涉及接插件、電纜或協(xié)議。在單片機(jī)中,主要使用異步通訊方式。C串口簡(jiǎn)介串行通訊又分為異步通訊和同步通訊兩種:C串口簡(jiǎn)介串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié),盡管比按字節(jié)(byte)的并行通信慢,但是串口可以再使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡(jiǎn)單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。
對(duì)于兩個(gè)進(jìn)行通信的端口,這些參數(shù)必須匹配:1、波特率:這是一個(gè)衡量通信速度的參數(shù),它表示每秒鐘傳送的bit的個(gè)數(shù)。例如300波特表示每秒鐘發(fā)送300個(gè)bit。C串口簡(jiǎn)介串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接CSTM32串口簡(jiǎn)介2、數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是5、7或8位(如何設(shè)置取決于你想傳送的信息:比如標(biāo)準(zhǔn)的ASCII碼是0~127(7位),擴(kuò)展的ASCII碼是0~255(8位))。3、停止位:用于表示單個(gè)包的最后一位。典型的值為1、1.5和2位。優(yōu)于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。CSTM32串口簡(jiǎn)介2、數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參CSTM32串口簡(jiǎn)介4、奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢錯(cuò)方式。有4中檢錯(cuò)方式:偶、奇、高和低。5、硬件流控制:硬件流控制常用的有RTS/CTS流控制盒DTR/DSR流控制。硬件流控制必須將相應(yīng)的電纜線接上,用RTS/CTS流控制時(shí),應(yīng)將通訊兩端的RTS、CTS線對(duì)應(yīng)相連。常用的流控制信號(hào)還有DTR/DSR。CSTM32串口簡(jiǎn)介4、奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢CSTM32串口簡(jiǎn)介STM32根據(jù)芯片型號(hào)的不同資源數(shù)量也不一樣,103VC系列最多可提供5路串口(本次著重講解串口1和串口2),有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持LIN、支持調(diào)制解調(diào)器操作、智能卡協(xié)議和IrDASIRENDEC規(guī)范、具有DMA等。STM32的串口與其他單片機(jī)的操作方式基本相同:1、開啟串口時(shí)鐘2、設(shè)置相應(yīng)I/O模式3、配置波特率、數(shù)據(jù)位長(zhǎng)度、奇偶校驗(yàn)位等CSTM32串口簡(jiǎn)介STM32根據(jù)芯片型號(hào)的不同資源數(shù)量也CSTM32串口原理圖CSTM32串口原理圖CSTM32UART庫(kù)函數(shù)CSTM32UART庫(kù)函數(shù)CSTM32串口時(shí)鐘使能串口作為STM32的一個(gè)外設(shè),其時(shí)鐘由外設(shè)時(shí)鐘使能寄存器控制,串口1的時(shí)鐘使能在APB2ENR寄存器,其他串口的時(shí)鐘使能位都在APB1ENR。(以串口1為例)而用庫(kù)函數(shù)則是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)CSTM32串口時(shí)鐘使能串口作為STM32的一個(gè)外設(shè),其時(shí)鐘CSTM32串口復(fù)位當(dāng)外設(shè)出現(xiàn)異常的時(shí)候可以通過(guò)復(fù)位寄存器里面的對(duì)應(yīng)位設(shè)置,實(shí)現(xiàn)該外設(shè)的復(fù)位,然后重新配置這個(gè)外設(shè)達(dá)到讓其重新工作的目的。一般在系統(tǒng)剛開始配置外設(shè)的時(shí)候都會(huì)先執(zhí)行復(fù)位該外設(shè)的操作。串口1的復(fù)位時(shí)通過(guò)配置APB2RSTR寄存器來(lái)實(shí)現(xiàn)的,其他的幾個(gè)串口都是通過(guò)PAB1RSTR寄存器來(lái)實(shí)現(xiàn)的。而用庫(kù)函數(shù)則是使用USART_DeInit(USART_TypeDef*USARTx)來(lái)實(shí)現(xiàn)的。USART_DeInit函數(shù)在stm32f10x_usart.c文件中。CSTM32串口復(fù)位當(dāng)外設(shè)出現(xiàn)異常的時(shí)候可以通過(guò)復(fù)位寄存器里CSTM32串口波特率設(shè)置STM32中每個(gè)串口都有一個(gè)自己獨(dú)立的波特率寄存器USART_BRR,通過(guò)設(shè)置該寄存器達(dá)到配置不同波特率的目的,該寄存器的各位描述如下:該寄存器中最低4為用來(lái)存放小數(shù)部分的DIV_Fraction,[15:4]這12位用來(lái)存放整數(shù)部分DIV_Mantissa。高16位未使用(圖片上小數(shù)整數(shù)有錯(cuò)誤,以英文手冊(cè)為準(zhǔn))。CSTM32串口波特率設(shè)置STM32中每個(gè)串口都有一個(gè)自己獨(dú)CSTM32串口波特率設(shè)置
CSTM32串口波特率設(shè)置
CSTM32串口控制STM32中每個(gè)串口都有3個(gè)控制寄存器USART_CR1~3,串口的很多配置都是通過(guò)這3個(gè)寄存器來(lái)設(shè)置的。這里我們只要用到USART_CR1就可以實(shí)現(xiàn)我們的功能了,其他的寄存器就不一一列出了。具體各位的功能及操作方法見STM32參考手冊(cè)的496~497頁(yè)。其中發(fā)送和接收的中斷都通過(guò)這個(gè)寄存器進(jìn)行使能。CSTM32串口控制STM32中每個(gè)串口都有3個(gè)控制寄存器UCSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收是通過(guò)數(shù)據(jù)寄存器USART_DR來(lái)實(shí)現(xiàn)的,這是一個(gè)雙寄存器,包含了發(fā)送和接收兩部分。當(dāng)向該寄存器寫數(shù)據(jù)時(shí),串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到數(shù)據(jù)的時(shí)候,也在該寄存器中。其中只用了低9位,其他位都保留且硬件強(qiáng)制為0。CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收是CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收在庫(kù)文件中分別有對(duì)應(yīng)的函數(shù),可直接調(diào)用,分別是:voidUSART_SendData(USART_TypeDef*USARTx,u8Data)u8USART_ReceiveData(USART_TypeDef*USARTx)CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收在CSTM32串口狀態(tài)STM32串口的狀態(tài)可通過(guò)狀態(tài)寄存器USART_SR讀取。這里我們關(guān)注一下三個(gè)位,第5、6、7位RXNE、TC和TXE。CSTM32串口狀態(tài)STM32串口的狀態(tài)可通過(guò)狀態(tài)寄存器USCSTM32串口
如果理解了以上寄存器等的講解,那么就可以對(duì)STM32進(jìn)行相關(guān)的設(shè)置和操作,就可以達(dá)到串口最基本的配置了,更詳細(xì)的介紹可參考《STM32參考手冊(cè)》。在很多串口操作中都可以直接調(diào)用printf函數(shù)打印輸出信息,但是在STM32中還需要進(jìn)行一些配置才可以。接下來(lái)我們首先會(huì)講解如何使用printf函數(shù)進(jìn)行輸出,然后再講解輸入輸出函數(shù)的使用方法。CSTM32串口如果理解了以上寄存器等的講解,那么就可以對(duì)CSTM32串口printf實(shí)現(xiàn)
本次試驗(yàn)采用UART1的查詢方式實(shí)現(xiàn):CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)采用UART1的查CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)中我們用到了GPIO、RCC、USART這三個(gè)外設(shè)的庫(kù)文件stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c,所以試驗(yàn)中如果你的庫(kù)文件stm32f10x_conf.h里面將相應(yīng)的頭文件注釋了就需要將需要用到的幾個(gè)頭文件的注釋去掉。
跟LED的操作一樣,首先是將相應(yīng)的I/O配置成串口模式,本次函數(shù)名為USART1_Config();CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)中我們用到了GPIOCSTM32串口printf實(shí)現(xiàn)
CSTM32串口printf實(shí)現(xiàn)CSTM32串口printf實(shí)現(xiàn)USART1_Config()主要做了如下工作:1、使能了串口1的時(shí)鐘2、配置了uart1的I/O3、配置了uart1的工作模式CSTM32串口printf實(shí)現(xiàn)USART1_ConfigCSTM32串口簡(jiǎn)介
上面的配置中將串口1的TX和RX引腳配置成AF_PP和IN_FLOATING模式,因?yàn)镽X是接收引腳所以設(shè)置沉高輸入模式。接下來(lái)將UART1的工作模式配置成波特率為115200(可自行更改),數(shù)據(jù)位長(zhǎng)度為8bit,停止位為1,無(wú)校驗(yàn)位。在使用printf函數(shù)之前還需要進(jìn)行一些操作。如果要printf函數(shù)工作的話,還需要把printf()重新定向到串口中,這部分工作是由fputc(intch,FILE*f)這個(gè)函數(shù)來(lái)完成的,這個(gè)函數(shù)在usart.c中實(shí)現(xiàn)。CSTM32串口簡(jiǎn)介上面的配置中將串口1的TX和RX引腳配CSTM32printf用法配置
在STM32中直接調(diào)用printf函數(shù)會(huì)出錯(cuò),需要進(jìn)行一些配置:1、在main文件中包含stdio.h2、重定義fputc函數(shù),如下:
//發(fā)送數(shù)據(jù)
intfputc(intch,FILE*f){
USART_SendData(USART1,(unsignedchar)ch);
while(!(USART1->SR&USART_FLAG_TXE));
return(ch);
}
3、在工程屬性的“Target”->“CodeGeneration”選項(xiàng)中勾選“UseMicroLIB””。CSTM32printf用法配置在STM32中直接調(diào)用prCSTM32printf用法配置
在這里講解一下fputc函數(shù)里面的代碼,我們前面提到過(guò)USART_SR寄存器的5、6、7三位,理解了這幾位的功能就可以大概理解串口是如何發(fā)送數(shù)據(jù)的了。CSTM32printf用法配置在這里講解一下fputc函CSTM32printf用法配置
當(dāng)TXE置位時(shí),就表示發(fā)送數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)移到了發(fā)送移位寄存器中,如果使能中斷的話就會(huì)產(chǎn)生中斷。當(dāng)RXNE置位時(shí)表示接受移位寄存器中的數(shù)據(jù)已經(jīng)移到接受數(shù)據(jù)寄存器中了,如果中斷使能的話則產(chǎn)生中斷。雖然fputc函數(shù)里面用到的是查詢模式,但道理是一樣的。我們先調(diào)用USART_SendData(USART1,(unsignedchar)ch)將我們要發(fā)送的數(shù)據(jù)送到TDR中,之后我們就等待TXE置位,當(dāng)TXE置位時(shí)就表示TDR中的數(shù)據(jù)轉(zhuǎn)移到了發(fā)送移位寄存器中了,發(fā)送移位寄存器中的數(shù)據(jù)會(huì)由串口硬件自動(dòng)發(fā)送,如此循環(huán),直到將我們要發(fā)送的數(shù)據(jù)全部發(fā)送完為止。CSTM32printf用法配置當(dāng)TXE置位時(shí),就表示發(fā)送CSTM32printf用法配置進(jìn)行上述設(shè)置之后就可以使用printf函數(shù)了如果設(shè)置成功,下載程序,將開發(fā)板的串口接到PC機(jī)上,打開串口調(diào)試助手,設(shè)置好波特率等參數(shù)就可以看到thisisauarttestdemo的字符。以上例程展示了如何使用printf函數(shù)發(fā)送字符串。CSTM32printf用法配置進(jìn)行上述設(shè)置之后就可以使用C
前面講解了printf函數(shù)的使用方法,接下來(lái)講解如何使用STM32的串口輸入輸出實(shí)現(xiàn)雙向通信。STM32串口的相關(guān)寄存器和原理在前面都有提到,這里就不再贅述,這里主要講解軟件的實(shí)現(xiàn)方法。首先我們講解查詢方式的發(fā)送和接收。C前面講解了printf函數(shù)的使用方法,接下來(lái)講解如何使用C
本實(shí)驗(yàn)中我們通過(guò)串口1持續(xù)等待接收數(shù)據(jù),當(dāng)接收到回車符時(shí)將接收到的內(nèi)容再通過(guò)串口發(fā)送出去。發(fā)送函數(shù):C本實(shí)驗(yàn)中我們通過(guò)串口1持續(xù)等待接收數(shù)據(jù),當(dāng)接收到回車符時(shí)C
發(fā)送有兩個(gè)函數(shù),分別是發(fā)送單個(gè)字符和發(fā)送字符串函數(shù),發(fā)送單個(gè)字符函數(shù)首先是將要發(fā)送的字符寫到緩存中,然后等待串口自動(dòng)發(fā)送完成,如果不等待發(fā)送完成就返回,則在字符串發(fā)送函數(shù)中函數(shù)會(huì)被連續(xù)循環(huán)調(diào)用多次,如果上一次發(fā)送的字節(jié)在寄存器中還沒有發(fā)送結(jié)束,此時(shí)再次寫入同樣的寄存器會(huì)將剛才的數(shù)據(jù)覆蓋掉,接收端將得不到預(yù)期的結(jié)果,所以需要等待發(fā)送完一個(gè)字符之后再發(fā)送下一個(gè)字符。發(fā)送字符串函數(shù)則是循環(huán)調(diào)用發(fā)送單個(gè)字符函數(shù),直到檢測(cè)到空格即表明字符串已發(fā)送完。C發(fā)送有兩個(gè)函數(shù),分別是發(fā)送單個(gè)字符和發(fā)送字符串函數(shù),發(fā)送C查詢接收函數(shù):接收函數(shù)首先是查詢寄存器中是否有數(shù)據(jù),如果有數(shù)據(jù)就將數(shù)據(jù)取出,然后清除相應(yīng)的標(biāo)志位,如果沒有數(shù)據(jù)就一直等待數(shù)據(jù)出現(xiàn)。C查詢接收函數(shù):C接下來(lái)就是在main函數(shù)中調(diào)用發(fā)送和接收函數(shù):首先設(shè)置系統(tǒng)時(shí)鐘,然后初始化USART1,然后循環(huán)讀取數(shù)據(jù),如果讀取到了數(shù)據(jù)則將數(shù)據(jù)再通過(guò)串口發(fā)送出去。如果操作成功,則通過(guò)串口調(diào)試助手發(fā)送一串?dāng)?shù)據(jù)可在接收區(qū)看到發(fā)送的數(shù)據(jù)。C接下來(lái)就是在main函數(shù)中調(diào)用發(fā)送和接收函數(shù):CSTM32串口中斷
接下來(lái)講解串口的中斷接收方式:在驅(qū)動(dòng)中頻繁的使用查詢方式接收數(shù)據(jù)不僅會(huì)降低系統(tǒng)的效率而且可能使系統(tǒng)崩潰。采取中斷方式可以很好地緩解這一問題。本次講解串口1的中斷接收方式:用串口中斷函數(shù)除了要初始化I/O和時(shí)鐘等,還要配置相應(yīng)的中斷及中斷函數(shù)。CSTM32串口中斷接下來(lái)講解串口的中斷接收方式:CSTM32串口中斷STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念:搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),也把響應(yīng)優(yōu)先級(jí)稱作“亞優(yōu)先級(jí)”或“副優(yōu)先級(jí)”,每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。占先式優(yōu)先級(jí)(pre-emptionpriority):高占先式優(yōu)先級(jí)的中斷事件會(huì)打斷當(dāng)前的主程序/中斷程序運(yùn)行—搶斷式優(yōu)先響應(yīng),俗稱中斷嵌套。副優(yōu)先級(jí)(subpriority):在占先式優(yōu)先級(jí)相同的情況下,高副優(yōu)先級(jí)的中斷優(yōu)先被響應(yīng);在占先式優(yōu)先級(jí)相同的情況下,如果有低副優(yōu)先級(jí)中斷正在執(zhí)行,高副優(yōu)先級(jí)的中斷要等待已被響應(yīng)的低副優(yōu)先級(jí)中斷執(zhí)行結(jié)束后才能得到響應(yīng)—非搶斷式響應(yīng)(不能嵌套)。CSTM32串口中斷STM32(Cortex-M3)中有兩C
stm32中對(duì)中斷優(yōu)先級(jí)的定義Cortex-M3允許具有較少中斷源時(shí)使用較少的寄存器位指定中斷源的優(yōu)先級(jí),因此STM32把指定中斷優(yōu)先級(jí)的寄存器位減少到4位,這4個(gè)寄存器位的分組方式如下:第0組:所有4位用于指定響應(yīng)優(yōu)先級(jí)第1組:最高1位用于指定搶占式優(yōu)先級(jí),最低3位用于指定響應(yīng)優(yōu)先級(jí)第2組:最高2位用于指定搶占式優(yōu)先級(jí),最低2位用于指定響應(yīng)優(yōu)先級(jí)第3組:最高3位用于指定搶占式優(yōu)先級(jí),最低1位用于指定響應(yīng)優(yōu)先級(jí)第4組:所有4位用于指定搶占式優(yōu)先級(jí)Cstm32中對(duì)中斷優(yōu)先級(jí)的定義Cortex-M3允許具C
stm32中對(duì)中斷優(yōu)先級(jí)的定義中斷優(yōu)先級(jí)分組是為了給搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí)在中斷優(yōu)先級(jí)寄存器的高四位分配各個(gè)優(yōu)先級(jí)數(shù)字所占的位數(shù),在一次程序中只能設(shè)定一次。AIRC(ApplicationInterruptandResetRegister)寄存器中有用于指定優(yōu)先級(jí)的4bits。這4個(gè)bits用于分配preemption優(yōu)先級(jí)和sub優(yōu)先級(jí)??梢酝ㄟ^(guò)調(diào)用STM32的固件庫(kù)中的函數(shù)NVIC_PriorityGroupConfig()選擇使用哪種優(yōu)先級(jí)分組方式,這個(gè)函數(shù)的參數(shù)有下列5種:NVIC_PriorityGroup_0=>選擇第0組
NVIC_PriorityGroup_1=>選擇第1組
NVIC_PriorityGroup_2=>選擇第2組
NVIC_PriorityGroup_3=>選擇第3組
NVIC_PriorityGroup_4=>選擇第4組Cstm32中對(duì)中斷優(yōu)先級(jí)的定義中斷優(yōu)先級(jí)分組是為了給搶占C
stm32中對(duì)中斷優(yōu)先級(jí)的定義接下來(lái)就是指定中斷源的優(yōu)先級(jí):要注意的幾點(diǎn)是:
1.如果指定的搶占式優(yōu)先級(jí)別或響應(yīng)優(yōu)先級(jí)別超出了選定的優(yōu)先級(jí)分組所限定的范圍,將可能得到意想不到的結(jié)果;
2.搶占式優(yōu)先級(jí)別相同的中斷源之間沒有嵌套關(guān)系;
3.如果某個(gè)中斷源被指定為某個(gè)搶占式優(yōu)先級(jí)別,又沒有其它中斷源處于同一個(gè)搶占式優(yōu)先級(jí)別,則可以為這個(gè)中斷源指定任意有效的響應(yīng)優(yōu)先級(jí)別。Cstm32中對(duì)中斷優(yōu)先級(jí)的定義接下來(lái)就是指定中斷源的優(yōu)先CSTM32串口中斷
之前講過(guò)stm32庫(kù)文件中的stm32f10x_it.c和stm32f10x_it.h文件中是中斷映射函數(shù),所以需要操作串口的中斷必須清楚串口的中斷映射函數(shù),有些it文件中并沒有串口的中斷映射函數(shù),在啟動(dòng)文件startup_stm32f10x_hd.s中可以看到各種中斷的映射函數(shù):從中可以看出串口2的中斷映射函數(shù)名為USART2_IRQHandlerCSTM32串口中斷之前講過(guò)stm32庫(kù)文件中的stm32CSTM32串口中斷
接下來(lái)就是編寫中斷響應(yīng)函數(shù)在中斷響應(yīng)函數(shù)中寫入進(jìn)中斷后想要進(jìn)行的操作,本實(shí)驗(yàn)中是將接收端接收的數(shù)據(jù)通過(guò)串口發(fā)送出去:接下來(lái)將編譯通過(guò)的程序下到開發(fā)板中,通過(guò)串口調(diào)試助手進(jìn)行調(diào)試即可。CSTM32串口中斷接下來(lái)就是編寫中斷響應(yīng)函數(shù)在中斷響應(yīng)函第二課
串口通信第二課
串口通信C串口簡(jiǎn)介串行接口簡(jiǎn)稱串口,也成串行通信接口,是采用串行通信方式的擴(kuò)展接口。串口的使用對(duì)于開發(fā)調(diào)試過(guò)程的作用是非常大的,串口可以用來(lái)查看、打印及輸出相關(guān)信息,使我們?cè)谇度胧介_發(fā)中最先與中央處理器通信的接口。串行通訊的特點(diǎn)是:數(shù)據(jù)位傳送,傳按位順序進(jìn)行,最少只需一根傳輸線即可完成,成本低但傳送速度慢。串行通訊的距離可以從幾米到幾千米。C串口簡(jiǎn)介串行接口簡(jiǎn)稱串口,也成串行通信接口,是采用串行通信C串口簡(jiǎn)介串行通訊又分為異步通訊和同步通訊兩種:同步串行是指ISP(interfaceSerialPeripheral)的縮寫。ISP總線系統(tǒng)是一種同步串行外設(shè)接口,它可以使MCU與各種外圍設(shè)備以串行方式進(jìn)行通信以交換信息,TRM450是ISP接口。異步串行是指UART(UniversalAsynchronousReceiver/Transmitter),通用異步接收/發(fā)送。UART是一個(gè)并行輸入成為串行輸出的芯片,通常集成在主板上。UART包含TTL電平的串口和RS232電平的串口。串行接口按電氣標(biāo)準(zhǔn)及協(xié)議來(lái)分包括RS-232-C、RS-422、RS485等。RS-232-C、RS-422與RS-485標(biāo)準(zhǔn)只對(duì)接口的電氣特性做出規(guī)定,不涉及接插件、電纜或協(xié)議。在單片機(jī)中,主要使用異步通訊方式。C串口簡(jiǎn)介串行通訊又分為異步通訊和同步通訊兩種:C串口簡(jiǎn)介串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接收字節(jié),盡管比按字節(jié)(byte)的并行通信慢,但是串口可以再使用一根線發(fā)送數(shù)據(jù)的同時(shí)用另一根線接收數(shù)據(jù)。它很簡(jiǎn)單并且能夠?qū)崿F(xiàn)遠(yuǎn)距離通信。串口通信最重要的參數(shù)是波特率、數(shù)據(jù)位、停止位和奇偶校驗(yàn)。
對(duì)于兩個(gè)進(jìn)行通信的端口,這些參數(shù)必須匹配:1、波特率:這是一個(gè)衡量通信速度的參數(shù),它表示每秒鐘傳送的bit的個(gè)數(shù)。例如300波特表示每秒鐘發(fā)送300個(gè)bit。C串口簡(jiǎn)介串口通信的概念非常簡(jiǎn)單,串口按位(bit)發(fā)送和接CSTM32串口簡(jiǎn)介2、數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參數(shù)。當(dāng)計(jì)算機(jī)發(fā)送一個(gè)信息包,實(shí)際數(shù)據(jù)不會(huì)是8位的,標(biāo)準(zhǔn)的值是5、7或8位(如何設(shè)置取決于你想傳送的信息:比如標(biāo)準(zhǔn)的ASCII碼是0~127(7位),擴(kuò)展的ASCII碼是0~255(8位))。3、停止位:用于表示單個(gè)包的最后一位。典型的值為1、1.5和2位。優(yōu)于數(shù)據(jù)是在傳輸線上定時(shí)的,并且每一個(gè)設(shè)備有其自己的時(shí)鐘,很可能在通信中兩臺(tái)設(shè)備間出現(xiàn)了小小的不同步。因此停止位不僅僅是表示傳輸?shù)慕Y(jié)束,并且提供計(jì)算機(jī)校正時(shí)鐘同步的機(jī)會(huì)。CSTM32串口簡(jiǎn)介2、數(shù)據(jù)位:這是衡量通信中實(shí)際數(shù)據(jù)位的參CSTM32串口簡(jiǎn)介4、奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢錯(cuò)方式。有4中檢錯(cuò)方式:偶、奇、高和低。5、硬件流控制:硬件流控制常用的有RTS/CTS流控制盒DTR/DSR流控制。硬件流控制必須將相應(yīng)的電纜線接上,用RTS/CTS流控制時(shí),應(yīng)將通訊兩端的RTS、CTS線對(duì)應(yīng)相連。常用的流控制信號(hào)還有DTR/DSR。CSTM32串口簡(jiǎn)介4、奇偶校驗(yàn)位:在串口通信中一種簡(jiǎn)單的檢CSTM32串口簡(jiǎn)介STM32根據(jù)芯片型號(hào)的不同資源數(shù)量也不一樣,103VC系列最多可提供5路串口(本次著重講解串口1和串口2),有分?jǐn)?shù)波特率發(fā)生器、支持同步單線通信和半雙工單線通訊、支持LIN、支持調(diào)制解調(diào)器操作、智能卡協(xié)議和IrDASIRENDEC規(guī)范、具有DMA等。STM32的串口與其他單片機(jī)的操作方式基本相同:1、開啟串口時(shí)鐘2、設(shè)置相應(yīng)I/O模式3、配置波特率、數(shù)據(jù)位長(zhǎng)度、奇偶校驗(yàn)位等CSTM32串口簡(jiǎn)介STM32根據(jù)芯片型號(hào)的不同資源數(shù)量也CSTM32串口原理圖CSTM32串口原理圖CSTM32UART庫(kù)函數(shù)CSTM32UART庫(kù)函數(shù)CSTM32串口時(shí)鐘使能串口作為STM32的一個(gè)外設(shè),其時(shí)鐘由外設(shè)時(shí)鐘使能寄存器控制,串口1的時(shí)鐘使能在APB2ENR寄存器,其他串口的時(shí)鐘使能位都在APB1ENR。(以串口1為例)而用庫(kù)函數(shù)則是:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE)CSTM32串口時(shí)鐘使能串口作為STM32的一個(gè)外設(shè),其時(shí)鐘CSTM32串口復(fù)位當(dāng)外設(shè)出現(xiàn)異常的時(shí)候可以通過(guò)復(fù)位寄存器里面的對(duì)應(yīng)位設(shè)置,實(shí)現(xiàn)該外設(shè)的復(fù)位,然后重新配置這個(gè)外設(shè)達(dá)到讓其重新工作的目的。一般在系統(tǒng)剛開始配置外設(shè)的時(shí)候都會(huì)先執(zhí)行復(fù)位該外設(shè)的操作。串口1的復(fù)位時(shí)通過(guò)配置APB2RSTR寄存器來(lái)實(shí)現(xiàn)的,其他的幾個(gè)串口都是通過(guò)PAB1RSTR寄存器來(lái)實(shí)現(xiàn)的。而用庫(kù)函數(shù)則是使用USART_DeInit(USART_TypeDef*USARTx)來(lái)實(shí)現(xiàn)的。USART_DeInit函數(shù)在stm32f10x_usart.c文件中。CSTM32串口復(fù)位當(dāng)外設(shè)出現(xiàn)異常的時(shí)候可以通過(guò)復(fù)位寄存器里CSTM32串口波特率設(shè)置STM32中每個(gè)串口都有一個(gè)自己獨(dú)立的波特率寄存器USART_BRR,通過(guò)設(shè)置該寄存器達(dá)到配置不同波特率的目的,該寄存器的各位描述如下:該寄存器中最低4為用來(lái)存放小數(shù)部分的DIV_Fraction,[15:4]這12位用來(lái)存放整數(shù)部分DIV_Mantissa。高16位未使用(圖片上小數(shù)整數(shù)有錯(cuò)誤,以英文手冊(cè)為準(zhǔn))。CSTM32串口波特率設(shè)置STM32中每個(gè)串口都有一個(gè)自己獨(dú)CSTM32串口波特率設(shè)置
CSTM32串口波特率設(shè)置
CSTM32串口控制STM32中每個(gè)串口都有3個(gè)控制寄存器USART_CR1~3,串口的很多配置都是通過(guò)這3個(gè)寄存器來(lái)設(shè)置的。這里我們只要用到USART_CR1就可以實(shí)現(xiàn)我們的功能了,其他的寄存器就不一一列出了。具體各位的功能及操作方法見STM32參考手冊(cè)的496~497頁(yè)。其中發(fā)送和接收的中斷都通過(guò)這個(gè)寄存器進(jìn)行使能。CSTM32串口控制STM32中每個(gè)串口都有3個(gè)控制寄存器UCSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收是通過(guò)數(shù)據(jù)寄存器USART_DR來(lái)實(shí)現(xiàn)的,這是一個(gè)雙寄存器,包含了發(fā)送和接收兩部分。當(dāng)向該寄存器寫數(shù)據(jù)時(shí),串口就會(huì)自動(dòng)發(fā)送,當(dāng)收到數(shù)據(jù)的時(shí)候,也在該寄存器中。其中只用了低9位,其他位都保留且硬件強(qiáng)制為0。CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收是CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收在庫(kù)文件中分別有對(duì)應(yīng)的函數(shù),可直接調(diào)用,分別是:voidUSART_SendData(USART_TypeDef*USARTx,u8Data)u8USART_ReceiveData(USART_TypeDef*USARTx)CSTM32串口數(shù)據(jù)的發(fā)送和接收STM32串口的發(fā)送和接收在CSTM32串口狀態(tài)STM32串口的狀態(tài)可通過(guò)狀態(tài)寄存器USART_SR讀取。這里我們關(guān)注一下三個(gè)位,第5、6、7位RXNE、TC和TXE。CSTM32串口狀態(tài)STM32串口的狀態(tài)可通過(guò)狀態(tài)寄存器USCSTM32串口
如果理解了以上寄存器等的講解,那么就可以對(duì)STM32進(jìn)行相關(guān)的設(shè)置和操作,就可以達(dá)到串口最基本的配置了,更詳細(xì)的介紹可參考《STM32參考手冊(cè)》。在很多串口操作中都可以直接調(diào)用printf函數(shù)打印輸出信息,但是在STM32中還需要進(jìn)行一些配置才可以。接下來(lái)我們首先會(huì)講解如何使用printf函數(shù)進(jìn)行輸出,然后再講解輸入輸出函數(shù)的使用方法。CSTM32串口如果理解了以上寄存器等的講解,那么就可以對(duì)CSTM32串口printf實(shí)現(xiàn)
本次試驗(yàn)采用UART1的查詢方式實(shí)現(xiàn):CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)采用UART1的查CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)中我們用到了GPIO、RCC、USART這三個(gè)外設(shè)的庫(kù)文件stm32f10x_gpio.c、stm32f10x_rcc.c、stm32f10x_usart.c,所以試驗(yàn)中如果你的庫(kù)文件stm32f10x_conf.h里面將相應(yīng)的頭文件注釋了就需要將需要用到的幾個(gè)頭文件的注釋去掉。
跟LED的操作一樣,首先是將相應(yīng)的I/O配置成串口模式,本次函數(shù)名為USART1_Config();CSTM32串口printf實(shí)現(xiàn)本次試驗(yàn)中我們用到了GPIOCSTM32串口printf實(shí)現(xiàn)
CSTM32串口printf實(shí)現(xiàn)CSTM32串口printf實(shí)現(xiàn)USART1_Config()主要做了如下工作:1、使能了串口1的時(shí)鐘2、配置了uart1的I/O3、配置了uart1的工作模式CSTM32串口printf實(shí)現(xiàn)USART1_ConfigCSTM32串口簡(jiǎn)介
上面的配置中將串口1的TX和RX引腳配置成AF_PP和IN_FLOATING模式,因?yàn)镽X是接收引腳所以設(shè)置沉高輸入模式。接下來(lái)將UART1的工作模式配置成波特率為115200(可自行更改),數(shù)據(jù)位長(zhǎng)度為8bit,停止位為1,無(wú)校驗(yàn)位。在使用printf函數(shù)之前還需要進(jìn)行一些操作。如果要printf函數(shù)工作的話,還需要把printf()重新定向到串口中,這部分工作是由fputc(intch,FILE*f)這個(gè)函數(shù)來(lái)完成的,這個(gè)函數(shù)在usart.c中實(shí)現(xiàn)。CSTM32串口簡(jiǎn)介上面的配置中將串口1的TX和RX引腳配CSTM32printf用法配置
在STM32中直接調(diào)用printf函數(shù)會(huì)出錯(cuò),需要進(jìn)行一些配置:1、在main文件中包含stdio.h2、重定義fputc函數(shù),如下:
//發(fā)送數(shù)據(jù)
intfputc(intch,FILE*f){
USART_SendData(USART1,(unsignedchar)ch);
while(!(USART1->SR&USART_FLAG_TXE));
return(ch);
}
3、在工程屬性的“Target”->“CodeGeneration”選項(xiàng)中勾選“UseMicroLIB””。CSTM32printf用法配置在STM32中直接調(diào)用prCSTM32printf用法配置
在這里講解一下fputc函數(shù)里面的代碼,我們前面提到過(guò)USART_SR寄存器的5、6、7三位,理解了這幾位的功能就可以大概理解串口是如何發(fā)送數(shù)據(jù)的了。CSTM32printf用法配置在這里講解一下fputc函CSTM32printf用法配置
當(dāng)TXE置位時(shí),就表示發(fā)送數(shù)據(jù)寄存器中的數(shù)據(jù)已經(jīng)移到了發(fā)送移位寄存器中,如果使能中斷的話就會(huì)產(chǎn)生中斷。當(dāng)RXNE置位時(shí)表示接受移位寄存器中的數(shù)據(jù)已經(jīng)移到接受數(shù)據(jù)寄存器中了,如果中斷使能的話則產(chǎn)生中斷。雖然fputc函數(shù)里面用到的是查詢模式,但道理是一樣的。我們先調(diào)用USART_SendData(USART1,(unsignedchar)ch)將我們要發(fā)送的數(shù)據(jù)送到TDR中,之后我們就等待TXE置位,當(dāng)TXE置位時(shí)就表示TDR中的數(shù)據(jù)轉(zhuǎn)移到了發(fā)送移位寄存器中了,發(fā)送移位寄存器中的數(shù)據(jù)會(huì)由串口硬件自動(dòng)發(fā)送,如此循環(huán),直到將我們要發(fā)送的數(shù)據(jù)全部發(fā)送完為止。CSTM32printf用法配置當(dāng)TXE置位時(shí),就表示發(fā)送CSTM32printf用法配置進(jìn)行上述設(shè)置之后就可以使用printf函數(shù)了如果設(shè)置成功,下載程序,將開發(fā)板的串口接到PC機(jī)上,打開串口調(diào)試助手,設(shè)置好波特率等參數(shù)就可以看到thisisauarttestdemo的字符。以上例程展示了如何使用printf函數(shù)發(fā)送字符串。CSTM32printf用法配置進(jìn)行上述設(shè)置之后就可以使用C
前面講解了printf函數(shù)的使用方法,接下來(lái)講解如何使用STM32的串口輸入輸出實(shí)現(xiàn)雙向通信。STM32串口的相關(guān)寄存器和原理在前面都有提到,這里就不再贅述,這里主要講解軟件的實(shí)現(xiàn)方法。首先我們講解查詢方式的發(fā)送和接收。C前面講解了printf函數(shù)的使用方法,接下來(lái)講解如何使用C
本實(shí)驗(yàn)中我們通過(guò)串口1持續(xù)等待接收數(shù)據(jù),當(dāng)接收到回車符時(shí)將接收到的內(nèi)容再通過(guò)串口發(fā)送出去。發(fā)送函數(shù):C本實(shí)驗(yàn)中我們通過(guò)串口1持續(xù)等待接收數(shù)據(jù),當(dāng)接收到回車符時(shí)C
發(fā)送有兩個(gè)函數(shù),分別是發(fā)送單個(gè)字符和發(fā)送字符串函數(shù),發(fā)送單個(gè)字符函數(shù)首先是將要發(fā)送的字符寫到緩存中,然后等待串口自動(dòng)發(fā)送完成,如果不等待發(fā)送完成就返回,則在字符串發(fā)送函數(shù)中函數(shù)會(huì)被連續(xù)循環(huán)調(diào)用多次,如果上一次發(fā)送的字節(jié)在寄存器中還沒有發(fā)送結(jié)束,此時(shí)再次寫入同樣的寄存器會(huì)將剛才的數(shù)據(jù)覆蓋掉,接收端將得不到預(yù)期的結(jié)果,所以需要等待發(fā)送完一個(gè)字符之后再發(fā)送下一個(gè)字符。發(fā)送字符串函數(shù)則是循環(huán)調(diào)用發(fā)送單個(gè)字符函數(shù),直到檢測(cè)到空格即表明字符串已發(fā)送完。C發(fā)送有兩個(gè)函數(shù),分別是發(fā)送單個(gè)字符和發(fā)送字符串函數(shù),發(fā)送C查詢接收函數(shù):接收函數(shù)首先是查詢寄存器中是否有數(shù)據(jù),如果有數(shù)據(jù)就將數(shù)據(jù)取出,然后清除相應(yīng)的標(biāo)志位,如果沒有數(shù)據(jù)就一直等待數(shù)據(jù)出現(xiàn)。C查詢接收函數(shù):C接下來(lái)就是在main函數(shù)中調(diào)用發(fā)送和接收函數(shù):首先設(shè)置系統(tǒng)時(shí)鐘,然后初始化USART1,然后循環(huán)讀取數(shù)據(jù),如果讀取到了數(shù)據(jù)則將數(shù)據(jù)再通過(guò)串口發(fā)送出去。如果操作成功,則通過(guò)串口調(diào)試助手發(fā)送一串?dāng)?shù)據(jù)可在接收區(qū)看到發(fā)送的數(shù)據(jù)。C接下來(lái)就是在main函數(shù)中調(diào)用發(fā)送和接收函數(shù):CSTM32串口中斷
接下來(lái)講解串口的中斷接收方式:在驅(qū)動(dòng)中頻繁的使用查詢方式接收數(shù)據(jù)不僅會(huì)降低系統(tǒng)的效率而且可能使系統(tǒng)崩潰。采取中斷方式可以很好地緩解這一問題。本次講解串口1的中斷接收方式:用串口中斷函數(shù)除了要初始化I/O和時(shí)鐘等,還要配置相應(yīng)的中斷及中斷函數(shù)。CSTM32串口中斷接下來(lái)講解串口的中斷接收方式:CSTM32串口中斷STM32(Cortex-M3)中有兩個(gè)優(yōu)先級(jí)的概念:搶占式優(yōu)先級(jí)和響應(yīng)優(yōu)先級(jí),也把響應(yīng)優(yōu)先級(jí)稱作“亞優(yōu)先級(jí)”或“副優(yōu)先級(jí)”,每個(gè)中斷源都需要被指定這兩種優(yōu)先級(jí)。占先式優(yōu)先級(jí)(pre-emptionpriority):高占先式優(yōu)先級(jí)的中斷事件會(huì)打斷當(dāng)前的主程序/中斷程
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 鋼結(jié)構(gòu)標(biāo)準(zhǔn)化設(shè)計(jì)技術(shù)方法
- 樂清2022年事業(yè)編招聘考試模擬試題及答案解析16
- 2026屆遼寧省葫蘆島市高三上學(xué)期期末考試歷史試題(含答案)
- 邵陽(yáng)職院考試題庫(kù)及答案
- 鉗工知識(shí)競(jìng)賽試題及答案
- 辯論培訓(xùn)課件
- 北師大版數(shù)學(xué)三年級(jí)上冊(cè)期末評(píng)價(jià)(A卷)(含答案)
- 四川省綿陽(yáng)市游仙區(qū)2024-2025學(xué)年八年級(jí)上學(xué)期期末地理試題(含答案)
- 輔警特色培訓(xùn)課程
- 2025 小學(xué)三年級(jí)科學(xué)下冊(cè)保護(hù)植物的重要性教育課件
- 2026年春統(tǒng)編版(新教材)小學(xué)道德與法治三年級(jí)下冊(cè)教學(xué)計(jì)劃及進(jìn)度表
- 社區(qū)衛(wèi)生安全生產(chǎn)制度
- 物理試卷-云南師大附中2026屆高三1月高考適應(yīng)性月考卷(六)
- 教育培訓(xùn)加盟合同協(xié)議
- 2026年高一語(yǔ)文寒假作業(yè)安排(1月31日-3月1日)
- 虛擬電廠的分布式能源協(xié)同調(diào)度與彈性運(yùn)行機(jī)制
- 蘭州水務(wù)冬季安全培訓(xùn)課件
- 陜西交控集團(tuán)招聘筆試題庫(kù)2026
- DZ∕T 0399-2022 礦山資源儲(chǔ)量管理規(guī)范(正式版)
- 消防工程監(jiān)理實(shí)施細(xì)則
- 權(quán)利的游戲雙語(yǔ)劇本-第Ⅰ季
評(píng)論
0/150
提交評(píng)論