s3c2440裸机编程之GPIO

做嵌入式还是要多了解底层,之前一直没有系统学习过,准备现在开始从底层到上层系统学习一遍。开发板就用s3c2440,该开发板网上资料也多,学习起来会相对容易。想自己理解更好,还是的有说出来的能力,这篇及以后的博客会是我的学习笔记,也是我"说出来"的地方。如有不对之处欢迎指正。

环境搭建

我是直接使用ubuntu进行开发,所需硬件买开发板时都附带了,软件也是,在此不做赘述.

gpio程序

led+key

  • 1.功能:
    按下按键点亮对应led.
  • 2.原理:
    s3c2440上有三个中断按键s2,s3和s4分别接在EINT0,EINT2和EINT11三个引脚,同时这三个引脚也是gpio引脚(分别和GPF0,GPF2和GPG3共用)。同时也有三个led分别接在三个gpio GPF4,GPF5和GPF6上。因而这些设备引脚状态可被获取也可被设置,因此在获取到某以按键引脚状态发生变化时将对应led引脚(随便指定)设为高/低状态从而达到亮/灭灯的效果。
  • 3.代码:
    1>.crt0.S
    该部分代码主要做一些上电初始化工作,如关看门狗等.
.text
.global _start
_start:
            ldr     r0, =0x53000000     @看门狗地址
            mov     r1, #0x0                     
            str     r1, [r0]            @关闭看门狗
            
            ldr     sp, =1024*4         @跳过前4k代码
            bl      main                @执行main()
halt_loop: @接收返回
            b       halt_loop

2>.led_key.c
该部分为功能实现逻辑,主要为寄存器配置.需要注意的是将按键引脚设置为输入,led引脚设置为输出.

#define GPFCON      (*(volatile unsigned long *)0x56000050)
#define GPFDAT      (*(volatile unsigned long *)0x56000054)
#define GPGCON      (*(volatile unsigned long *)0x56000060)
#define GPGDAT      (*(volatile unsigned long *)0x56000064)

#define GPF4OUT  (1<<8)
#define GPF5OUT  (1<<10)
#define GPF6OUT  (1<<12)

#define GPF4MASK  (3<<8) //用作清除当前寄存器状态(置为Reserved状态)
#define GPF5MASK  (3<<10)
#define GPF6MASK  (3<<12)

#define GPF0IN  (0<<1)
#define GPF2IN  (0<<4)
#define GPG3IN  (0<<6)

#define GPF0MASK  (3<<1)
#define GPF2MASK  (3<<4)
#define GPG3MASK  (3<<6)

int main()
{
	/**按键引脚设置为输入,led引脚设置为输出**/
	unsigned long dwDat;
	GPFCON &= ~(GPF4MASK | GPF5MASK | GPF6MASK); //将寄存器对应位清0
	GPFCON |= (GPF4OUT | GPF5OUT | GPF6OUT); //将寄存器设置为输出
	GPFCON &= ~(GPF0MASK | GPF2MASK); //S2,S3按键输入脚
	GPFCON |= (GPF0IN | GPF2IN); //S4按键输入脚
	GPGCON &= ~(GPG3MASK); //gpg寄存器设置,S4按键输入脚
	GPGCON |= GPG3IN;

	while(1) //轮询是否有按键按下
	{
		dwDat = GPFDAT; //获取gpf寄存器管脚状态
		if(dwDat & (1<<0)) //GPF0脚为高电平,即按键未按下
			GPFDAT |= 1<<4; //熄灯
		else
			GPFDAT &= ~(1<<4); //开灯
		if(dwDat & (1<<2))
			GPFDAT |= 1<<5;
		else
			GPFDAT &= ~(1<<5);

		dwDat = GPGDAT;
		if (dwDat & (1<<3))
			GPFDAT |= (1<<6);
        else    
            GPFDAT &= ~(1<<6);
	}

	return 0;
}
发布了4 篇原创文章 · 获赞 2 · 访问量 198

猜你喜欢

转载自blog.csdn.net/user_jiang/article/details/100066280