jz2440裸板开发之GPIO:实现流水灯



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







  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值