1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新
第十五章按键输入试验前面几章试验都是讲解如何使用I.MX6U的GPIO输出控制功能,I.MX6U的IO不仅能作为输出,而且也可以作为输入。I.MX6U-ALPHA开发板上有一个按键,按键连接了一个IO,将这个IO配置为输入功能,读取这个IO的值即可获取按键的状态(按下或松开)。本章通过这个按键来控制蜂鸣器的开关,通过本章的学习你将掌握如何将I.MX6UL的IO作为输入来使用。
15.1按键输入简介 按键就两个状态:按下或弹起,将按键连接到一个IO上,通过读取这个IO的值就知道按键是按下的还是弹起的。至于按键按下的时候是高电平还是低电平要根据实际电路来判断。前面几章我们都是讲解I.MX6U的GPIO作为输出使用,当GPIO连接按键的时候就要做为输入使用。关于I.MX6U的GPIO已经在第八章详细的讲解了,本章我们的主要工作就是配置按键所连接的IO为输入功能,然后读取这个IO的值来判断按键是否按下。 I.MX6U-ALPHA开发板上有一个按键KEY0,本章我们将会编写代码通过这个KEY0按键来控制开发板上的蜂鸣器,按一下KEY0蜂鸣器打开,再按一下蜂鸣器就关闭。 15.2 硬件原理分析 本试验我们用到的硬件有: 1) LED灯LED0。 2)蜂鸣器。 3)1个按键KEY0。 按键KEY0的原理图如图15.2.1所示:
图15.2.1 按键原理图 从图15.2.1可以看出,按键KEY0是连接到I.MX6U的UART1_CTS这个IO上的,KEY0接了一个10K的上拉电阻,因此KEY0没有按下的时候UART1_CTS应该是高电平,当KEY0按下以后UART1_CTS就是低电平。 15.3实验程序编写 本实验对应的例程路径为:开发板光盘-> 1、裸机例程->7_key。 本试验在上一章试验例程的基础上完成,重新创建VSCode工程,工作区名字为“key”,在工程目录的bsp文件夹中创建名为“key”和“gpio”两个文件夹。按键相关的驱动文件都放到“key”文件夹中,本章试验我们对GPIO的操作编写一个函数集合,也就是编写一个GPIO驱动文件,GPIO的驱动文件放到“gpio”文件夹里面。 新建bsp_gpio.c和bsp_gpio.h这两个文件,将这两个文件都保存到刚刚创建的bsp/gpio文件夹里面,然后在bsp_gpio.h文件夹里面输入如下内容:
示例代码15.3.1 bsp_gpio.h文件代码
1 #ifndef _BSP_GPIO_H
2 #define _BSP_GPIO_H
3 #define _BSP_KEY_H
4 #include "imx6ul.h"
5/***************************************************************
6 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
7文件名 : bsp_gpio.h
8作者 : 左忠凯
9版本 : V1.0
10描述 : GPIO操作文件头文件。
11其他 : 无
12论坛 : www.openedv.com
13日志 : 初版V1.0 2019/1/4 左忠凯创建
14 ***************************************************************/
15
16/* 枚举类型和结构体定义 */
17typedefenum _gpio_pin_direction
18{
19 kGPIO_DigitalInput =0U,/* 输入 */
20 kGPIO_DigitalOutput =1U,/* 输出 */
21} gpio_pin_direction_t;
22
23/* GPIO配置结构体 */
24typedefstruct _gpio_pin_config
25{
26 gpio_pin_direction_t direction;/* GPIO方向:输入还是输出 */
27uint8_t outputLogic; /* 如果是输出的话,默认输出电平 */
28} gpio_pin_config_t;
29
30
31/* 函数声明 */
32void gpio_init(GPIO_Type *base,int pin, gpio_pin_config_t *config);
33int gpio_pinread(GPIO_Type *base,int pin);
34void gpio_pinwrite(GPIO_Type *base,int pin,int value);
35
36 #endif
bsp_gpio.h中定义了一个枚举类型gpio_pin_direction_t和结构体gpio_pin_config_t,枚举类型gpio_pin_direction_t表示GPIO方向,输入或输出。结构体gpio_pin_config_t是GPIO的配置结构体,里面有GPIO的方向和默认输出电平两个成员变量。在bsp_gpio.c中输入如下所示内容:
示例代码15.3.2 bsp_gpio.c文件代码
1 #include "bsp_gpio.h"
2/***************************************************************
3 Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
4文件名 : bsp_gpio.h
5作者 : 左忠凯
6版本 : V1.0
7描述 : GPIO操作文件。
8其他 : 无
9论坛 : www.openedv.com
10日志 : 初版V1.0 2019/1/4 左忠凯创建
11 ***************************************************************/
12
13/*
14 * @description : GPIO初始化。
15 * @param - base : 要初始化的GPIO组。
16 * @param - pin : 要初始化GPIO在组内的编号。
17 * @param - config : GPIO配置结构体。
18 * @return : 无
19 */
20void gpio_init(GPIO_Type *base,int pin, gpio_pin_config_t *config)
21{
22 if(config->direction == kGPIO_DigitalInput) /* 输入 */
23 {
24 base->GDIR &=~(1> pin)&0x1);
42}
43
44/*
45 * @description : 指定GPIO输出高或者低电平。
46 * @param – base : 要输出的的GPIO组。
47 * @param - pin : 要输出的GPIO脚号。
48 * @param – value : 要输出的电平,1 输出高电平, 0 输出低低电平
49 * @return : 无
50 */
51void gpio_pinwrite(GPIO_Type *base,int pin,int value)
52{
53 if(value ==0U)
54 {
55 base->DR &=~(1U
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?