【嵌入式Linux】18-裸机-按键输入实验

此笔记由个人整理

塞上苍鹰_fly

课程来自:正点原子_手把手教你学Linux

一、硬件原理图分析

  • 底板按键原理图
    • 按键默认为高电平
    • 按键按下为低电平
image-20201210191308898
  • 按键与芯片连接
image-20201210191647081
  • 与芯片的连接对应引脚

image-20201210192140614

  • 按键对应的引脚为UART1_CTS 复用为GPIO1__IO18
image-20201210192418390

二、实验程序编写

  • 创建bsp文件下的key按键驱动
  • 编写key.h函数
#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#include "fsl_common.h"
#include "fsl_iomuxc.h"
#include "MCIMX6Y2.h"
#include "cc.h"
/*  按键值*/
enum keyvalue{
    KEY_NONE = 0,
    KEY0_VALUE
};
/*  函数声明*/
void key_init(void);
int read_key(void);
int key_getvalue(void);

#endif // !__KEY_H
  • 按键电气属性–0xF080
image-20201210195148347
  • 编写key.c函数
#include "bsp_key.h"
#include "bsp_delay.h"

/*  初始化按键*/
void key_init(void)
{
    /*复用为GPIO1_IO18*/
    IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);

    /*设置电气属性*/
    IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);

    /*GPIO初始化*/
    GPIO1->GDIR &= ~(1<<18);  /*  设置为输入模式*/
}

/*  读取按键值
 *  返回值:0 按下,1 未按下
 */
int read_key(void)
{
    int ret = 0;
    ret = (GPIO1->DR) >> 18 & 0x1;
    return ret;
}

/*  判断按键按下是否有效*/
int key_getvalue(void)
{
    int ret = 0;
    static unsigned char release = 1;/*为1表示按键被释放*/

    if((release == 1) && (read_key() == 0)) /* 按键被按下*/
    {
        delay(10);
        release = 0;
        if(read_key() == 0) /*延时后按键还是低电平则按键有效*/
        {
            ret = KEY0_VALUE;
        }
    }
    else if(read_key())
    {
        ret = KEY_NONE;
        release = 1;
    }
    return ret;
}
  • 编写main.c函数
#include "bsp_led.h"
#include "bsp_clk.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_delay.h"
#include "main.h"
/*主函数*/
int main(void)
{
    int i = 0;
    int key_value = 0;
    unsigned char led_state = OFF;
    unsigned char beep_state = OFF;
    /*使能外设时钟*/
    clk_enable();
    /*初始化led*/
    led_init();
    /*初始化beep*/
    beep_init();
    /*按键初始化*/
    key_init();

    while(1)
    {   
        /*按键控制蜂鸣器*/
        key_value = key_getvalue();
        if(key_value)
        {
            switch (key_value)
            {
            case KEY0_VALUE:
                beep_state =! beep_state;
                beep_switch(beep_state);
                break;
            }
        }
		/*LED指示灯,500毫秒闪烁*/
        i++;
        if(i == 50)
        {
            i = 0;
            led_state =! led_state;
            led_switch(LED0,led_state);
        }
        delay(10);
    }
    return 0;
}
  • 修改.lds链接文件
    • 添加10行,进行“.”进行四字节对齐
SECTIONS{
    . = 0X87800000;
    .text :
    {
        obj/start.o
        *(.text)
    }
    .rodata ALIGN(4) : {*(.rodata)}
    .data ALIGN(4) : {*(.data)}
    . = ALIGN(4);
    __bss_start = . ;
    .bss ALIGN(4) : {*(.bss) *(COMMON)}
    __bss_end = . ;
}
  • 改写makefile
    • 2行修改工程名
    • 12行处添加头文件路径
    • 18行处添加源文件路径
CROSS_COMPILE 	?= arm-linux-gnueabihf-
TARGET		  	?= key

CC			  	:= $(CROSS_COMPILE)gcc
LD			  	:= $(CROSS_COMPILE)ld
OBJCOPY			:= $(CROSS_COMPILE)objcopy
OBJDUMP			:= $(CROSS_COMPILE)objdump

INCUDIRS		:=  imx6ul \
					bsp/clk \
					bsp/led \
					bsp/key	\
					bsp/beep\
					bsp/delay

SRCDIRS			:=  project \
					bsp/clk \
					bsp/led \
					bsp/key	\
					bsp/beep\
					bsp/delay

INCLUDE			:=	$(patsubst %, -I %, $(INCUDIRS))

SFLES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.s))
CFLES			:=	$(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))

SFLENDIR		:=	$(notdir	$(SFLES))
CFLENDIR		:=	$(notdir	$(CFLES))

SOBJS			:=	$(patsubst %, obj/%, $(SFLENDIR:.s=.o))
COBJS			:=	$(patsubst %, obj/%, $(CFLENDIR:.c=.o))

OBJS			:=	$(SOBJS) $(COBJS)

VPATH			:=	$(SRCDIRS)

.PHONY: clean

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6u.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf	$@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.s
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

clean:
	rm -rf $(TARGET).bin $(TARGET).dis $(TARGET).elf $(OBJS)

三、编译验证

  • 编译链接

image-20201210220433389

  • 插入SD卡进行下载

image-20201210220526751

  • 将SD卡插入开发板,LED进行500毫秒不间断闪烁,按键按下改变蜂鸣器状态

  • 最终文件夹

image-20201210220739314

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值