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

发布时间:2024-08-26  

一、硬件平台:

正点原子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<<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;

}

主体代码编写完成后,下一步就是编写 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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    监视器进入休眠状态怎么办 监视器的屏幕刷新频率怎么设置;  监视器进入休眠状态怎么办   如果您的监视器进入了休眠状态(常见于长时间无操作时),您可以尝试以下方法解决问题:   1. 检查连接:确保......
    ,仪器内部将信号全部设置好,稳定的显示在屏幕上。不会设置示波器的,就可以一键“Autoset”。 那如果不“Autoset”怎么设置呢。先看一下这个按键“Defaultsetup”,恢复默认按键......
    在频率上对系数进行求和以获得“能量”(energy)。之后定义一个能量阈值,当能量超过这个阈值时,标记这里是一个按键音。 通过这个方法,可以从长音频中分割出独立的按键音段。 △按键分割过程,信号通过FFT......
    怎么实现语音识别_手机语音识别怎么设置;  怎么实现语音识别   很多时候我们都需要将一些语音文件转换为文字的形式进行使用,那么这时我们就需要对语音文件进行识别了。那么......
    间的组合键。 2. 程序设计 2.1 定义 2.2 初始化函数KeyInit 初始化与按键相连的GPIO,设置为带下拉的输入模式。代码实现如图2。 图2 KeyInit函数  2.3 设置按键......
    ; if(upkey==0)//“+”键 { buzz=0;//打开蜂鸣器(发出按键音) for(i=0;i《5;i++)display();//延时消抖 buzz=1;//关闭蜂鸣器 if(heatpower《9......
    ,GPF6的控制位信息,如图: 我们发现,当GPFCON寄存器的GPF4,GPF5,GPF6的控制位设置为01时,表示控制输出,这正是我们想要的。在看看它们的数据位是怎么设置的,如图: 由表格可知,当端......
    指示灯亮。整点会有蜂鸣器报时,多少点就响多少次。 按下设置按键分别设置时钟,分钟和秒钟,设置模式下对应设置的变量会闪烁,方便用户设置设置到秒钟再按下设置按键退出设置模式。通过按键加和减调整设置......
    月份,操作同年份调整。再按下设置按键分别设置日期,时钟,分钟和星期。设置到星期再按下设置按键退出设置模式。如果没有设置到星期需要退出设置模式,按下设置完成按键即可。 以上......
    之后就是普通模式,小灯会亮但是不能进行亮度调节,按下设置按键后亮度可调节的小灯亮,通过加减按键就能直接控制小灯的亮度。   二.仿真概述 1.系统上电台灯打开,此时......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>