实验目的:用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
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
70: baffffef blt 34
74: e28bd000 add sp, fp, #0 ; 0x0
78: e8bd0800 pop {fp}
7c: e12fff1e bx lr
00000018 :
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}