ARM裸机开发:按键输入实验
【摘要】
ARM裸机开发:按键输入实验
一、硬件平台:
正点原子I.MX6U阿尔法开发板
二、原理图分析
按键输入是配置GPIO作为输入,检测按键引脚电平,采用扫描的方式读取按键按下的信息,IMX6UL...
ARM裸机开发:按键输入实验
一、硬件平台:
正点原子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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
编写 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<<18);
}
//按键逻辑
unsigned char GET_KEY(void)
{
unsigned char key_value=0,key_up=1;
if((GET_TTL() == 0) && key_up == 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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
主体代码编写完成后,下一步就是编写 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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
make 编译后使用 imxdownload 下载程序到 SD 卡
四、实验现象
按键按下 LED 灯点亮,松开则熄灭
文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_45396672/article/details/121089400
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)