從今天開始就正式進入到tiny4412的開發學習中了,今天主要看了一下Tiny4412的啟動流程及存儲器映射及Exynos4412數據手冊,用匯編寫了一個跑馬燈程序(後續會有C語言版本的出來),先說一下我的開發環境吧:
開發板:Tiny4412 增強版 (底板是Tiny4412ADK 1312)
開發工具:UltraEdit
宿主機:VmWare Ubuntu12.04(64bit)
編譯工具:arm-linux-gcc4.5.1
為了便於分類管理,特意開了一個Tiny4412學習專區,希望對大家有所幫助,下面進入正題,說一下跑馬燈程序。
先看一下原理圖:
如上圖可知,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四個引腳為輸出功能。
第二步:設置其對應的數據寄存器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命令時,系統會進行如下操作: