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