实验目的:用C语言在 jz2440上实现流水灯
实验原理:
在这里点亮一个nLED_1,nLED_2,nLED_4,其对用的引脚是GPF5,GPF6,GPF7,在GPIO中,每个引脚对有配置寄存器和数据寄存器,对于本例其配置寄存器为GPFCON:0x56000050,和数据寄存器GPFDATA:0x56000054,【7,6】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0x56000050]=0x00000100). [0x56000054]=0x00000000 ,【9,8】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0x56000050]=0x00000400). [0x56000054]=0x00000000 ,【11,10】=01时为输出)为输出引脚,并根据电路原理图,可知是设为低电平,才能点亮LED1所以[0x56000050]=0x00001000). [0x56000054]=0x00000000 ,这样依次点亮他们。
实验步骤:
在linux下编辑源程序,其中源程序包括启动文件:完成关门狗和初始化栈的初始化,然后利用自己编写的Makefile来对源程序的编译和链接生成bin文件,最后通过文件传输到window下,利用板子里nor flash中的u-boot烧写 到 nandflash。再利用window下的dnw下载到板子里面.最后重启板子,对板子设为nand flash启动,运行程序,观察效果。
实验工具:远程登录开发板jz2440工具:SecureCRT 5.2、 实现linux和window文件共享工具SSH Secure File Trsanfer Client
编译工具:linux下的交叉编译链(即编写一个makefile文件来对文件进行编译连接)
注意:这里必须要进行对栈的初始化。在反汇编的时候可以看到,在完成初始化的时候,一些寄存器的值要保存到栈里面,等main函数返回时,要恢复寄存器的值。这里由于程序很短,用不到4K,所以在SRAM中(俗称垫脚石,由硬件将nandflash的前4K存储到里面)的前面部分用来存储该裸板程序,其余的是空余的,在这里直接把栈的指针指向1024*4即4K的末尾,进行存储寄存器的值。
实验代码:启动代码crt.S 和流水灯实验代码len_on_c.c
启动代买crt.S:
.text .global _start _start: ldr R0, =0x53000000 mov R1,#0x0 str R1,[R0] ldr sp, =1024*4 bl main halt_loop: b halt_loop
流水灯led_on_c.c:
#define GPFCON (*(volatile unsigned long*)0x56000050) #define GPFDAT (*(volatile unsigned long*)0x56000054) void delay(int n) { int i,j; for(i=0;i<n;++i) for(j=0;j<50;j++) ; } int main() { int i=0; while(1) { GPFCON=0x00000100; for(i=0;i<3;i++) { delay(1000); GPFCON=GPFCON<<2; GPFDAT=0x00000000; } } return 0; }
MAKefile文件:
led_on_c.bin: crt.S led_on_c.c arm-linux-gcc -g -c -o led_on_c.o led_on_c.c arm-linux-gcc -g -c -o crt.o crt.S arm-linux-ld -Ttext 0x00000000 -g crt.o led_on_c.o -o led_on_c_elf arm-linux-objcopy -O binary -S led_on_c_elf led_on_c.bin arm-linux-objdump -D -m arm led_on_c_elf > led_on_c.dis .PHONY:clean clean: rm -f *.bin *.o led_on_c_elf led_on_c.dis
备注:下面看看又反汇编得到的led_on_c.dis文件,看看栈初始化的目的
00000000 <_start>:
0: e3a00453 mov r0, #1392508928 ; 0x53000000
4: e3a01000 mov r1, #0 ; 0x0
8: e5801000 str r1, [r0]
c: e3a0da01 mov sp, #4096 ; 0x1000
10: eb00001a bl 80 <main>
70: baffffef blt 34 <delay+0x1c> 74: e28bd000 add sp, fp, #0 ; 0x0 78: e8bd0800 pop {fp} 7c: e12fff1e bx lr
00000018 <delay>: 18: e52db004 push {fp} ; (str fp, [sp, #-4]!) 1c: e28db000 add fp, sp, #0 ; 0x0 20: e24dd014 sub sp, sp, #20 ; 0x14
28: 6965772f stmdbvs r5!, {r0, r1, r2, r3, r5, r8, r9, sl, ip, sp, lr}^
44: 490b3b0b stmdbmi fp, {r0, r1, r3, r8, r9, fp, ip, sp}
jz2440裸板开发之GPIO:实现流水灯,布布扣,bubuko.com
原文:http://blog.csdn.net/chun_1959/article/details/23781735