嵌入式大佬給你分析stm32串列埠

2021-10-07 19:33:50 字數 4483 閱讀 3660

什麼是串列埠

uart : universal asynchronous receiver/transmitter 通用非同步收發器

usart : universal synchronous asynchronous receiver/transmitter 通用同步/非同步收發器

一種是常用也是最簡單的序列資料傳輸協議。資料線只需要兩根就可以實現全雙工。

tx: 傳送資料線

rx: 接收資料線

a btx -----------> rx

rx <------------tx

全雙工: 兩個裝置可以同時傳送和接收

序列資料: 傳送只一根線,一次只能傳送一bit. 一bit接著一bit傳送和接收。

模組通訊: 上位機 下位機

通訊一般需要兩個裝置,我們把這兩個裝置,人為叫做上位機, 下位機。

上位機: 把處理效能強的機子,上位機。資料大部分處理都在上位機完成。

下位機: 把資料採集的終端,處理效能單一的機子,下位機。

串列埠只有一根傳送資料線,假如 a要傳送乙個字元資料  10101010 給b

a -------- ---------

高電平週期是多長?即使是不傳送資料tx線上也有乙個電平狀態,接收方

它怎麼知道你是在傳送呢?..

uart資料如何傳輸?

uart protocol 串列埠協議。

串列埠傳送和接收資料是以幀為單位. frame

1幀(frame)= 1 start bit(起始位) + 5-9bits資料位 + 0/1bit 校驗位  + stop bits(0.5, 1,1,5,2)

起始位: 乙個週期的低電平

資料位: 5-9bits資料位,具體是多少bits,需要雙方協商。並且傳送是先傳送lsb(最低位) … msb

校驗位:

0 bit :沒有校驗位

1 bit :校驗位. 「賴子」 x

d0 d1 d2 … dn x

奇校驗:要保證傳輸的1為奇數

d0 d1 d2 … dn x 要保證這一串資料中1的個數為奇數

1 0 1 0 1 0 1 0 x(1)

1 0 1 0 1 0 1 1 x(0)

偶校驗:要儲存傳輸的1為偶數

停止位: 高電平

0.5 個停止位。 半個週期的高電平

1 個停止位

1.5 個停止位

2 個停止位

baudrate(波特率): 傳輸速率。

決定 時間週期。

115200 bps: bits per second

物理層標準  the physical layer standards

ttl level uart : ttl電平串列埠

rs-232:

rs-422:

rs-485:

ttl level uart:

邏輯低電平(0) 0v

邏輯高電平(1) 5v/3.3v

rs-232: 適合較長距離傳輸

邏輯低電平(0) +3v~+15v

邏輯高電平(1) -3v~-15v

ttl uart rs-232 rs-422 rs-485

電平 1 3.3v/5v 1 -5v ~ -15v +/- 2v +/- 1.5v

0 0v 0 5v ~ +15v

訊號 單端訊號   單端訊號  差分訊號   差分訊號

傳輸長度 < 2m <15m <1200m <1200m

不同標準的串列埠,引腳也不一樣。tx/rx是一定存在的。

ttlrx

txgnd

vccstm32f4xx 串列埠控制器

txrx

硬體流控:

rts: request to send 請求傳送訊號

終端告訴對方可以向我傳輸資料啦。

cts: clear to send 清除傳送訊號

對方告知終端,我要向你傳送資料啦

rts -------> cts(對方)

cts <------- rts(對方)

標誌位:

txe: transmit data register empty

傳送資料暫存器為空。

不代表上一次資料已經傳送完成啦,因為資料有可能還在 shifter裡面

但是此時您可以向tdr寫資料啦。

tc : transmit complete

傳送完成。

傳送移位暫存器中的資料已經傳送到tx引腳上面去了。

rxne: read data register not empty

接收資料暫存器不為空。意思是你可以讀資料啦。

stm32f4xx串列埠**流程

(1) gpio口配置

串列埠的tx/rx 引腳是由gpio口來復用的。

a. 使能gpio分組的時鐘

rcc_ahb1periphclockcmd

b. 配置gpio口的功能 gpio_init

c. 選擇具體的復用功能

