【ARM】Tiny4412裸板编程之按键(C语言)
00. 目錄
文章目錄
- 00. 目錄
- 01. 開(kāi)發(fā)環(huán)境
- 02. 控制原理
- 03. 配置寄存器
- 04. 程序示例一
- 05. 程序示例二
- 06. 附錄
01. 開(kāi)發(fā)環(huán)境
- 開(kāi)發(fā)板:Tiny4412SDK標(biāo)準(zhǔn)版 「Tiny4412 SDK 1506」
- 工具:「arm-linux-gcc-4.5.1」 「minicom」 「dnw」
- 平臺(tái):Ubuntu 20.04
02. 控制原理
試過(guò)了GPIO的輸出功能,再來(lái)測(cè)試下GPIO的輸入功能。開(kāi)發(fā)板上有四個(gè)用戶按鍵,使用這四個(gè)按鍵來(lái)控制四個(gè)LED的狀態(tài)。
咱們的按鍵在底板上,所以需要看底板的原理圖
打開(kāi)底板原理圖(Tiny4412SDK-1506-Schematic.pdf)
用戶按鍵KEY1、KEY2、KEY3、KEY4分別對(duì)應(yīng)了GPX3_2、GPX3_3、GPX3_4、GPX3_5,并且按鍵引腳平常是高電平,按鍵被按下變?yōu)榈碗娖健?/p>
03. 配置寄存器
由原理圖可知,程序只進(jìn)行了兩步操作。
第一步:GPX3CON功能配置寄存器,地址為0x11000000+0x00000C60=0x11000C60,每四位控制一個(gè)引腳,0輸入,1輸出等等,這里我們用到的是輸入功能。
-
Base Address: 0x1100_0000
-
Address = Base Address + 0x0C60, Reset Value = 0x0000_0000
第二步:GPX3DAT數(shù)據(jù)寄存器,讀取對(duì)應(yīng)的位即可。
04. 程序示例一
Key控制對(duì)應(yīng)的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 開(kāi) int bell_on(void); //Buzzer 關(guān) 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.oall: $(OBJS)$(LD) $(LD_FLAGS) $(OBJS) -o $(TARGET)$(OBJCOPY) $(COPY_FLAGS) $(TARGET) $(TARGET).bin$(OBJDUMP) $(DUMP_FLAGS) $(TARGET) > $(TARGET).disrm -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控制蜂鳴器開(kāi),key2控制蜂鳴器關(guān)
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
總結(jié)
以上是生活随笔為你收集整理的【ARM】Tiny4412裸板编程之按键(C语言)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【ARM】Tiny4412裸板编程之蜂鸣
- 下一篇: 【ARM】Tiny4412裸板编程之 p