学习笔记,高手勿笑!
汇编语言循环点灯程序:
start.S
/******************/
/*循环点亮4盏LED灯*/
/******************/
.globl _start
_start:
/* 硬件相关的设置 */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4 @ 256M(0x70000000-0x7fffffff)
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/* 设置GPMCON让GPM0-3作为输出引脚 */
/*GPMCON = 0x7F008820,GPMDAT 0x7F008824*/
ldr r0, =0x7F008820
ldr r1, =0x1111
str r1, [r0]
/* 设置GPMDAT让GPM3输出0 */
ldr r1, =0x7F008824
mov r0, #0
str r0, [r1]
bl delay
loop:
/* 点亮LED1 */
mov r0, #0xE
str r0,[r1]
bl delay
/* 点亮LED2 */
mov r0, #0xD
str r0,[r1]
bl delay
/* 点亮LED3 */
mov r0, #0xB
str r0,[r1]
bl delay
/* 点亮LED4 */
mov r0, #0x7
str r0,[r1]
bl delay
b loop
/*延时*/
delay:
mov r2, #0x10000
delay_loop:
sub r2, r2,#1
cmp r2, #0
bne delay_loop
mov pc, lr
halt:
b halt
makefile
led.bin: start.o
arm-linux-ld -Ttext 0 -o led.elf start.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o: start.S
arm-linux-gcc -o start.o -c start.S
clean:
rm -f start.o led.dis led.bin led.elf
在linux主机上面编译好后下载到nandflash,就可以看到LED灯循环闪动。
-------------------------------------
C语言循环点灯程序:
start.S
.globl _start
_start:
/* 硬件相关的设置 */
/* Peri port setup */
ldr r0, =0x70000000
orr r0, r0, #0x13
mcr p15,0,r0,c15,c2,4
/* 关看门狗 */
/* 往WTCON(0x7E004000)写0 */
ldr r0, =0x7E004000
mov r1, #0
str r1, [r0]
/*设置C语言语言环境*/
ldr sp, =8*1024
bl main
halt:
b halt
led.c
/*GPMCON = 0x7F008820,GPMDAT 0x7F008824*/
#define GPMCON (*(volatile unsigned long *)0x7F008820)
#define GPMDAT (*(volatile unsigned long *)0x7F008824)
void delay()
{
volatile int i;
for(i = 0; i < 0x10000; i++);
}
int main()
{
int i;
GPMCON = 0x1111;
GPMDAT = 0xC;
while(1)
{
for(i = 0; i < 4;i++)
{
GPMDAT = ~(1<<i);
delay();
}
}
return 0;
}
Makefile
led.bin: start.o led.o
arm-linux-ld -Ttext 0 -o led.elf start.o led.o
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led.dis
start.o : start.S
arm-linux-gcc -o start.o start.S -c -O2
led.o : led.c
arm-linux-gcc -o led.o led.c -c -O2
clean:
rm *.o led.elf led.bin led.dis
对GPIO的操作为了不影响其他位的状态,一般采用位操作。
如图所示对gpmcon和gpmdat的修改:
下载方法参见:OK6410烧写裸机程序到nandflash