实验目的:用C语言在 jz2440上实现按键控制led灯的亮和灭
实验原理:
nLED_1,nLED_2,nLED_4,其对用的引脚是GPF5,GPF6,GPF7,在GPIO中,每个引脚对有配置寄存器和数据寄存器,对于本例其配置寄存器为GPFCON:0x56000050,和数据寄存器GPFDATA:0x56000054。
EINT0,EINT2,EINT11,其按键对应的引脚是GPF0、GPF2,GPG3,因此需要控制的寄存器有GPFCON、GPFDAT、GPGCON(0x56000060)和GPGDAT(0x56000064).用引脚GPF0、GPF2,GPG3作为输入引脚,来检测按键是否被按下。GPF5,GPF6,GPF7(即GPGDAT的4、5、6 bit)作为输出引脚,来对LED的电平置高或或置低来控制LED的亮灭。
实验步骤:
在linux下编辑源程序,其中源程序包括启动文件:完成关门狗和初始化栈的初始化,然后利用自己编写的Makefile来对源程序的编译和链接生成bin文件,最后通过文件传输到window下,利用板子里nor flash中的u-boot烧写到nand-
flash。再利用window下的dnw下载到板子里面.最后重启板子,对板子设为nand flash启动,运行程序,观察效果。
工具:
实验工具:远程登录开发板jz2440工具:SecureCRT 5.2、 实现linux和window文件共享工具SSH Secure File Trsanfer Client
编译工具:linux下的交叉编译链(即编写一个makefile文件来对文件进行编译连接)
启动文件crt0.S:
.text .global _start _start: ldr R1, =0x53000000 mov R0,#0x0 str R0, [R1] ldr SP,=1024*4 bl main halt_loop: b halt_loop
#include<stdio.h> #define GPFCON (*(volatile unsigned long*)0x56000050) #define GPFDAT (*(volatile unsigned long*)0x56000054) #define GPGCON (*(volatile unsigned long*)0x56000060) #define GPGDAT (*(volatile unsigned long*)0x56000064) //EINT0,EINT2,EINT11分别对应 GPF0,GPF2,GPG3 #define GPF0_in (0<<(0*2)) #define GPF2_in (0<<(2*2)) #define GPG3_in (0<<(3*2)) #define GPF0_mask (3<<(0*2)) #define GPF2_mask (3<<(2*2)) #define GPG3_mask (3<<(3*2)) //nLED_1,nLED_2,nLed_4分别对应GPF4,GPF5,GPF6 #define GPF4_out (1<<(4*2)) #define GPF5_out (1<<(5*2)) #define GPF6_out (1<<(6*2)) #define GPF4_mask (3<<(4*2)) #define GPF5_mask (3<<(5*2)) #define GPF6_mask (3<<(6*2)) int main() { unsigned long data=0; //先清零后置位 //“与”是清零,“或”是置1 GPFCON &= ~(GPF0_mask|GPF2_mask); GPFCON |=(GPF0_in|GPF2_in); GPGCON &= ~GPG3_mask; GPGCON |=GPG3_in; GPFCON &= ~(GPF4_mask|GPF5_mask|GPF6_mask); GPFCON |=(GPF4_out|GPF5_out|GPF6_out); while(1) { data=GPFDAT; if(data &(1<<0)) GPFDAT |=(1<<4); else GPFDAT &= ~(1<<4);//注意这是。不应该是 GPFDAT &= (0<<4); if(data &(1<<2)) GPFDAT |=(1<<5); else GPFDAT &=~(1<<5);//要想让寄存器的某一位清零最好这样做。 data=GPGDAT; if(data &(1<<3)) GPFDAT |=(1<<6); else GPFDAT &=~(1<<6); } return 0; }
led_key.bin:crt0.S led_key.c arm-linux-gcc -g -c $(CFLAGS) -o led_key.o led_key.c arm-linux-gcc -g -c $(CFLAGS) -o crt0.o crt0.S arm-linux-ld -Ttext 0x00000000 -g crt0.o led_key.o -o led_key_elf arm-linux-objcopy -O binary -S led_key_elf led_key.bin arm-linux-objdump -D -m arm led_key_elf >led_key.dis .PHONY:clean clean: rm -f *.bin led_key_elf *.o led_key.dis
jz2440裸板开发之GPIO:用按键控制led,布布扣,bubuko.com
原文:http://blog.csdn.net/chun_1959/article/details/23860991