1847|1

6980

帖子

11

TA的资源

版主

楼主
 

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

  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日
***************************************************************/

/**
 * [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蜂鸣器交替鸣响。

蜂鸣器试验

 

此帖出自ARM技术论坛

最新回复

新建bsp_gpio.c和bsp_gpio.h的代码这个收藏一下   详情 回复 发表于 2023-5-10 07:34
点赞 关注
 

回复
举报

6809

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

新建bsp_gpio.c和bsp_gpio.h的代码这个收藏一下

此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表