一、芯片手册
1、板子原理图
2、GPIO使用
(1)GPxCON
(2)GPxDAT
二、实现分析
1、初始化led
设置GPBCON(0x56000010)为 0x00015400
2、设置led输出,根据原理图引脚输出低电平时灯被点亮
LED1_ON: 设置GPBDAT(0x56000014)为0x000001c0
LED2_ON: 设置GPBDAT(0x56000014)为0x000001a0
LED3_ON: 设置GPBDAT(0x56000014)为0x00000160
LED4_ON: 设置GPBDAT(0x56000014)为0x000000e0
三、实现
1、汇编程序实现流水灯(led.S)
(1)伪代码
1、led初始化LED_init
2、关闭看门狗close watchdog
3、程序主体
main()
{for(int i=1;i<=4;i++){delay(); //延时switch(i){case 1: LED1_ON;case 2: LED1_ON;case 3: LED1_ON;case 4: LED1_ON;}}
}
(2)汇编源码
.text
.global _start
_start:@led初始化ldr r0, =0x56000010 ldr r1, =0x00015400str r1, [r0]
@关闭所有ledldr r0, =0x56000014ldr r1, =0x000001e0str r1, [r0]@关闭看门狗ldr r0, =0x53000000mov r1, #0x0str r1, [r0]LED_MAIN:mov r2, #0x00000004 LED_LOOP:@使用循环nop实现延时ldr r3, =0x0000008f
DELAY1_LOOP:ldr r4, =0x000000ff
DELAY2_LOOP:nopnopnopnopnopnopnopnopsub r4, r4, #0x00000001cmp r4, #0x00000000bne DELAY2_LOOPsub r3, r3, #0x00000001cmp r3, #0x00000000bne DELAY1_LOOP@LED1的点亮 cmp r2, #0x00000001bleq LED1_ONcmp r2, #0x00000000beq LED_MAIN
@LED2的点亮 cmp r2, #0x00000002bleq LED2_ONcmp r2, #0x00000001beq LED_LOOP
@LED3的点亮 cmp r2, #0x00000003bleq LED3_ONcmp r2, #0x00000002beq LED_LOOP
@LED4的点亮 cmp r2, #0x00000004bleq LED4_ONcmp r2, #0x00000003beq LED_LOOPLED4_ON:ldr r0, =0x56000014ldr r1, =0x000000e0str r1, [r0]sub r2, r2, #0x00000001mov pc, lrLED3_ON:ldr r0, =0x56000014ldr r1, =0x00000160str r1, [r0]sub r2, r2, #0x00000001mov pc, lrLED2_ON:ldr r0, =0x56000014ldr r1, =0x000001a0str r1, [r0]sub r2, r2, #0x00000001mov pc, lrLED1_ON:ldr r0, =0x56000014ldr r1, =0x000001c0str r1, [r0]sub r2, r2, #0x00000001mov pc, lr
(3)Makefile文件
led.bin:led.Sarm-linux-gcc led.S -g -c -o led.oarm-linux-ld -Ttext 0x00000000 -g led.o -o led_elfarm-linux-objcopy -O binary -S led_elf led.bincp led.bin /home/tftp/
clean:rm *.o led_elf led.bin
1、c语言程序实现流水灯(start.S led.c)
(1)伪代码
1、关闭看门狗
2、设置堆栈ldr sp, =1024*4 //使用片内SRAM(仅4K),不需要初始化外置内存(SDRAM)
3、跳转main函数
(2)启动实现(start.S)
.text
.global _start
_start:ldr r0, =0x53000000 @ WATCHDOG寄存器地址mov r1, #0x0 str r1, [r0] @ 写入0,禁止WATCHDOG,否则CPU会不断重启ldr sp, =1024*4 @ 设置堆栈,注意:不能大于4k, 因为现在可用的内存只有4K@ nand flash中的代码在复位后会移到内部ram中,此ram只有4Kbl main @ 调用C程序中的main函数
(3)c语言led设置(led.c)
#define GPBCON (*(volatile unsigned long *)0x56000010)
#define GPBDAT (*(volatile unsigned long *)0x56000014)void delay()
{int i;for(i=0;i<0x4f;i++){int j;for(j=0;j<0xff;j++);}
}int main()
{ GPBCON = 0x00015400; while(1){int i;for(i=0;i<4;i++){delay();switch(i){case 0:GPBDAT = 0x000001c0;break;case 1:GPBDAT = 0x000001a0;break;case 2:GPBDAT = 0x00000160;break;case 3:GPBDAT = 0x000000e0;break;}}} return 0;
}
(4)Makefile实现
led_on_c.bin : start.S led.carm-linux-gcc -g -c -o start.o start.Sarm-linux-gcc -g -c -o led.o led.carm-linux-ld -Ttext 0x0000000 -g start.o led.o -o led_elfarm-linux-objcopy -O binary -S led_elf led.bincp led.bin /home/tftp/
clean:rm -f led.bin led_elf *.o