大家好,我是ST。
今天主要和大家聊一聊,如何使用串口進行通信的方法。
第一:串口的基本簡介
串口又叫做串行接口,通常叫做COM接口,串行接口指的是數(shù)據(jù)一個一個的順序傳輸,通信線路簡單。使用兩條線即可實現(xiàn)雙向通信,一條用于發(fā)送,一條用于接收。
UART作為串口的一種,其工作原理也是將數(shù)據(jù)一位一位的進行傳輸,發(fā)送和接收各用一條線,因此通過 UART 接口與外界相連最少只需要三條線:TXD(發(fā)送)、RXD(接收)和 GND(地線)。
各個為含義如下:
空閑位:數(shù)據(jù)線在空閑狀態(tài)的時候為邏輯“1”狀態(tài),也就是高電平,表示沒有數(shù)據(jù)線空閑,沒有數(shù)據(jù)傳輸。
起始位:當(dāng)要傳輸數(shù)據(jù)的時候先傳輸一個邏輯“0”,也就是將數(shù)據(jù)線拉低,表示開始數(shù)據(jù)傳輸。
數(shù)據(jù)位:數(shù)據(jù)位就是實際要傳輸?shù)臄?shù)據(jù),數(shù)據(jù)位數(shù)可選擇 5~8 位,我們一般都是按照字節(jié)傳輸數(shù)據(jù)的,一個字節(jié) 8 位,因此數(shù)據(jù)位通常是 8 位的。低位在前,先傳輸,高位最后傳輸。
奇偶校驗位:這是對數(shù)據(jù)中“1”的位數(shù)進行奇偶校驗用的,可以不使用奇偶校驗功能。停止位:數(shù)據(jù)傳輸完成標(biāo)志位,停止位的位數(shù)可以選擇 1 位、1.5 位或 2 位高電平,一般都選擇 1 位停止位。
波特率:波特率就是 UART 數(shù)據(jù)傳輸?shù)乃俾剩簿褪敲棵雮鬏數(shù)臄?shù)據(jù)位數(shù),一般選擇 9600、19200、115200 等。
第二:UART的特點
①、兼容 TIA/EIA-232F 標(biāo)準(zhǔn),速度最高可到 5Mbit/S。
②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。
③、支持 9 位或者多節(jié)點模式(RS-485)。
④、1 或 2 位停止位。
⑤、可編程的奇偶校驗(奇校驗和偶校驗)。
⑥、自動波特率檢測(最高支持 115.2Kbit/S)。
接下來看一下UART幾個重要的寄存器,第一個就是 UART 的控制寄存器 1,即UARTx_UCR1(x=1~8)。
第二個寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中要用的是位RFDIV(bit9:7),用來設(shè)置參考
通過這三個寄存器可以設(shè)置UART的波特率,波特率的計算公式為:
? ?
Ref Freq:經(jīng)過分頻以后進入 UART 的最終時鐘頻率。
UBMR:寄存器 UARTx_UBMR 中的值。
UBIR:寄存器 UARTx_UBIR 中的值。
通過 UARTx_UFCR 的 RFDIV 位、UARTx_UBMR 和 UARTx_UBIR 這三者的配合即可得
到我們想要的波特率。比如現(xiàn)在要設(shè)置 UART 波特率為 115200,那么可以設(shè)置 RFDIV 為
5(0b101),也就是 1 分頻,因此 Ref Freq=80MHz。設(shè)置 UBIR=71,UBMR=3124,根據(jù)上面的
公式可以得到:
第三:UART的配置步驟
1、設(shè)置 UART1 的時鐘源
設(shè)置 UART 的時鐘源為 pll3_80m,設(shè)置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位為 0
即可。
2、初始化 UART1
初始化 UART1 所使用 IO,設(shè)置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,設(shè)置內(nèi)
容包括波特率,奇偶校驗、停止位、數(shù)據(jù)位等等。
4、使能 UART1
UART1 初始化完成以后就可以使能 UART1 了,設(shè)置寄存器 UART1_UCR1 的位 UARTEN
為 1。
5、編寫 UART1 數(shù)據(jù)收發(fā)函數(shù)
編寫兩個函數(shù)用于 UART1 的數(shù)據(jù)收發(fā)操作。
第四:代碼基本實現(xiàn)
先實現(xiàn)串口的頭文件的基寫法:
#ifndef _BSP_UART_H #define_BSP_UART_H //函數(shù)聲明 void uart_init(void); void uart_to_init(void); void uart_disable(UART_Type *base); voiduart_enable((UART_Type*base); #endif
函數(shù)聲明中,繼續(xù)編寫對應(yīng)的源文件內(nèi)容:
#include "uart.h" //初始化串口1,波特率為115200 void uart_init(void) { //初始化串口IO uart_io_init(); /*2、初始化UART1*/ uart_disable(UART1);/*先關(guān)閉UART1*/ uart_softreset(UART1);/*軟件復(fù)位UART1*/ UART1->UCR1=0;/*先清除UCR1寄存器*/ UART1->UCR1&=~(1<<14);?/*?關(guān)閉自動波特率檢測?*/ /* ?*?設(shè)置?UART?的?UCR2?寄存器,設(shè)置字長,停止位,校驗?zāi)J剑P(guān)閉硬件流控 ?*?bit14:?1?忽略?RTS?引腳 ?*?bit8:?0?關(guān)閉奇偶校驗 ?*?bit6:?0?1?位停止位 ?*?bit5:?1?8?位數(shù)據(jù)位 ?*?bit2:?1?打開發(fā)送 ?*?bit1:?1?打開接收 ?*/ ?UART1->UCR2|=(1<<14)?|?(1<<5)?|?(1<<2)?|?(1<<1); ?UART1->UCR3|=1<<2;?/*?UCR3?的?bit2?必須為?1?*/ ? ?/* ?*?設(shè)置波特率 ?*?波特率計算公式:Baud?Rate?=?Ref?Freq?/?(16?*?(UBMR?+?1)/(UBIR+1))? ?*?如果要設(shè)置波特率為?115200,那么可以使用如下參數(shù): ?*?Ref?Freq?=?80M?也就是寄存器?UFCR?的?bit9:7=101,?表示?1?分頻 ?*?UBMR?=?3124 ?*?UBIR?=?71 ?*?因此波特率=?80000000/(16?*?(3124+1)/(71+1)) ?*?=?80000000/(16?*?3125/72)? ?*?=?(80000000*72)?/?(16*3125)? ?*?=?115200 ?*/ ?UART1->UFCR=5<<7;?/*?ref?freq?等于?ipg_clk/1=80Mhz?*/ ?UART1->UBIR=71; UART1->UBMR=3124; #if0 uart_setbaudrate(UART1,115200,80000000);/*設(shè)置波特率*/ #endif uart_enable(UART1);/*使能串口*/ }
總結(jié):實現(xiàn)串口的基本功能,對后面利用串口來調(diào)試程序,具有重要的實踐意義。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11345瀏覽量
210391 -
uart
+關(guān)注
關(guān)注
22文章
1243瀏覽量
101768 -
串口通信
+關(guān)注
關(guān)注
34文章
1627瀏覽量
55728
原文標(biāo)題:Linux中裸機串口通信的基本方法
文章出處:【微信號:嵌入式開發(fā)愛好者,微信公眾號:嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論