注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
lugl4313820的个人空间 http://home.eeworld.com.cn/space-uid-1269709.html [收藏] [复制] [分享] [RSS]
日志

【正点原子阿尔法 IMX6ULL Linux开发板】KEY控制蜂鸣器

已有 393 次阅读2023-5-8 20:17

  1. 【正点原子阿尔法 IMX6ULL Linux开发板】用BSP工程管理项目 
  2. 【正点原子阿尔法 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日
***************************************************************/

/**
 * @brief :GPIO初始化。
 * @param :要初始化的GPIO组
 * @param : 要初始化在组号的编号
 * @param : GPIO配置结构体
 * @return : 无
 * 
 */ 
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  :要输出的脚号
 * @parma -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日
***************************************************************/
/**
 * @description : 初始化按键
 * @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蜂鸣器交替鸣响。

[localvideo]70d93f78644b14a3865ded335bce1dad[/localvideo]
 

本文来自论坛,点击查看完整帖子内容。

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章