按键实验

硬件分析

  1. RST 复位按键。该按键连接至 i.MX 6U 的 POR 引脚,当该引脚为低电平时会引起i.MX 6U 芯片的复位(复位的基本现象是程序从头开始运行)。从按键的原理图可知,该按键在没有被按下的时候,引脚状态为高电平,当按键按下时,引脚状态为低电平(按键所在的电路导通,引脚接到地)。所以,平时 POR_B 引脚保持高电平,芯片正常运行,按下按键时产生复位,如图所示:

    ../../_images/image-20210814204957996.png

  2. MODE 按键。MODE 按键最为特殊,它通过一系列电路连接至两个引脚BOOT_MODE[0]和 BOOT_MODE[1],当该按键按下时,BOOT_MODE[0]引脚状态为高电平,BOOT_MODE[1]则相反为低电平。BOOT_MODE[0]和 BOOT_MODE[1]都具有 GPIO 的功能,即我们可以选取这二者中任意一个设置成 GPIO 的输入模式并检测相应的输入电平,来判断按键是否被按下。MODE 按键这样设计是为了方便切换芯片的启动方式,芯片复位启动后会检测这两个引脚的电平,根据 BOOT_MODE[0]和BOOT_MODE[1]的电平状态来选择 FLASH 还是 USB 的启动方式。在本章实验中我们不使用该按键。MODE 按键在原理图中的位置如图 所示

    ../../_images/image-20210814205226680.png

  3. ON/OFF 按键。该按键连接至 i.MX 6U 的 ONOFF 引脚,长按可以实现开关机。该按键不要用作普通按键使用。ON/OFF 按键在原理图中的位置如图所示

    ../../_images/image-20210814205453443.png

  4. KEY 按键。该按键连接至 SNVS_TAMPER1 引脚,用作普通的按键。本实验将用该按键实现 GPIO 输出功能。KEY 按键在原理图中的位置如图所示

    ../../_images/image-20210814205511087.png

  5. 触摸按键:该按键是电容触摸

    ../../_images/image-20210814205614448.png

总结分析:本章节主要控制KEY按键,即GPIO5_1

../../_images/image-20210814205850872.png

代码分析

参考【09.key】代码

bsp_key.c

#include "bsp_key.h"

/* 所有引脚均使用同样的PAD配置 
* 配置说明 :
* 转换速率: 转换速率慢
* 驱动强度: R0/6 
* 带宽配置 : medium(100MHz)
* 开漏配置: 关闭 
* 拉/保持器配置: 关闭
* 拉/保持器选择: 保持器(上面已关闭,配置无效)
* 上拉/下拉选择: 100K欧姆下拉(上面已关闭,配置无效)
*  滞回器配置: 关闭 
*/  
#define KEY_PAD_CONFIG_DATA            (SRE_0_SLOW_SLEW_RATE| \
                                        DSE_6_R0_6| \
                                        SPEED_2_MEDIUM_100MHz| \
                                        ODE_0_OPEN_DRAIN_DISABLED| \
                                        PKE_0_PULL_KEEPER_DISABLED| \
                                        PUE_0_KEEPER_SELECTED| \
                                        PUS_0_100K_OHM_PULL_DOWN| \
                                        HYS_1_HYSTERESIS_ENABLED)   


void key_init(void)
{
    CCM_CCGR1_CG13(0x3);//开启GPIO1的时钟

    /*设置 红灯 引脚的复用功能以及PAD属性*/
    IOMUXC_SetPinMux(KEY_IOMUXC,0);     
    IOMUXC_SetPinConfig(KEY_IOMUXC, KEY_PAD_CONFIG_DATA); 


    KEY_GPIO->GDIR &= ~(1<<KEY_GPIO_PIN);  		//设置为输入模式

}

bsp_key.h

#ifndef __BSP_KEY_H
#define __BSP_KEY_H

#if defined(__cplusplus)
extern "C" {
#endif  

#include "imx6ul.h"


/* bepp GPIO端口、引脚号及IOMUXC复用宏定义*/
#define KEY_GPIO                GPIO5
#define KEY_GPIO_PIN            (1U)
#define KEY_IOMUXC              IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01


#define KEY_READ()              ((KEY_GPIO->DR &(1<<KEY_GPIO_PIN))?1:0)
 
void key_init(void);
#if defined(__cplusplus)
}
#endif  

#endif 

main.c

int main(void)
{
	clk_enable();		/* 使能所有的时钟 			*/
	rgb_led_init();		/* 初始化led 			*/
	uart_init();		/* 初始化串口,波特率115200 */
  	beep_init();
    key_init();
    printf("Key DEMO\r\n");
	while(1)			
	{	
		if(KEY_READ()){
			delay(100);
			if(KEY_READ()){
				printf("Key press\r\n");
				BEEP_ON(); 		/* beep  */
				delay(50);
			}
		}
	
		BEEP_OFF(); 		/* beep  */
	}

	return 0;
}

实验现象

如图所示:按下KEY按键,会输出下面提示,并且蜂鸣器响一下。

../../_images/image-20210814212438422.png