ARM裸机开发:按键输入实验 您所在的位置:网站首页 linux按键驱动开发实验 ARM裸机开发:按键输入实验

ARM裸机开发:按键输入实验

2024-07-02 18:23| 来源: 网络整理| 查看: 265

ARM裸机开发:按键输入实验 一、硬件平台:

正点原子I.MX6U阿尔法开发板

_533488159_IMG_20210803_235508_1628006109000_xg_0

二、原理图分析

按键输入是配置GPIO作为输入,检测按键引脚电平,采用扫描的方式读取按键按下的信息,IMX6UL的按键引脚如下:

20211101202031

20211101202058

20211101202909

可以看到按键引脚接到 GPIO1_IO18 口,按键的原理就是默认接一个上拉电阻,按键按下接地,可以有效控制 IO 电平

三、配置代码

按键工程我们基于上一节工程进行开发,添加 BSP_KEY 工程文件

20211101212443

编写 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) { //设置复用模式为 GPIO IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0); //设置 GPIO 功能参数 IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080); //设置为输入引脚哦 GPIO1->GDIR &= ~(1 delay(10); //延时10ms用于稳定按键 if((GET_TTL() == 0) && key_up == 1) { key_value = 1; key_up = 0; } }else if(GET_TTL() == 1) { key_value = 0; key_up = 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)

make 编译后使用 imxdownload 下载程序到 SD 卡

四、实验现象

按键按下 LED 灯点亮,松开则熄灭

GIF



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有