1.處理器與外部設備通信的兩種方式:
並行通信
- 傳輸原理:數據各個位同時傳輸。
- 優點:速度快
- 缺點:占用引腳資源多
串行通信
- 傳輸原理:數據按位順序傳輸。
- 優點:占用引腳資源少
- 缺點:速度相對較慢
- 單工:數據傳輸只支持數據在一個方向上傳輸
- 半雙工:允許數據在兩個方向上傳輸,但是,在某一時刻,只允許數據在一個方向上傳輸,它實際上是一種切換方向的單工通信;
- 全雙工:允許數據同時在兩個方向上傳輸,因此,全雙工通信是兩個單工通信方式的結合,它要求發送設備和接收設備都有獨立的接收和發送能力。
- 同步通信:帶時鍾同步信號傳輸。SPI,IIC通信接口
有時鍾同步信號,A傳到B的過程中,每一個位都是根據時鍾來傳的,比如時鍾到達上升沿,傳1bit。
- 異步通信:不帶時鍾同步信號。UART(通用異步收發器),單總線
A和B之間沒有時鍾同步信號,雙方先約定一些波特率、起始位等,計算出發送每一bit占用的時間。
常見的串行通信接口:
如果是全雙工,那么發送和接收都要有獨立的引腳。半雙工一般只占用一個獨立的發送\接收引腳。
如果是同步通信,那么一定有同步時鍾。
通信標准 | 引腳說明 | 通信方式 | 通信方向 |
---|---|---|---|
UART (通用異步收發器) | TXD:發送端 RXD:接受端 GND:公共地 | 異步通信 | 全雙工 |
單總線 (1-wire) | DQ:發送/接受端 | 異步通信 | 半雙工 |
SPI | SCK:同步時鍾 MISO:主機輸入,從機輸出 MOSI:主機輸出,從機輸入 | 同步通信 | 全雙工 |
I2C | SCL:同步時鍾 SDA:數據輸入/輸出端 | 同步通信 | 半雙工 |
包含:
物理層(電氣層:接口決定):通信接口(RS232,RS485,RS422,TTL)
數據格式(數據層:芯片決定)起始位校驗位等約定好
通信協議(協議層:程序決定)數據出錯能檢測出來等
UART異步通信方式引腳連接方法:
RXD:數據輸入引腳。數據接收。TXD:數據發送引腳。數據發送。
兩個電路板相連,往往用到一些接口,而不是直接相連TXRX。
接口類型 | 邏輯1 典型值 | 邏輯0 典型值 | 說明 | 優缺點 |
---|---|---|---|---|
TTL | +5/3.3 | 0 | 一般MCU串口引腳都支持TTL | |
RS232 | -15V~-3V | 3V~15V | 3線全雙工,點對點 | 接口電平高,傳輸速度相對較低,傳輸距離近 |
RS485 | 兩根線的壓差+(2~6)V | 壓差-(2~6)V | 2線半雙工,點對多,主從通信。使用壓差傳遞信號。 | 傳輸速度高可達10M,抗干擾能力強,距離遠。 |
RS422 | 相對比較少用。 |
MCU發送串口信號,經電平轉換芯片變為USB信號,通過USB連到電腦,電腦可以直接識別USB信號。
串口號 | RXD | TXD |
---|---|---|
1 | PA10(PB7) | PA9(PB6) |
2 | PA3(PD6) | PA2(PD5) |
3 | PB11(PC11/PD9) | PB10(PC10/PD8) |
4 | PC11(PA1) | PC10(PA0) |
5 | PD2 | PC12 |
6 | PC7(PG9) | PC6(PG14) |
STM32串口通信過程:信號一位一位傳過來,速度根據波特率來傳。串行移位寄存器一個一個讀過來,然后一次性寫入到輸入數據緩沖器里,MCU從中讀取數據。
MCU寫輸出數據緩沖器,然后一次性給串行移位寄存器,然后在波特率控制下,把數據一位位送到外部設備。
起始位:1個邏輯0數據位開始
數據位(8位或者9位)
奇偶校驗位(第9位)
停止位(1,1.5,2位)
波特率設置
TX:芯片數據發送出去,RX:數據接收。接收后放到接收移位寄存器,然后全部給接收數據寄存器,然后CPU可以通過總線讀取數據。發送的話,CPU把數據寫到發送數據寄存器,之后數據送到發送移位寄存器,數據一位一位的從IO口出去。
對於這個發送和接收移位寄存器,必須提前設定好波特率,這兩個寄存器受發送控制和接收器控制。可以由下圖看到:發送和接收端共用一個波特率,用於確定串行通信的速度。最下面有一個BRR寄存器,首先時鍾來自於pCLKx ,pclk經過/usartdiv和/(8*(2-OVER8)),OVER8由控制寄存器的一個位決定可能為0或1,把這個時鍾作為發送器和接收器的時鍾,控制發送和接收移位寄存器,實現控制傳輸數據的速度。
對於接收器控制和發送控制,圖中還有幾個寄存器,右邊SR寄存器,記錄一些狀態標志位,左邊CR1,有一些使能位,高位連接中斷控制,可以觸發一些中斷。
波特率決定了串口的通信速度,如何計算。
上圖OVER8:在控制寄存器 1 (USART_CR1)中可找到,其中采樣頻率越高,容錯性越好,但是限制了速度。如果8倍過采樣可以提高速度。
小數波特率生成:
對 USARTDIV 的尾數值和小數值進行編程時,接收器和發送器(Rx 和 Tx)的波特率均設置為相同值。
當fck確定,又要達到某一種波特率,此時可以計算出USARTDIV的值是多少。它的值是由USART_BRR 寄存器決定的。
USARTDIV 是一個存放在 USART_BRR 寄存器中的無符號定點數。
當 OVER8=0 時,小數部分編碼為 4 位並通過 USART_BRR 寄存器中的 DIV_fraction[3:0] 位編程。
當 OVER8=1 時,小數部分編碼為 3 位並通過 USART_BRR 寄存器中的 DIV_fraction[2:0] 位編程,此時 DIV_fraction[3] 位必須保持清零狀態。
注意: 對 USART_BRR 執行寫操作后,波特率計數器更新為波特率寄存器中的新值。因此,波特率 寄存器的值不應在通信時發生更改。
如圖所示,USART中DIV_Mantissa是設置USARTDIV 的整數部分,DIV_Fraction是設置USARTDIV的小數部分。如果經過公式算出USARTDIV=37.5該如何設置 USART_BRR寄存器?
可以看到波特率寄存器 (USART_BRR):位15:4一共12位,如果設置USARTDIV=37.5,只需要把高十二位設置成37 。小數則是由低4位決定的,由於低四位一共有2^4=16個數,占滿了0-1,所以可以0.5*16=8,賦給低四位即可。
可以總結出:OVER8=0時波特率計算公式:
①根據波特率和串口時鍾頻率,計算出USARTDIV的值。
②DIV_Fraction=USART的小數部分 X16所得的整數
DIV_Mantissa=USART的整數部分
假如OVER8=0,串口時鍾為90M,需要得到115200的波特率,根據公式計算得到USARTDIV=90000000/(115200*16)=48.828
DIV_Fraction=16*0.828的整數部分=13=0X0D;
DIV_Mantissa=48=0x30;
得到USART1->BRR值為0x30d,只要設置串口1的BRR寄存器值位0x30d就可得到115200的波特率。