jz2440裸板开发之GPIO:用按键控制led

实验目的用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,  按键控制led的源程序led_key.c  和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

按键控制led的源程序led_key.c :

#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;
}





Makefile:

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就算学完了。接下来的内容敬请期待。。。。。 微笑




  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值