此笔记由个人整理
塞上苍鹰_fly
课程来自:正点原子_手把手教你学Linux
一、硬件原理图分析
- 底板按键原理图
- 按键默认为高电平
- 按键按下为低电平
- 按键与芯片连接
- 与芯片的连接对应引脚
- 按键对应的引脚为UART1_CTS 复用为GPIO1__IO18
二、实验程序编写
- 创建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
- 编写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)
三、编译验证
- 编译链接
- 插入SD卡进行下载
-
将SD卡插入开发板,LED进行500毫秒不间断闪烁,按键按下改变蜂鸣器状态
-
最终文件夹