arm c语言按键程序,【ARM】Tiny4412裸板编程之按键(C语言)

00. 目录

文章目录

00. 目录

01. 开发环境

02. 控制原理

03. 配置寄存器

04. 程序示例一

05. 程序示例二

06. 附录

01. 开发环境

开发板:Tiny4412SDK标准版 「Tiny4412 SDK 1506」

工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」

平台:Ubuntu 20.04

02. 控制原理

试过了GPIO的输出功能,再来测试下GPIO的输入功能。开发板上有四个用户按键,使用这四个按键来控制四个LED的状态。

咱们的按键在底板上,所以需要看底板的原理图

d4c0a434b1b64db288e9abf2e35833b2.jpg

打开底板原理图(Tiny4412SDK-1506-Schematic.pdf)

b61cbdd965a04230b28d6ab0d53fd8b9.jpg

用户按键KEY1、KEY2、KEY3、KEY4分别对应了GPX3_2、GPX3_3、GPX3_4、GPX3_5,并且按键引脚平常是高电平,按键被按下变为低电平。

03. 配置寄存器

由原理图可知,程序只进行了两步操作。

第一步:GPX3CON功能配置寄存器,地址为0x11000000+0x00000C60=0x11000C60,每四位控制一个引脚,0输入,1输出等等,这里我们用到的是输入功能。

Base Address: 0x1100_0000

Address = Base Address + 0x0C60, Reset Value = 0x0000_0000

b6c91f9aaebb4fc99e3b5bea435e636d.jpg

第二步:GPX3DAT数据寄存器,读取对应的位即可。

2b2c56297693456d9050747a95efa0dc.jpg

04. 程序示例一

Key控制对应的LED

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

//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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值