歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Tiny4412匯編流水燈代碼,Tiny4412裸機LED操作

從今天開始就正式進入到tiny4412的開發學習中了,今天主要看了一下Tiny4412的啟動流程及存儲器映射及Exynos4412數據手冊,用匯編寫了一個跑馬燈程序(後續會有C語言版本的出來),先說一下我的開發環境吧:

開發板:Tiny4412 增強版 (底板是Tiny4412ADK 1312)

開發工具:UltraEdit

宿主機:VmWare Ubuntu12.04(64bit)

編譯工具:arm-linux-gcc4.5.1

為了便於分類管理,特意開了一個Tiny4412學習專區,希望對大家有所幫助,下面進入正題,說一下跑馬燈程序。

一、控制原理說明

tiny4412核心板

tiny4412核心板

先看一下原理圖:

tiny4412-led原理圖

tiny4412-led原理圖

tiny4412-led原理圖

tiny4412-led原理圖

如上圖可知,Tiny4412有4個用戶LED燈,控制它們四個引腳分別是GPM4_0~ GPM4_3,由原理可知,當IO引腳為高電平時,LED燈滅,當IO引腳為低電平時LED亮。我們要做的工作就是設置GPM4_0~ GPM4_3為輸出功能,且控制且輸出電平高低即可。

二、程序說明

1.led.S

由原理圖可知,程序只進行了兩步操作;

第一步:設置GPM4_0~GPM4_3相對應的控制寄存器GPM4CON,使GPM4_0~ GPM4_3四個引腳為輸出功能。

Tiny4412-GPM4CON

Tiny4412-GPM4CON

第二步:設置其對應的數據寄存器GPM4DAT對應的4個bit位為0,使GPM4_0~ GPM4_3為低電平,4個LED燈全亮,等待一段時間將第0位設置為0,其余位設置為1,這樣只有第一個燈亮;等待一段時間將第1位設置為0,其余位設置為1,這樣只有第二個燈亮;等待一段時間將第2位設置為0,其余位設置為1,這樣只有第三個燈亮;等待一段時間將第3位設置為0,其余位設置為1,這樣只有第四個燈亮;等待一段時間使GPM4_0~ GPM4_3全為高電平,4個LED燈全滅。這樣就實現了跑馬燈效果。

程序代碼中,也有相關解釋這裡不做過多說明。


.text
.globl _start
_start:

/*
* set GPM4 as output
*/
ldr r0, =0x110002E0 // GPM4CON的地址是0x110002E0
ldr r1, [r0] // 先讀出原值
bic r1, r1, #0xff00 // 清除bit[15:8]
bic r1, r1, #0xff // 清除bit[7:0]
orr r1, r1, #0x1100 // 設置bit[15:8]為0b00010001
orr r1, r1, #0x11 // 設置bit[7:0]為0b00010001
str r1, [r0] // 寫入GPM4CON
/*
* set GPM4DAT as Low For leds
*/
ldr r0, =0x110002E4 // GPM4DAT的地址是0x110002E0
ldr r1, [r0] // 讀出原值

leds_loop:

bic r1, r1, #0xf // 清除bit[0-3]為0 全亮
str r1, [r0] // 寫入GPM4DAT
ldr r2,=0xffffff
bl delay

orr r1, r1, #0xe // 設置bit[0]為0 LED1亮
str r1, [r0] // 寫入GPM4DAT
ldr r2,=0xffffff
bl delay

bic r1, r1, #0x3 // 設置bit[1]為0 LED2亮
orr r1, r1, #1
str r1, [r0] // 寫入GPM4DAT
ldr r2,=0xffffff
bl delay

bic r1, r1, #0x6 // 設置bit[2]為0 LED3亮
orr r1, r1, #2
str r1, [r0] // 寫入GPM4DAT
ldr r2,=0xffffff
bl delay

bic r1, r1, #0xc // 設置bit[3]為0 LED4亮
orr r1, r1, #4
str r1, [r0] // 寫入GPM4DAT
ldr r2,=0xffffff
bl delay

orr r1, r1, #0xf
str r1, [r0] // 寫入GPM4DAT 全滅
ldr r2,=0xffffff
bl delay

b leds_loop
halt_loop:
b halt_loop

delay:
//跑馬燈延時程序
sub r2,r2,#1 //sub 減法
cmp r2,#0x0 //將r0 與0比較
bne delay //b是跳 ne 是不相等 ,不相等就跳到delay
mov pc,lr //lr 裡存的是調用函數時的下一條指令,讓Pc指針指向lr就可以完成函數的返回

2. MakeFile說明


led.bin : led.S
arm-linux-gcc -c -o led.o led.S
arm-linux-ld -Tled.lds -N led.o -o led.elf
arm-linux-objcopy -O binary -S led.elf led.bin
arm-linux-objdump -D -m arm led.elf > led.dis
clean:
rm -f *.dis *.bin *.elf *.o

當我們在Makefile所在目錄下執行make命令時,系統會進行如下操作:

Copyright © Linux教程網 All Rights Reserved