uart是universal asynchronous receiver and transmitter簡稱,中文為通用非同步接收和傳送器,是常用的序列通訊介面。
uart的作用是列印串列埠輸出資訊和連線各種外用裝置
優點是硬體簡單,而且傳輸資訊穩定;但是缺點也很明顯,傳輸資訊非常慢,因為uart是以單個位元組單位來傳遞資訊
uart的最重要引數是波特率,這是決定了傳輸資訊期間每個資料位占用多長時間
uart的資料格式
一般開發板和主機會約定,起始的邏輯電平是高電位,然後電位被拉低,並保持乙個位的時間;
然後就是資料位,資料位通常是8位
接著是校驗位
最後是終止位,終止位為高電平
uart使用標準的ttl/cmcos邏輯電平來表示資料,由於其電位水平比較低,長距離傳輸會導致電平衰減,所以我們引入了另外一種模式rs-232邏輯電平,它的電平更高,有利於長距離資訊傳輸
現在我們來討論一下為什麼uart的資訊傳遞很慢呢?
開發的記憶體中的資訊通過uart串列埠傳遞到pc主機記憶體的大致過程為:我們知道串列埠線傳送資訊是逐位傳送,記憶體上的資訊拷貝到fifo上,fifo會把資訊傳遞給移位器上,移位器會逐位把資訊按照uart協議以電平的方式傳遞給txd管腳,然後pc機讀rxd就可以獲取資訊。所以我們知道傳遞資訊慢的根本原因就是只能單個位元組傳送資訊,我們假設波特率為115200,資料位長度為8,那麼傳遞乙個位元組資訊占有10位,所以理想情況下uart一秒鐘可以傳遞11520位元組資訊,大概11kb,所以非常的慢。另外序列傳輸資訊決定了其穩定性
來看下示例**
工具函式 uart.c (其中標頭檔案主要是對暫存器的巨集定義)
#include
"s3c2440_soc.h"
void
uart0_init()
/*無論是傳送資訊還是讀取資訊,都是直接對相應的暫存器進行寫或者讀操作
所以必須要在晶元手冊上找到對應的暫存器
*/int
putchar
(int c)
intgetchar
(void
)int
puts
(const
char
*s)}
標頭檔案 uart.h
#ifndef _uart_h
#define _uart_h
void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);
#endif
測試**
#include
"s3c2440_soc.h"
#include
"uart.h"
intmain
(void)if
(c ==
'\n'
)putchar
(c);
}return0;
}
為了更為深入的理解uart串列埠,我們來試著裸機實現printf函式,這個還是有一些挑戰性的
首先在實現之前我們來深入了解一下printf這個函式,弄清楚它的原理
我從下午分析到深夜,覺得如下**就是扯淡
1 #include 23
struct person;9
10/*
11 * printf的標準定義是 int printf(const char *format, ...);
12 * 我們在這裡對可變引數進行深入分析,其實還是對指標進行分析
13 *
14 */
15void
put_test
(const
char
*format,..
.)1645
46int
main
(void)47
;495051
put_test
("abc"
,123
, pec,
'c');52
printf
("&pec = %p\n"
,&pec)
;"test_1.c"
[dos]
55l,
1400c
在這裡插入**片
執行結果
arg1: abc
p =0x7ffc308eced8
arg2:
4195488
sizeof
(char*)
=8, p =
0x7ffc308ecee0
arg3: name =
0x308ecee4004004a0
, age =
32764
, score = �, id =
814665444
sizeof
(int)=
4, p =
0x7ffc308ecee4
arg4: c = �
sizeof
(struct person)=24
, p =
0x7ffc308ecefc
&pec =
0x7ffc308ecff0
在這裡插入**片
顯然如今儲存方式和以前不一樣了,並不是連續儲存,根本就無法通過直接通過移動指標**其他區域性變數存放的位置。
如果有大神看到了,希望能幫忙解惑,謝謝!
在這裡分析一下uart.c 如何用串列埠實現列印
#include
"s3c2440_soc.h"
/* 115200,8n1 */
void
uart0_init()
intputchar
(int c)
intgetchar
(void
)int
puts
(const
char
*s)return0;
}/* 0xabcdef12 */
void
printhex
(unsigned
int val)
/* 列印 */
puts
("0x");
for(i =
7; i >=
0; i--)}
void
print1
(void
)void
print2
(void
)void
printswival
(unsigned
int*pswi)
void uart0_init(void) 函式所做的事
uart串列埠暫存器配置流程
設定gpio引腳,使之為uart串列埠輸出
如果是ttl/cmos,則需要使能內部上拉。
設定時鐘、波特率和資料格式
int putchar(int c)
取出
UART串列埠通訊
先簡單說說串列埠通訊 uart 我做的這個實驗只針對rs232標準,在fpga與上位機給出的rs232口之間通過電平轉換電路 最上面圖中的max232晶元 實現ttl電平與rs232電平之間的轉換。我們只關心rs232 tx和rs232 rx兩個訊號,rs232 tx是資料傳送埠,rs232 rx是...
UART串列埠程式設計
常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 dev 目錄下,串列埠一,串列埠二分別為 dev ttys0 d...
介面協議學習(四) UART(串列埠)
uart universal asynchronous receiver transmitter,通用非同步收發傳輸器 是一種全雙工收發協議。序列通訊分為兩種方式 同步串列埠通訊和非同步串列埠通訊。同步串列埠通訊需要接髮雙方在同一時鐘的控制下進行操作,因為很多分立的電子系統的驅動時鐘並不相同,所以實...