ARM裸機開發 按鍵輸入實驗

2022-09-13 08:33:07 字數 3401 閱讀 1534

正點原子i.mx6u阿爾法開發板

按鍵輸入是配置gpio作為輸入,檢測按鍵引腳電平,採用掃瞄的方式讀取按鍵按下的資訊,imx6ul的按鍵引腳如下:

可以看到按鍵引腳接到 gpio1_io18 口,按鍵的原理就是預設接乙個上拉電阻,按鍵按下接地,可以有效控制 io 電平

按鍵工程我們基於上一節工程進行開發,新增 bsp_key 工程檔案

編寫 bsp_key.h 檔案

#

ifndef

__bsp_key_h

#define

__bsp_key_h

#include

"fsl_iomuxc.h"

#include

"mcimx6y2.h"

#include

"bsp_delay.h"

void

bsp_key_init

(void);

unsigned

char

get_key

(void);

#endif

編寫 bsp_key.c 檔案

#

include

"bsp_key.h"

//獲取 gpio1 io18的引腳電平

#define

get_ttl()

((gpio1->dr >>18)

&0x01

)//初始化 gpio1 io18 引腳

void

bsp_key_init

(void

)//按鍵邏輯

unsigned

char

get_key

(void)}

elseif(

get_ttl()

==1)return key_value;

}

主體**編寫完成後,下一步就是編寫 makefile 檔案,主要就是新增編譯檔案路徑

# 賦值變數,與編譯器相關

cross_compile ?= arm-linux-gnueabihf-

# 賦值變數,目標檔名稱

target ?= bsp_key

# 賦值變數,與編譯器相關

cc := $(cross_compile)gcc

ld := $(cross_compile)ld

objcopy := $(cross_compile)objcopy

objdump := $(cross_compile)objdump

#標頭檔案包含路徑 '\'為換行符號

incdirs := imx6ul \

project \

bsp/bsp_clk \

bsp/bsp_led \

bsp/bsp_delay \

bsp/bsp_beep\

bsp/bsp_key

#原始檔包含的路徑

srcdirs := project \

bsp/bsp_clk \

bsp/bsp_led \

bsp/bsp_delay \

bsp/bsp_beep\

bsp/bsp_key

# 通過函式 patsubst 給變數 incdirs 開頭新增乙個 "-i"

# 因為 makefile 語法要求指明頭檔案目錄的時候需要加上 "-i"

include := $(patsubst %, -i %, $(incdirs))

# 獲得.s和.c結尾檔名變數路徑

# 使用 foreach 函式,依次取出 src 到 dir,再執行後面的指令

sfiles := $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.s))

cfiles := $(foreach dir, $(srcdirs), $(wildcard $(dir)/*.c))

# notdir 函式去掉路徑,獲得檔名稱

sfilendir := $(notdir $(sfiles))

cfilendir := $(notdir $(cfiles))

# 變數 sobjs 和 cobjs 是.s 和.c 檔案編譯以後對應的 .o 檔案目錄,這裡新增到 obj 目錄下

sobjs := $(patsubst %, obj/%, $(sfilendir:.s=.o))

cobjs := $(patsubst %, obj/%, $(cfilendir:.c=.o))

# 所有 obj目錄下.o檔案變數集合

objs := $(sobjs) $(cobjs)

vpath := $(srcdirs)

.phony: clean

#鏈結,o檔案,轉elf為二進位制檔案,同時生成反彙編檔案

$(target).bin : $(objs)

$(ld) -timx6ul.lds -o $(target).elf $^

$(objcopy) -o binary -s $(target).elf $@

$(objdump) -d -m arm $(target).elf > $(target).dis

#編譯.s檔案

$(sobjs) : obj/%.o : %.s

$(cc) -wall -nostdlib -c -o2 $(include) -o $@ $<

#編譯.c檔案

$(cobjs) : obj/%.o : %.c

$(cc) -wall -nostdlib -c -o2 $(include) -o $@ $<

#清除生成檔案

clean:

rm -rf $(target).elf $(target).dis $(target).bin $(cobjs) $(sobjs)

按鍵按下 led 燈點亮,鬆開則熄滅

ARM 裸機 02 ARM裸機開發流程

執行在不同平台上的程式,開發過程不盡相同。為了更好地理解 arm 裸機的開發流程,我們先和比較熟悉的 windows linux 應用程式開發對比。不同平台程式開發流程對比示意 編譯嵌入式程式的平台稱為宿主機,譬如執行 ubuntu 系統的 pc。執行嵌入式程式的平台稱為目標機,譬如 arm 開發板...

按鍵輸入實驗

1.硬體接法 4個按鍵 wk up 控制蜂鳴器,key0 同時控制ds0和ds1 key1 控制ds1 key2控制ds0,wk up 外部上拉,晶元內部需要設定為下拉輸入 key0 key2 外部下拉,晶元內部需要設定為上拉輸入。2.標頭檔案編寫 本次實驗涉及到led 蜂鳴器 按鍵,其中led和蜂...

ARM裸機開發快速體驗

一。linux平台 自己寫makefile 自己寫lds指令碼 自己搭建除錯環境 二。裸機開發流程 1 編寫裸機程式 2 除錯裸機程式 3 編譯 鏈結 格式轉換成二進位制映像 1.安裝交叉工具鏈 把課程裡面的工具包拷貝到linux,解壓arm linux gcc到根目錄 c 交叉工具在usr loc...