ARM裸機學習筆記(六)串列埠通訊

2021-10-04 02:15:23 字數 4559 閱讀 2567

同步通訊

收發雙方按照同一時鐘節拍工作,( 一般需要傳送方給接收方傳送資訊同時傳送時鐘訊號)

非同步通訊

傳送方和接收方沒有統一的時鐘節拍、而各自按照自己的節拍工作就叫非同步

電平訊號

電平訊號的傳輸線中有乙個參考電平線(一般是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位資...