STM32F1xx官方資料:
《STM32中文參考手冊V10》-第25章通用同步異步收發器(USART)
通信接口背景知識
設備之(zhī)間通信的(de)方式
一(yī / yì /yí)般情況下,設備之(zhī)間的(de)通信方式可以(yǐ)分成并行通信和(hé / huò)串行通信兩種。它們的(de)區别是(shì):
串行通信的(de)分類
1、按照數據傳送方向,分爲(wéi / wèi):
單工:數據傳輸隻支持數據在(zài)一(yī / yì /yí)個(gè)方向上(shàng)傳輸;
半雙工:允許數據在(zài)兩個(gè)方向上(shàng)傳輸。但是(shì),在(zài)某一(yī / yì /yí)時(shí)刻,隻允許數據在(zài)一(yī / yì /yí)個(gè)方向上(shàng)傳輸,它實際上(shàng)是(shì)一(yī / yì /yí)種切換方向的(de)單工通信;它不(bù)需要(yào / yāo)獨立的(de)接收端和(hé / huò)發送端,兩者可以(yǐ)合并一(yī / yì /yí)起使用一(yī / yì /yí)個(gè)端口。
全雙工:允許數據同時(shí)在(zài)兩個(gè)方向上(shàng)傳輸。因此,全雙工通信是(shì)兩個(gè)單工通信方式的(de)結合,需要(yào / yāo)獨立的(de)接收端和(hé / huò)發送端。2、按照通信方式,分爲(wéi / wèi):
同步通信:帶時(shí)鍾同步信号傳輸。比如:SPI,IIC通信接口。
異步通信:不(bù)帶時(shí)鍾同步信号。比如:UART(通用異步收發器),單總線。
在(zài)同步通訊中,收發設備上(shàng)方會使用一(yī / yì /yí)根信号線傳輸信号,在(zài)時(shí)鍾信号的(de)驅動下雙方進行協調,同步數據。例如,通訊中通常雙方會統一(yī / yì /yí)規定在(zài)時(shí)鍾信号的(de)上(shàng)升沿或者下降沿對數據線進行采樣。
在(zài)異步通訊中不(bù)使用時(shí)鍾信号進行數據同步,它們直接在(zài)數據信号中穿插一(yī / yì /yí)些用于(yú)同步的(de)信号位,或者将主題數據進行打包,以(yǐ)數據幀的(de)格式傳輸數據。通訊中還需要(yào / yāo)雙方規約好數據的(de)傳輸速率(也(yě)就(jiù)是(shì)波特率)等,以(yǐ)便更好地(dì / de)同步。常用的(de)波特率有4800bps、9600bps、115200bps等。
在(zài)同步通訊中,數據信号所傳輸的(de)内容絕大(dà)部分是(shì)有效數據,而(ér)異步通訊中會則會包含數據幀的(de)各種标識符,所以(yǐ)同步通訊效率高,但是(shì)同步通訊雙方的(de)時(shí)鍾允許誤差小,稍稍時(shí)鍾出(chū)錯就(jiù)可能導緻數據錯亂,異步通訊雙方的(de)時(shí)鍾允許誤差較大(dà)。 STM32串口通信基礎
STM32的(de)串口通信接口有兩種,分别是(shì):UART(通用異步收發器)、USART(通用同步異步收發器)。而(ér)對于(yú)大(dà)容量STM32F10x系列芯片,分别有3個(gè)USART和(hé / huò)2個(gè)UART。
UART引腳連接方法
RXD:數據輸入引腳,數據接受;
TXD:數據發送引腳,數據發送。
對于(yú)兩個(gè)芯片之(zhī)間的(de)連接,兩個(gè)芯片GND共地(dì / de),同時(shí)TXD和(hé / huò)RXD交叉連接。這(zhè)裏的(de)交叉連接的(de)意思就(jiù)是(shì),芯片1的(de)RxD連接芯片2的(de)TXD,芯片2的(de)RXD連接芯片1的(de)TXD。這(zhè)樣,兩個(gè)芯片之(zhī)間就(jiù)可以(yǐ)進行TTL電平通信了(le/liǎo)。若是(shì)芯片與PC機(或上(shàng)位機)相連,除了(le/liǎo)共地(dì / de)之(zhī)外,就(jiù)不(bù)能這(zhè)樣直接交叉連接了(le/liǎo)。盡管PC機和(hé / huò)芯片都有TXD和(hé / huò)RXD引腳,但是(shì)通常PC機(或上(shàng)位機)通常使用的(de)都是(shì)RS232接口(通常爲(wéi / wèi)DB9封裝),因此不(bù)能直接交叉連接。RS232接口是(shì)9針(或引腳),通常是(shì)TxD和(hé / huò)RxD經過電平轉換得到(dào)的(de)。故,要(yào / yāo)想使得芯片與PC機的(de)RS232接口直接通信,需要(yào / yāo)也(yě)将芯片的(de)輸入輸出(chū)端口也(yě)電平轉換成rs232類型,再交叉連接。
經過電平轉換後,芯片串口和(hé / huò)rs232的(de)電平标準是(shì)不(bù)一(yī / yì /yí)樣的(de):
單片機的(de)電平标準(TTL電平):+5V表示1,0V表示0;
Rs232的(de)電平标準:+15/+13 V表示0,-15/-13表示1。
RS-232通訊協議标準串口的(de)設備間通訊結構圖如下: 所以(yǐ)單片機串口與PC串口通信就(jiù)應該遵循下面的(de)連接方式:在(zài)單片機串口與上(shàng)位機給出(chū)的(de)rs232口之(zhī)間,通過電平轉換電路(如下面圖中的(de)Max232芯片) 實現TTL電平與RS232電平之(zhī)間的(de)轉換。STM32的(de)UART特點
全雙工異步通信;
分數波特率發生器系統,提供精确的(de)波特率。發送和(hé / huò)接受共用的(de)可編程波特率,最高可達4.5Mbits/s;
可編程的(de)數據字長度(8位或者9位);
可配置的(de)停止位(支持1或者2位停止位);
可配置的(de)使用DMA多緩沖器通信;
單獨的(de)發送器和(hé / huò)接收器使能位;
檢測标志:① 接受緩沖器 ②發送緩沖器空 ③傳輸結束标志;
多個(gè)帶标志的(de)中斷源,觸發中斷;
其他(tā):校驗控制,四個(gè)錯誤檢測标志。
串口通信過程STM32中UART參數
串口通訊的(de)數據包由發送設備通過自身的(de)TXD接口傳輸到(dào)接收設備的(de)RXD接口,通訊雙方的(de)數據包格式要(yào / yāo)規約一(yī / yì /yí)緻才能正常收發數據。STM32中串口異步通信需要(yào / yāo)定義的(de)參數:起始位、數據位(8位或者9位)、奇偶校驗位(第9位)、停止位(1,15,2位)、波特率設置。
UART串口通信的(de)數據包以(yǐ)幀爲(wéi / wèi)單位,常用的(de)幀結構爲(wéi / wèi):1位起始位+8位數據位+1位奇偶校驗位(可選)+1位停止位。如下圖所示:奇偶校驗位分爲(wéi / wèi)奇校驗和(hé / huò)偶校驗兩種,是(shì)一(yī / yì /yí)種簡單的(de)數據誤碼校驗方法。奇校驗是(shì)指每幀數據中,包括數據位和(hé / huò)奇偶校驗位的(de)全部9個(gè)位中1的(de)個(gè)數必須爲(wéi / wèi)奇數;偶校驗是(shì)指每幀數據中,包括數據位和(hé / huò)奇偶校驗位的(de)全部9個(gè)位中1的(de)個(gè)數必須爲(wéi / wèi)偶數。
校驗方法除了(le/liǎo)奇校驗(odd)、偶校驗(even)之(zhī)外,還可以(yǐ)有:0 校驗(space)、1 校驗(mark)以(yǐ)及無校驗(noparity)。 0/1校驗:不(bù)管有效數據中的(de)内容是(shì)什麽,校驗位總爲(wéi / wèi)0或者1。
UART(USART)框圖
這(zhè)個(gè)框圖分成上(shàng)、中、下三個(gè)部分。本文大(dà)概地(dì / de)講述一(yī / yì /yí)下各個(gè)部分的(de)内容,具體的(de)可以(yǐ)看《STM32中文參考手冊》中的(de)描述。
框圖的(de)上(shàng)部分,數據從RX進入到(dào)接收移位寄存器,後進入到(dào)接收數據寄存器,最終供CPU或者DMA來(lái)進行讀取;數據從CPU或者DMA傳遞過來(lái),進入發送數據寄存器,後進入發送移位寄存器,最終通過TX發送出(chū)去。
然而(ér),UART的(de)發送和(hé / huò)接收都需要(yào / yāo)波特率來(lái)進行控制的(de),波特率是(shì)怎樣控制的(de)呢?
這(zhè)就(jiù)到(dào)了(le/liǎo)框圖的(de)下部分,在(zài)接收移位寄存器、發送移位寄存器都還有一(yī / yì /yí)個(gè)進入的(de)箭頭,分别連接到(dào)接收器控制、發送器控制。而(ér)這(zhè)兩者連接的(de)又是(shì)接收器時(shí)鍾、發送器時(shí)鍾。也(yě)就(jiù)是(shì)說(shuō),異步通信盡管沒有時(shí)鍾同步信号,但是(shì)在(zài)串口内部,是(shì)提供了(le/liǎo)時(shí)鍾信号來(lái)進行控制的(de)。而(ér)接收器時(shí)鍾和(hé / huò)發送器時(shí)鍾有是(shì)由什麽控制的(de)呢?
可以(yǐ)看到(dào),接收器時(shí)鍾和(hé / huò)發送器時(shí)鍾又被連接到(dào)同一(yī / yì /yí)個(gè)控制單元,也(yě)就(jiù)是(shì)說(shuō)它們共用一(yī / yì /yí)個(gè)波特率發生器。同時(shí)也(yě)可以(yǐ)看到(dào)接收器時(shí)鍾(發生器時(shí)鍾)的(de)計算方法、USRRTDIV的(de)計算方法。
這(zhè)裏需要(yào / yāo)知道(dào)一(yī / yì /yí)個(gè)知識點:
UART1的(de)時(shí)鍾:PCLK2(高速);
UART2、UART3、UART4的(de)時(shí)鍾:PCLK1(低速)。