什麼是串列埠
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的代名詞了,現在很多人甚至說微控制器...