实验目的:用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	lr00000018 <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