试过了GPIO的输出功能,再来测试下GPIO的输入功能。开发板上有四个用户按键,使用这四个按键来控制四个LED的状态,发现使用位操作真的是非常方便。
- 开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平台:Ubuntu 14.04
1. 在原理图上找到按键对应的GPIO
在上一篇中,通过原理图已经知道了用户LED1-4,对应了GPM4_0-GPM4_3,再来看下KEY1-4对应的管脚。
用户按键KEY1、KEY2、KEY3、KEY4分别对应了GPX3_2、GPX3_3、GPX3_4、GPX3_5,并且按键引脚平常是高电平,按键被按下变为低电平。
2. 芯片手册查找GPIO相关寄存器
控制寄存器GPX3CON:
数据寄存器GPX3DAT:
配置GPX3所对应的位为0,即为输入模式。
3. 编写程序
#define GPIOBASE 0x11000000
#define GPM4CON (*(volatile unsigned long *)(GPIOBASE + 0x02E0))
#define GPM4DAT (*(volatile unsigned long *)(GPIOBASE + 0x02E4))
#define GPX3CON (*(volatile unsigned long *)(GPIOBASE + 0x0C60))
#define GPX3DAT (*(volatile unsigned long *)(GPIOBASE + 0x0C64))
int key(void)
{
unsigned long value;
/*设置LED1-4对应GPIO为输出模式*/
GPM4CON &= ~((0xF<<0) | (0xF<<4) | (0xF<<8) | (0xF<<12));
GPM4CON |= ((1<<0) | (1<<4) | (1<<8) | (1<<12));
/*设置KEY1-4对应GPIO为输入模式*/
GPX3CON &= ~((0xF<<8) | (0xF<<12) | (0xF<<16) | (0xF<<20));
while(1)
{
value = GPX3DAT; //读取GPX3电平状态
if(value & (1<<2)) //Key1 --> GPX3_2
{
GPM4DAT |= (1<<0); //LED1 --> GPM4_0
}else{
GPM4DAT &= ~(1<<0);
}
if(value & (1<<3)) //Key2 --> GPX3_3
{
GPM4DAT |= (1<<1); //LED2 --> GPM4_1
}else{
GPM4DAT &= ~(1<<1);
}
if(value & (1<<4)) //Key3 --> GPX3_4
{
GPM4DAT |= (1<<2); //LED3 --> GPM4_2
}else{
GPM4DAT &= ~(1<<2);
}
if(value & (1<<5)) //Key4 --> GPX3_5
{
GPM4DAT |= (1<<3); //LED4 --> GPM4_3
}else{
GPM4DAT &= ~(1<<3);
}
}
return 0;
}
Makefile代码如下:
default:
arm-linux-gcc -c key.c -o key.o
arm-linux-ld -Ttext=0x70003000 key.o -o key
arm-linux-objcopy -O binary key key.bin
clean:
rm -f key.o key key.bin *~
执行make clean,然后make,生成key.bin二进制文件。
4. 上传程序到开发板
- 在串口中执行:
dnw 70003000
等待dnw下载。
- 在ubuntu下文件目录下执行:
dnw key.bin
- 文件通过dnw下载到开发板内存地址0x70003000,执行:
go 70003000
程序运行。