以下裸機程式基於gt2440,編譯器為arm-linux-gcc-4.4.3。
程式結構:程式只有乙個uart.s檔案。
程式流程:首先上電復位,進入復位異常處理,關閉看門狗,初始化系統時鐘(fclk=400mhz,hclk=100mhz,pclk=50mhz),初始化串列埠(無檢驗位,1位停止位,8位資料位,115200bps),最後跳到test_uart子程式,在該程式裡不斷等待使用者輸入資料(乙個位元組),如果使用者輸入了資料就跳到傳送資料子程式,在子程式裡將使用者輸入的資料+1後再傳送給使用者,此時使用者可以在終端看到被+1了的資料。
uart.s:
1//暫存器實體地址巨集定義
2#define wtcon 0x5300000034
#define locktime 0x4c000000
5#define mpllcon 0x4c000004
6#define upllcon 0x4c000008
7#define clkdivn 0x4c000014
8#define camdivn 0x4c000018910
#define ulcon0 0x50000000
11#define ucon0 0x50000004
12#define ufcon0 0x50000008
13#define utrstat0 0x50000010
14#define utxh0 0x50000020
15#define urxh0 0x50000024
16#define ubrdiv0 0x50000028
1718
#define gphcon 0x56000070
1920
21.global _start
22_start:
23b reset
2425
26reset:
27bl disable_watchdog
28bl init_clock
29bl init_uart
30b test_uart
3132
33//關閉看門狗
34disable_watchdog:
35ldr r0,=wtcon
36bic r1,r0,#0x20
37str
r1,[r0]
3839
movpc,lr
4041
//fclk=400mhz,hclk=100mhz,pclk=50mhz
42//uclk=48mhz
43init_clock:
44ldr r0,=locktime
45ldr r1,=0x00ffffff
46str
r1,[r0]
47ldr r0,=clkdivn
48ldr r1,=0x05
49str
r1,[r0]
50//設為非同步匯流排模式(因為fclk不等於hclk)
51 mrc p15,0,r1,c1,c0,0
52orr r1,r1,#0xc0000000
53 mcr p15,0,r1,c1,c0,0
5455
ldr r0,=mpllcon
56ldr r1,=0x5c011
57str
r1,[r0]
58ldr r0,=upllcon
59ldr r1,=0x38022
60str
r1,[r0]
6162
movpc,lr
6364
//初始化串列埠
65init_uart:
66//io口設定為串列埠功能
67ldr r0,=gphcon
68ldr r1,=0xa0
69str
r1,[r0]
70//無檢驗位,1位停止位,8位資料位
71ldr r0,=ulcon0
72ldr r1,=0x03
73str
r1,[r0]
74//pclk作為時鐘源(50mhz)
75ldr r0,=ucon0
76ldr r1,=0x05
77str
r1,[r0]
78//波特率115200bps
79ldr r0,=ubrdiv0
80ldr r1,=0x1a
81str
r1,[r0]
8283
//傳送乙個位元組
84send_one_byte:
85wait_se:
86//讀傳送狀態位
87ldr r0,=utrstat0
88ldr r1,[r0]
89and
r1,r1,#0x4
90cmp
r1,#0x4
91//如果傳送狀態位不為0則不斷讀狀態位
92bne wait_se
93 //寫入要傳送的資料(使用者輸入的資料+1)94
ldr r3,=utxh0
95add r4,r4,#1
96str
r4,[r3]
9798
movpc,lr
99100
test_uart:
101wait_rec:
102//讀接收狀態位
103ldr r0,=utrstat0
104ldr r1,[r0]
105and
r1,r1,#0x1
106cmp
r1,#0x1
107//如果接收狀態位不為1則不斷讀狀態位
108bne wait_rec
109//讀入使用者輸入的資料
110ldr r2,=urxh0
111ldr r4,[r2]
112//呼叫傳送函式
113bl send_one_byte
114 b test_uart //不斷迴圈
makefile:
1 uart.bin:2arm-linux-gcc -g -c -o uart.o uart.s
3arm-linux-ld -ttext 0x00000000 -g uart.o -o uart_elf
4arm-linux-objcopy -o binary -s uart_elf uart.bin
5rm -f uart_elf uart.o67
clean:
8 rm -f uart.bin
arm 裸機程式設計 串列埠篇
uart 通用非同步收發器,是一種全雙工序列非同步通訊 波特率與bps 實際上波特率並不等於bps。波特率 一秒鐘傳輸碼元的個數 bps 一秒鐘傳送的位元位位數 而碼元是承載資訊量的基本訊號單位,乙個二進位制碼元佔乙個位元位 所以僅傳輸二進位制碼元時,bps等於波特率 同步和非同步方式 非同步 非同...
ARM裸機 FS2410串列埠通訊(UART)
一 開發環境 1 硬體平台 fs2410 2 主機 ubuntu 10.10 二 fs2410串列埠的原理圖 三 串列埠uart暫存器配置 1 配置txd0與rxd0 gph2 gph3 2 設定波特率 ubrdivn 3 設定傳輸格式 ulconn 4 選擇時鐘源與中斷方式 uconn 5 設定f...
ARM裸機學習筆記(六)串列埠通訊
同步通訊 收發雙方按照同一時鐘節拍工作,一般需要傳送方給接收方傳送資訊同時傳送時鐘訊號 非同步通訊 傳送方和接收方沒有統一的時鐘節拍 而各自按照自己的節拍工作就叫非同步 電平訊號 電平訊號的傳輸線中有乙個參考電平線 一般是gnd 然後訊號線上的訊號值是由訊號線電平和參考電平線的電壓差決定。差分訊號 ...