gpio_pinafconfig

(2) usart配置

a. 使能usart時鐘

b. usart_init

usart_init(usart_typedef * usartx, usart_inittypedef * usart_initstruct);

typedef struct

uint32_t usart_baudrate; // 波特率

uint16_t usart_wordlength; //傳輸字長 ,如下兩個任選其一:

usart_wordlength_8b

usart_wordlength_9b

在stm32中:傳輸字長=資料位數+檢驗位數

uint16_t usart_stopbits; //停止位數,如下 :

usart_stopbits_1 1bit停止位

usart_stopbits_1_5 1.5bit停止位

usart_stopbits_2 2 bits停止位

usart_stopbits_0_5 0.5bit停止位

uint16_t usart_parity; //校驗方式,如下:

usart_parity_no 無校驗

usart_parity_odd 奇校驗

usart_parity_even 偶校驗

uint16_t usart_mode; //串列埠模式, 如下:可以組合

usart_mode_tx 傳送模式

usart_mode_rx 接收模式

usart_mode_tx | usart_mode_rx 傳送和接收模式

uint16_t usart_hardwareflowcontrol; //硬體流控

usart_hardwareflowcontrol_none 無硬體流控

usart_hardwareflowcontrol_rts rts 請求傳送。你可以接收對方的資料。

usart_hardwareflowcontrol_cts cts 清除傳送,你可以發資料給對方。

usart_hardwareflowcontrol_rts_cts rts_cts 傳送和接收都用流控

} usart_inittypedef;

(3) 中斷的配置

usart_itconfig <- 配置串品的中斷

在stm32中乙個usart只對應乙個中斷通道,但是引起串列埠中斷的

事件有很多,比如:

txe -> 傳送暫存器為空,可以引起串列埠中斷

tc -> 傳送完成,可以引起串列埠中斷

rxne -> 接收暫存器不為空,可以引起串列埠中斷

只不過,這些事件需要"中斷控制位使能"

usart_itconfig(usart1, usart_it_rxne,enable);

usart_itconfig就是用來把乙個串列埠的xx事件,配置成是否引起串列埠中斷的

在串列埠中斷函式裡面,就需要判斷是哪個串列埠事件,引起了中斷!!!

nvic_init()

(4) 使能串列埠

usart_cmd

接收(中斷函式)

usart1_irqhanlder()

if (usart_getitstatus(usart1, usart_it_rxne) != reset)

//有資料可讀啦

data = usart_receivedata(usart1); //讀取接收到的資料

//清除usart1的中斷標誌

usart_getitstatus

usart_getitstatus用來獲取串列埠的xx事件標誌位

傳送資料

usart_senddata(usart1, 0x55);

while (usart_getflagstatus(usrat1, usart_flag_txe) == reset); //等待傳送結束

系統移植(告別裸奔)

(stm32 usart串列埠應用)

(stm32直流電機驅動)

(stm32 溫濕度採集)

stm32之spi通訊

嵌入式之STM32系列筆記

一 微控制器程式構架設計 用微控制器開發專案,當 開發到一定的程度後,由於涉及到的源程式檔案與標頭檔案眾多,若在前期為程式設計好架構,則在一定程度上便於程式的維護與管理,更有利於理清思路,加快專案的開發。通常將程式架構設定為四層,如下圖 其中middleware可以沒有,如果沒有外部擴充套件件,如外...

Stm32嵌入式電子相簿簡易實現

kevinten10 stm32 lifecat 基於stm32晶元進行開發,採用480 320解析度內建視訊記憶體模組的lcd顯示屏模組,使用stm32晶元內建的fsmc模擬8080介面時序從而驅動lcd。通過fatfs檔案系統進行sd儲存空間的管理。1 通過fatfs方式讀取fat32格式sd卡...

學STM32還是學嵌入式linux

01 話 題 經常有大學生同學糾結 我到底是學stm32還是學嵌入式linux。這個問題很多人都會有自己的看法,今天我試著從多個角度,把我了解到的事實講一下,希望對大家有所啟發。02 stm32確實好 首先得承認stm32確實好,好到stm32都成了微控制器mcu的代名詞了,現在很多人甚至說微控制器...