目的:实现流水灯
1、原理
同上
2、程序
三个文件led3.S、led3.lds、Makefile
led3.S
.text
.global _mystart
_mystart:
/*设置GPM4_0为输出管脚*/
ldr r0, =0x110002E0 //GPM4CON地址
ldr r1, [r0] //取地址内容
bic r1, r1, #0xff00 //清除8-15位 (bic r1, r1, #0xffff这样写编译器报错)
bic r1, r1, #0xff //清除0-7位
orr r1, r1, #0x1100 //设置为输出,即设置8,12为1
orr r1, r1, #0x11 //设置为输出,即设置1,4为1
str r1, [r0] //把r1写入GPM4CON
/*设置GPM4_0数据为高电平*/
ldr r0, =0x110002E4 //GPM4DAT地址
ldr r1, [r0] //取地址内容
led_loop:
bic r1, r1, #0xf //清除0位led1亮
orr r1, r1, #0xe
str r1, [r0] //把r1写入GPM4DAT
ldr r2, =0xffffff
bl delay_loop
bic r1, r1, #0xf //清除1位led2亮
orr r1, r1, #0xd
str r1, [r0] //把r1写入GPM4DAT
ldr r2, =0xffffff
bl delay_loop
bic r1, r1, #0xf //清除2位led3亮
orr r1, r1, #0xb
str r1, [r0] //把r1写入GPM4DAT
ldr r2, =0xffffff
bl delay_loop
bic r1, r1, #0xf //清除3位led4亮
orr r1, r1, #0x7
str r1, [r0] //把r1写入GPM4DAT
ldr r2, =0xffffff
bl delay_loop
b led_loop
loop: //停在这里
b loop
delay_loop: //延时
sub r2, r2, #1
cmp r2, #0
bne delay_loop
mov pc, lr
led3.lds
SECTIONS
{
. = 0x02023400;
.text : { *(.text) }
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data*) }
.bss ALIGN(4) : { *(.bss) *(COMMON) }
}
Makefile
led3.bin
: led3.S
arm-linux-gnueabihf-gcc -c -o led3.o led3.S
arm-linux-gnueabihf-ld -Tled3.lds -N led3.o -o led3.elf
arm-linux-gnueabihf-objcopy -O binary -S led3.elf led3.bin
arm-linux-gnueabihf-objdump -D -m arm led3.elf > led3.dis
clean:
rm -f *.dis *.bin *.elf *.o
3、编译下载
book@book-virtual-machine:~/wang/led3$
ls
led3.bin led3.elf led3.o led3.S.bak Makefile.bak
led3.dis led3.lds led3.S Makefile tools
book@book-virtual-machine:~/wang/led3$ make
arm-linux-gnueabihf-gcc -c -o led3.o led3.S
arm-linux-gnueabihf-ld -Tled3.lds -N led3.o -o led3.elf
arm-linux-gnueabihf-objcopy -O binary -S led3.elf led3.bin
arm-linux-gnueabihf-objdump -D -m arm led3.elf > led3.dis
book@book-virtual-machine:~/wang/led3$ cd tools
book@book-virtual-machine:~/wang/led3/tools$ ls
E4412_N.bl1.bin my_mkbl2 my_mktools.c sd_fusing.sh sd_fusing.sh.bak
book@book-virtual-machine:~/wang/led3/tools$ sudo ./sd_fusing.sh /dev/sdc ../led3.bin
/dev/sdc reader is identified.
---------------------------------------
BL1 fusing
16+0 records in
16+0 records out
8192 bytes (8.2 kB) copied, 0.571442 s, 14.3 kB/s
---------------------------------------
BL2 fusing
28+0 records in
28+0 records out
14336 bytes (14 kB) copied, 1.31417 s, 10.9 kB/s
---------------------------------------
source file image is fused successfully.
Eject SD card and insert it to Exynos 4412 board again.
book@book-virtual-machine:~/wang/led3/tools$
此时已经下载完成,拔开读卡器插入开发板,即可看到LED1-LED4轮流点亮;