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

举报
JeckXu666 发表于 2022/01/18 00:40:27 2022/01/18
【摘要】 ARM裸机开发:按键输入实验 一、硬件平台: 正点原子I.MX6U阿尔法开发板 二、原理图分析 按键输入是配置GPIO作为输入,检测按键引脚电平,采用扫描的方式读取按键按下的信息,IMX6UL...

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

  
 
  • 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 灯点亮,松开则熄灭

GIF

文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/qq_45396672/article/details/121089400

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。