同步通訊
收發雙方按照同一時鐘節拍工作,( 一般需要傳送方給接收方傳送資訊同時傳送時鐘訊號)
非同步通訊
傳送方和接收方沒有統一的時鐘節拍、而各自按照自己的節拍工作就叫非同步
電平訊號
電平訊號的傳輸線中有乙個參考電平線(一般是gnd),然後訊號線上的訊號值是由訊號線電平和參考電平線的電壓差決定。
差分訊號
差分訊號的傳輸線中沒有參考電平,所有都是訊號線。然後1和0的表達靠訊號線之間的電壓差。
並行介面
並行介面是指資料的各位同時進行傳送,其特點是傳輸速度快,但當傳輸距離較遠、位數又多時,導致了通訊線路複雜且成本提高
序列介面
序列介面是指資料一位位地順序傳送,其特點是通訊線路簡單,只要一對傳輸線就可以實現雙向通訊
fifo模式及其作用
(1)典型的串列埠設計,傳送/接收緩衝區只有1位元組,每次傳送/接收只能處理1幀資料。這樣在微控制器中沒什麼問題,但是到複雜soc中(一般有作業系統的)就會有問題,會導致效率低下,因為cpu需要不斷切換上下文。 (2)解決方案就是想辦法擴充套件串列埠控制器的傳送/接收緩衝區,譬如將傳送/接收緩衝器設定為64位元組,cpu一次過來直接給傳送緩衝區64位元組的待傳送資料,然後transmitter慢慢發,發完再找cpu再要64位元組。但是串列埠控制器本來的傳送/接收緩衝區是固定的1位元組長度的,所以做了個變相的擴充套件,就是fifo。 (3)fifo就是first in first out,先進先出。fifo其實是一種資料結構,這裡這個大的緩衝區叫fifo是因為這個緩衝區的工作方式類似於fifo這種資料結構。
dma模式及其作用
(1)dma direct memory access,直接記憶體訪問。dma本來是dsp中的一種技術,dma技術的核心就是在交換資料時不需要cpu參與,模組可以自己完成。 (2)dma模式要解決的問題和上面fifo模式是同乙個問題,就是串列埠傳送/接收要頻繁的折騰cpu造成cpu反覆切換上下文導致系統效率低下。 (3)傳統的串列埠工作方式(無fifo無dma)效率是最低的,適合低端微控制器;高階微控制器上cpu事物繁忙所以都需要串列埠能夠自己完成大量資料傳送/接收。這時候就需要fifo或者dma模式。fifo模式是一種輕量級的解決方案,dma模式適合大量資料迸發式的傳送/接收時。
irda模式及其用法
(1)irda其實就是紅外,紅外就是紅外線通訊(電視機、空調遙控器就是紅外通訊的)。 (2)紅外通訊的原理是傳送方固定間隔時間向接收方傳送紅外訊號(表示1或0)或者不傳送紅外訊號(表示0或者1),接收方每隔固定時間去判斷有無紅外線訊號來接收1和0. (3)分析可知,紅外通訊和串列埠通訊非常像,都是每隔固定時間傳送1或者0(判斷1或0的物理方式不同)給接收方來通訊。因此210就利用串列埠通訊來實現了紅外傳送和接收。 (4)210的某個串列埠支援irda模式,開啟紅外模式後,我們只需要向串列埠寫資料,這些資料就會以紅外光的方式向外發射出去(當然是需要一些外部硬體支援的),然後接收方接收這些紅外資料即可解碼得到我們的傳送資訊。
初始化串列埠的tx和rx引腳所對應的gpio(查原理圖可知rx和rx分別對應gpa0_1和gpa0_0)
初始化這幾個關鍵暫存器ucon0 ulcon0 umcon0 ufcon0 ubrdiv0 udivslot0
ucon0
0x03(0校驗位、8資料位、1停止位)
ulcon0
0x05(傳送和接收都是polling mode)
umcon0
0x00(禁止modem、afc)
ufcon0
0x00(禁止fifo)
ubrdiv0
波特率計算相關,需要根據情況計算
udivslot0
波特率計算相關,需要根據情況計算
波特率的計算和設定
(2)第二步,ubrdiv0暫存器中寫入div_val的整數部分
(3)第三步,用小數部分*16得到1個個數,查表得ubdivslot0暫存器的設定值
**
/*
* 檔名:uart.c
* 描述:配置串列埠0
*/#define gpa0con 0xe0200000
#define ucon0 0xe2900004
#define ulcon0 0xe2900000
#define umcon0 0xe290000c
#define ufcon0 0xe2900008
#define ubrdiv0 0xe2900028
#define udivslot0 0xe290002c
#define utrstat0 0xe2900010
#define utxh0 0xe2900020
#define urxh0 0xe2900024
#define rgpa0con (*(volatile unsigned int *)gpa0con)
#define rucon0 (*(volatile unsigned int *)ucon0)
#define rulcon0 (*(volatile unsigned int *)ulcon0)
#define rumcon0 (*(volatile unsigned int *)umcon0)
#define rufcon0 (*(volatile unsigned int *)ufcon0)
#define rubrdiv0 (*(volatile unsigned int *)ubrdiv0)
#define rudivslot0 (*(volatile unsigned int *)udivslot0)
#define rutrstat0 (*(volatile unsigned int *)utrstat0)
#define rutxh0 (*(volatile unsigned int *)utxh0)
#define rurxh0 (*(volatile unsigned int *)urxh0)
// 串列埠初始化程式
void
uart_init
(void
)// 串列埠傳送程式,傳送乙個位元組
void
putc
(char c)
// 串列埠接收程式,輪詢方式,接收乙個位元組
char
getc
(void
)
printf函式的工作原理
(1)printf函式工作時內部實際呼叫了2個關鍵函式:
移植printf函式的三種思路
我們課程中使用第三種方法,別人移植好的printf函式來自於友善之臂的tiny210的裸機教程中提供的。
gcc可變引數及va_arg介紹
vsprintf函式
#
#檔名:makefile
#描述:移植uart stdio時 makefile 做了一些修改
#cc = arm-linux-gcc
ld = arm-linux-ld
objcopy = arm-linux-objcopy
objdump = arm-linux-objdump
ar = arm-linux-ar
incdir := $(shell pwd)
# c預處理器的flag,flag就是編譯器可選的選項
cppflags := -nostdlib -nostdinc -i$(incdir)/include
# c編譯器的flag
cflags := -wall -o2 -fno-builtin
# -wall是所有的警告資訊都要提示,這樣編譯出來的程式很健壯;
# -o2表示編譯時使用2級優化
#匯出這些變數到全域性,其實就是給子資料夾下面的makefile使用
export cc ld objcopy objdump ar cppflags cflags
objs := start.o sdram_init.o led.o uart.o main.o
#objs += clock.o
objs += lib/libc.a # 新增lib資料夾下的makefile依賴
uart.bin: $(objs)
$(ld) -tlink.lds -o uart.elf $^
$(objcopy) -o binary uart.elf uart.bin
$(objdump) -d uart.elf > uart_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 uart.bin 210.bin
# 呼叫子makefile
lib/libc.a:
cd lib; make; cd ..
%.o : %.s
$(cc) $(cppflags) $(cflags) -o $@ $< -c
%.o : %.c
$(cc) $(cppflags) $(cflags) -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
# 進入子makefile清除子makefile 執行 makeclean
cd lib; make clean; cd ..
ARM裸機 FS2410串列埠通訊(UART)
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 二 fs2410串列埠的原理圖 三 串列埠uart暫存器配置 1 配置txd0與rxd0 gph2 gph3 2 設定波特率 ubrdivn 3 設定傳輸格式 ulconn 4 選擇時鐘源與中斷方式 uconn 5 設定f...
Stm32學習(六)串列埠配置(二)
1.串列埠配置的一般步驟 1 串列埠時鐘使能,gpio時鐘使能 rcc apb2periphclockcmd 2 串列埠復位 usart deinit 這一步不是必須的 3 gpio埠模式設定 gpio init 模式設定gpio mode af pp 4 串列埠引數初始化 usart init 5...
ARM裸機開發(四)串列埠程式設計
以下裸機程式基於gt2440,編譯器為arm linux gcc 4.4.3。程式結構 程式只有乙個uart.s檔案。程式流程 首先上電復位,進入復位異常處理,關閉看門狗,初始化系統時鐘 fclk 400mhz,hclk 100mhz,pclk 50mhz 初始化串列埠 無檢驗位,1位停止位,8位資...