tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作

GPIO:General Purpose Input/Output (GPIO) Control

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第1张图片

具体查阅exynos4412手册第六章或google GPIO

本章介绍操作GPIO相关寄存器实现按键控制led灯亮灭或蜂鸣器buzzer。

按键keys在母板上 与XEINT_n相连接

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第2张图片

查找EXINT 在核心板上

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第3张图片

与GPX3_2(3/4/5)重用

查找手册上:需要控制的寄存器

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第4张图片

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第5张图片

led灯在核心板上:

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第6张图片

手册上查找GPM4:

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第7张图片


tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第8张图片


实现原理

将按键和led对应的寄存器设定为input/output,程序检测到按键输入,则向led输出

实现代码如下

//keysleds.c      wycinxaut原创并测试通过
//实现4个按键控制4个led亮灭

#define GPX3CON (*(volatile unsigned long*)0x11000c60)
#define GPX3DAT (*(volatile unsigned long*)0x11000c64)
#define GPM4CON (*(volatile unsigned long*)0x110002e0)
#define GPM4DAT (*(volatile unsigned long*)0x110002e4)

//GPX3CON[2,3,4,5] -----k1 k2 k3 k4


void (*printf)(char*, ...) = 0x43e11434;


void main(void)
{
    printf("printf ok!\n");
    init_led();
    GPX3CON &= ~(0xffff << 8);
    while(1)
    {
        if((GPX3DAT & (1 << 2))==0)
        {
            delay();
            if((GPX3DAT & (1 << 2))!=0)
            led_on_off(1);
        }
        if((GPX3DAT & (1 << 3))==0)
        {
            delay();
            if((GPX3DAT & (1 << 3))!=0)
            led_on_off(2);
        }
        if((GPX3DAT & (1 << 4))==0)
        {
            delay();
            if((GPX3DAT & (1 << 4))!=0)
            led_on_off(3);
        }
        if((GPX3DAT & (1 << 5))==0)
        {
            delay();
            if((GPX3DAT & (1 << 5))!=0)
            led_on_off(4);
        }

    }
}

void delay(void)
{
    int i=0;
    for(i=0; i<600000;i++);
}

void init_led(void)
{
    GPM4CON &= ~0xffff;
    GPM4CON |= 0x1111;
    GPM4DAT |= 0xf;
}

void led_on_off(int i)
{
    switch(i)
    {
        case 1: GPM4DAT ^= (1 << 0); printf("led1\n"); break;
        case 2: GPM4DAT ^= (1 << 1); printf("led2\n"); break;
        case 3: GPM4DAT ^= (1 << 2); printf("led3\n"); break;
        case 4: GPM4DAT ^= (1 << 3); printf("led4\n"); break;
        default: break;
    }
}


编译及运行(注:$EXE为要编译c文件的文件名)

arm-linux-gcc -c $EXE.c -o $EXE.o //交叉编译
arm-linux-ld -Ttext=0x50008000 $EXE.o -o $EXE //链接到0x50008000这个内存地址
arm-linux-objcopy -O binary $EXE $EXE.bin //去头,只保留二进制指令

运行:

1.kermit连接开发板,进入uboot,dnw 50008000

2.另开终端 dnw $EXE.bin

3.kermit端:go 50008000  运行程序

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第9张图片


 
  

测试结果

tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作_第10张图片

另注:buzzzer蜂鸣器也可以设置gpio control不再赘述

wycinxaut原创,转载请注明-------by richard wong  2015-03-06 


你可能感兴趣的:(tiny4412-arm嵌入式开发裸板驱动 (二):arm基础GPIO操作)