- 【正点原子阿尔法 IMX6ULL Linux开发板】用BSP工程管理项目
- 【正点原子阿尔法 IMX6ULL Linux开发板】BEEP驱动
在上一篇beep驱动的基础上增加key的驱动,先把上篇的文件复制一份,重命名为key_bsp。然后用vscode打开。打开后新建bsp_key.h、bsp_key.c
2、为了更好的组织gpio的驱动,重新建立一个gpio的文件夹,下面新建bsp_gpio.c以及bsp_gpio.h。代码如下:
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H
/***************************************************************
Copyright © lugl., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_gpio.h
作者 : 刘建华
版本 : V1.0
描述 : GPIO操作文件头文件。
其他 : 无
论坛 :
日志 : 2023年5月8日,学习左忠凯老师例程
***************************************************************/
#include "imx6ul.h"
/* 枚举类型和结构体定义 */
typedef enum _gpio_pin_direction
{
kGPIO_DigitalInput = 0U, /* 输入 */
kGPIO_DigitalOutput = 1U, /* 输出 */
}gpio_pin_direction_t;
typedef struct _gpio_pin_config
{
gpio_pin_direction_t direction; /* GPIO方向:输入还是输出 */
uint8_t outputLogic; /* 如果是输出的话,默认输出电平 */
}gpio_pin_config_t;
/* 函数声明 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
#endif
gpio.c
#include "bsp_gpio.h"
/***************************************************************
Copyright © lugl, Ltd. 1998-2019. All rights reserved.
文件名 : bsp_key.c
作者 : 刘建华
版本 : V1.0
描述 : GPIO操作文件。
其他 : 无
论坛 :
日志 : 2023年5月8日
***************************************************************/
/**
* [url=home.php?mod=space&uid=159083]@brief[/url] :GPIO初始化。
* @param :要初始化的GPIO组
* @param : 要初始化在组号的编号
* @param : GPIO配置结构体
* [url=home.php?mod=space&uid=784970]@return[/url] : 无
*
*/
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
if(config->direction == kGPIO_DigitalInput) /* 输入 */
{
base->GDIR &= ~( 1 << pin);
}
else /* 输出 */
{
base->GDIR |= 1 << pin;
gpio_pinwrite(base,pin, config->outputLogic);/* 设置默认输出电平 */
}
}
/**
* @brief :读取指定GPIO的电平值
* @param -base :要读取的GPIO组
* @param -pin :要读取的GPIO的脚号
* @return :返回1或者0
*/
int gpio_pinread(GPIO_Type *base, int pin)
{
return (((base->DR)>>pin) & 0x1);
}
/**
* @brief 指定GPIO输出高或者低电平
* @param -base :要输出的GPIO组
* @param -pin :要输出的脚号
* [url=home.php?mod=space&uid=295915]@parma[/url] -value:要输出的电平 1输出高电平,0 输出低电平
* @return :无
*/
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
if(value == 0U)
{
base->DR &= ~(1<<pin); /* 输出低电平 */
}
else
{
base->DR |= (1<<pin); /* 输出高电平 */
}
}
bsp_key.h如下:
#ifndef __BSP_KEY_H
#define __BSP_KEY_H
/***************************************************************
Copyright © lugl., Ltd. 1998-2019. All rights reserved.
文件名 : bsp_key.h
作者 : 刘建华
版本 : V1.0
描述 : 按键驱动头文件。
其他 : 无
论坛 :
日志 : 2023年5月8日,学习左忠凯老师例程
***************************************************************/
#include "imx6ul.h"
/* 定义按键值 */
enum keyvalue{
KEY_NONE = 0,
KEY0_VALUE,
KEY1_VALUE,
KEY2_VALUE,
};
/* 函数声明 */
void key_init(void);
int key_getvalue(void);
#endif
bsp_key.c
#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_delay.h"
/***************************************************************
Copyright © lugl, Ltd. 1998-2019. All rights reserved.
文件名 : bsp_key.c
作者 : 刘建华
版本 : V1.0
描述 : 蜂鸣器驱动文件。
其他 : 无
论坛 :
日志 : 2023年5月8日
***************************************************************/
/**
* [url=home.php?mod=space&uid=1068364]@description[/url] : 初始化按键
* @param : 无
* @return : 无
*
*/
void key_init(void)
{
gpio_pin_config_t key_config;
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0);
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0xF080);
key_config.direction = kGPIO_DigitalInput;
gpio_init(GPIO1, 18, &key_config);
}
/**
* @brief :获取按键值
* @param :无
* @return:0没有按键按下,其他值,对应按键
*
*/
int key_getvalue(void)
{
int ret = 0;
static uint8_t release = 1; /* 默认按键是松开的 */
if((release == 1) && (gpio_pinread(GPIO1, 18) == 0))
{
delay(10);
release = 0;
if(gpio_pinread(GPIO1, 18) == 0)
ret = KEY0_VALUE;
}
else if(gpio_pinread(GPIO1, 18) == 1)
{
ret = 0;
release = 1; /* 标记按键释放 */
}
return ret;
}
然后我们修改main.c
/**************************************************************
Copyright © lugl, Ltd. 1998-2019. All rights reserved.
文件名 : mian.c
作者 : 刘建华
版本 : V1.0
描述 : I.MX6U开发板裸机实验5 BSP形式的KEY驱动
其他 :
论坛 :
日志 : 2023年5月8日 学习正点原子左中凯老师课程
**************************************************************/
#include "bsp_clk.h"
#include "bsp_delay.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
/*
* @description : mian函数
* @param : 无
* @return : 无
*/
int main(void)
{
int i = 0;
int keyvalue = 0;
uint8_t led_state = OFF;
uint8_t beep_state = OFF;
clk_enable(); /* 使能所有的时钟 */
led_init(); /* 初始化led */
beep_init(); /* 初始化beep */
key_init(); /* 按键初始化 */
while(1)
{
keyvalue = key_getvalue();
if(keyvalue)
{
switch (keyvalue)
{
case KEY0_VALUE:
beep_state = !beep_state;
beep_switch(beep_state);
break;
default:
break;
}
}
i++;
if(i == 50)
{
i = 0;
led_state = !led_state;
led_switch(LED0, led_state);
}
delay(10);
}
return 0;
}
6、修改Makefile,添加gpio、key的源文件以及.c文件:
然后编译下载:
【实验效果】下载到开发板启动后led闪烁,按下key0蜂鸣器交替鸣响。
蜂鸣器试验