做嵌入式还是要多了解底层,之前一直没有系统学习过,准备现在开始从底层到上层系统学习一遍。开发板就用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;
}