ARM裸機開發(四)串列埠程式設計

2021-09-06 05:54:24 字數 3325 閱讀 4685

以下裸機程式基於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 然後訊號線上的訊號值是由訊號線電平和參考電平線的電壓差決定。差分訊號 ...