【ARM】Tiny4412裸板編程之按鍵(C語言)

00. 目錄

01. 開發環境

  • 開發板:Tiny4412SDK標準版 「Tiny4412 SDK 1506」
  • 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
  • 平臺:Ubuntu 20.04

02. 控制原理

試過了GPIO的輸出功能,再來測試下GPIO的輸入功能。開發板上有四個用戶按鍵,使用這四個按鍵來控制四個LED的狀態。linux

我們的按鍵在底板上,因此須要看底板的原理圖
在這裏插入圖片描述web

打開底板原理圖(Tiny4412SDK-1506-Schematic.pdf)
在這裏插入圖片描述svg

用戶按鍵KEY一、KEY二、KEY三、KEY4分別對應了GPX3_二、GPX3_三、GPX3_四、GPX3_5,而且按鍵引腳日常是高電平,按鍵被按下變爲低電平。工具

03. 配置寄存器

由原理圖可知,程序只進行了兩步操做。測試

第一步:GPX3CON功能配置寄存器,地址爲0x11000000+0x00000C60=0x11000C60,每四位控制一個引腳,0輸入,1輸出等等,這裏咱們用到的是輸入功能。spa

  • Base Address: 0x1100_0000code

  • Address = Base Address + 0x0C60, Reset Value = 0x0000_0000
    在這裏插入圖片描述orm

第二步:GPX3DAT數據寄存器,讀取對應的位便可。
在這裏插入圖片描述xml

04. 程序示例一

Key控制對應的LEDblog

gpio.h文件

#ifndef __GPIO_H__
#define __GPIO_H__

typedef volatile unsigned int U32;
typedef volatile unsigned short U16;
typedef volatile unsigned char U8;

//LED
#define GPM4CON *(U32*)0x110002e0
#define GPM4DAT *(U32*)0x110002e4

//Key
#define GPX3CON *(U32*)0x11000c60
#define GPX3DAT *(U32*)0x11000c64

//Buzzer
#define GPD0CON *(U32*)0x114000a0
#define GPD0DAT *(U32*)0x114000a4

//LED初始化
int led_init(void);
//LED 全亮
int led_allon(void);
//LED 全滅
int led_alloff(void);

//Buzzer初始化
int bell_init(void);
//Buzzer 開
int bell_on(void);
//Buzzer 關
int bell_off(void);

//Key初始化
int key_init(void);
//key value獲取
int key_get(void);

#endif/*__GPIO_H__*/

key.c文件

#include "gpio.h"

//Key初始化
int key_init(void)
{
    GPX3CON &= ~(0xffff << 8);

    return 0;
}

//key value獲取
int key_get(void)
{

    return (GPX3DAT >> 2) & 0xf;
}

led.c文件

#include <gpio.h>

//LED初始化
int led_init(void)
{
    GPM4CON &= ~0xffff;

    GPM4CON |= 0x1111;

    return 0;
}

//LED 全亮
int led_allon(void)
{
    GPM4DAT &= ~0xf;

    return 0;
}


//LED 全滅
int led_alloff(void)
{
    GPM4DAT |= 0xf;

    return 0;
}

//LED one 亮
int led_on(U32 i)
{
    GPM4DAT &= ~(1 << i);

    return 0;
}

//LED one 滅
int led_off(U32 i)
{
    GPM4DAT |= (1 << i);

    return 0;
}

int led_set(U32 val)
{
    GPM4DAT &= ~0xf;

    GPM4DAT |= val;

    return 0;
}

U32 led_get(void)
{
    return GPM4DAT & 0xf;
}

lib.c文件

int delay(unsigned int i)
{
    while(--i)
        ;
}

int delay1()
{
    unsigned int i = 0xfffff;
    while(--i)
        ;
}

test.c文件

#include "gpio.h"

int main(void)
{
    int val = 0;

    led_init();
    key_init();

    while(1)
    {
        val = key_get();

        led_set(val);

        delay1();
    }

    return 0;
}

Makefile文件

CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
CC_FLAGS = -c -I ./
LD = $(CROSS_COMPILE)ld
LD_FLAGS = -T start.lds -Ttext 0x40000000
OBJCOPY = $(CROSS_COMPILE)objcopy
COPY_FLAGS = -O binary
OBJDUMP=$(CROSS_COMPILE)objdump
DUMP_FLAGS=-D
TARGET=test
OBJS=start.o led.o lib.o test.o bell.o key.o

all: $(OBJS)
	$(LD) $(LD_FLAGS) $(OBJS) -o $(TARGET)
	$(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin
	$(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).dis
	rm -rf *.o

%.o:%.s
	$(CC) $(CC_FLAGS) $<
%.o:%.S
	$(CC) $(CC_FLAGS) $<
%.o:%.c
	$(CC) $(CC_FLAGS) $<

.PHONY:clean
clean:
	rm -rf *.o $(TARGET).bin $(TARGET).dis $(TARGET)

05. 程序示例二

led控制蜂鳴器 key1控制蜂鳴器開,key2控制蜂鳴器關

test.c文件

#include "gpio.h"

int (*print)(const char *format, ...) = (void*)0x43e11a2c;

int main(void)
{
    U32 val = 0;

    bell_init();

    key_init();

    while(1)
    {
        val = key_get();

        print("val = %p\n", val^0xf);

        if (0x1 == (val^0xf))
        {
            bell_on(); 
        }
        else if (0x2 == (val^0xf))
        {
            bell_off(); 
        }

        delay1();
    }

    return 0;
}

06. 附錄

Exynos 4412 SCP_Users Manual_Ver.0.10.00_Preliminary0.pdf