大家好,我是ST。
今天主要和大家聊一聊,如何使用串口進(jìn)行通信的方法。
第一:串口的基本簡(jiǎn)介
串口又叫做串行接口,通常叫做COM接口,串行接口指的是數(shù)據(jù)一個(gè)一個(gè)的順序傳輸,通信線路簡(jiǎn)單。使用兩條線即可實(shí)現(xiàn)雙向通信,一條用于發(fā)送,一條用于接收。
UART作為串口的一種,其工作原理也是將數(shù)據(jù)一位一位的進(jìn)行傳輸,發(fā)送和接收各用一條線,因此通過(guò) UART 接口與外界相連最少只需要三條線:TXD(發(fā)送)、RXD(接收)和 GND(地線)。
各個(gè)為含義如下:
空閑位:數(shù)據(jù)線在空閑狀態(tài)的時(shí)候?yàn)檫壿嫛?”狀態(tài),也就是高電平,表示沒有數(shù)據(jù)線空閑,沒有數(shù)據(jù)傳輸。
起始位:當(dāng)要傳輸數(shù)據(jù)的時(shí)候先傳輸一個(gè)邏輯“0”,也就是將數(shù)據(jù)線拉低,表示開始數(shù)據(jù)傳輸。
數(shù)據(jù)位:數(shù)據(jù)位就是實(shí)際要傳輸?shù)臄?shù)據(jù),數(shù)據(jù)位數(shù)可選擇 5~8 位,我們一般都是按照字節(jié)傳輸數(shù)據(jù)的,一個(gè)字節(jié) 8 位,因此數(shù)據(jù)位通常是 8 位的。低位在前,先傳輸,高位最后傳輸。
奇偶校驗(yàn)位:這是對(duì)數(shù)據(jù)中“1”的位數(shù)進(jìn)行奇偶校驗(yàn)用的,可以不使用奇偶校驗(yàn)功能。停止位:數(shù)據(jù)傳輸完成標(biāo)志位,停止位的位數(shù)可以選擇 1 位、1.5 位或 2 位高電平,一般都選擇 1 位停止位。
波特率:波特率就是 UART 數(shù)據(jù)傳輸?shù)乃俾?,也就是每秒傳輸?shù)臄?shù)據(jù)位數(shù),一般選擇 9600、19200、115200 等。
第二:UART的特點(diǎn)
①、兼容 TIA/EIA-232F 標(biāo)準(zhǔn),速度最高可到 5Mbit/S。
②、支持串行 IR 接口,兼容 IrDA,最高可到 115.2Kbit/s。
③、支持 9 位或者多節(jié)點(diǎn)模式(RS-485)。
④、1 或 2 位停止位。
⑤、可編程的奇偶校驗(yàn)(奇校驗(yàn)和偶校驗(yàn))。
⑥、自動(dòng)波特率檢測(cè)(最高支持 115.2Kbit/S)。
接下來(lái)看一下UART幾個(gè)重要的寄存器,第一個(gè)就是 UART 的控制寄存器 1,即UARTx_UCR1(x=1~8)。
第二個(gè)寄存器UARTx_UFCR、UARTx_UBIR和UARTx_UBMR,寄存器UARTx_UFCR中要用的是位RFDIV(bit9:7),用來(lái)設(shè)置參考
通過(guò)這三個(gè)寄存器可以設(shè)置UART的波特率,波特率的計(jì)算公式為:
? ?
Ref Freq:經(jīng)過(guò)分頻以后進(jìn)入 UART 的最終時(shí)鐘頻率。
UBMR:寄存器 UARTx_UBMR 中的值。
UBIR:寄存器 UARTx_UBIR 中的值。
通過(guò) 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í)鐘源
設(shè)置 UART 的時(shí)鐘源為 pll3_80m,設(shè)置寄存器 CCM_CSCDR1 的 UART_CLK_SEL 位為 0
即可。
2、初始化 UART1
初始化 UART1 所使用 IO,設(shè)置 UART1 的寄存器 UART1_UCR1~UART1_UCR3,設(shè)置內(nèi)
容包括波特率,奇偶校驗(yàn)、停止位、數(shù)據(jù)位等等。
4、使能 UART1
UART1 初始化完成以后就可以使能 UART1 了,設(shè)置寄存器 UART1_UCR1 的位 UARTEN
為 1。
5、編寫 UART1 數(shù)據(jù)收發(fā)函數(shù)
編寫兩個(gè)函數(shù)用于 UART1 的數(shù)據(jù)收發(fā)操作。
第四:代碼基本實(shí)現(xiàn)
先實(shí)現(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ù)編寫對(duì)應(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)閉自動(dòng)波特率檢測(cè)?*/ /* ?*?設(shè)置?UART?的?UCR2?寄存器,設(shè)置字長(zhǎng),停止位,校驗(yàn)?zāi)J?,關(guān)閉硬件流控 ?*?bit14:?1?忽略?RTS?引腳 ?*?bit8:?0?關(guān)閉奇偶校驗(yà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è)置波特率 ?*?波特率計(jì)算公式: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é):實(shí)現(xiàn)串口的基本功能,對(duì)后面利用串口來(lái)調(diào)試程序,具有重要的實(shí)踐意義。
審核編輯:湯梓紅
-
Linux
+關(guān)注
關(guān)注
87文章
11178瀏覽量
208500 -
uart
+關(guān)注
關(guān)注
22文章
1216瀏覽量
101008 -
串口通信
+關(guān)注
關(guān)注
34文章
1605瀏覽量
55328
原文標(biāo)題:Linux中裸機(jī)串口通信的基本方法
文章出處:【微信號(hào):嵌入式開發(fā)愛好者,微信公眾號(hào):嵌入式開發(fā)愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論