一、硬件原理图分析 按键KEY0链接到了UART1_CTS引脚上。默认情况下UART1_CTS为高,当按下KEY0以后UART1_CTS为低。 二、实验程序编写1、设置UART1_CTS复用为GPIO1_IO18 2、设置UART1_CTS的电气属性。 3、配置GPIO1_IO08为输入模式。 4、读取按键值,也就是GPIO1_IO08的高低电平 注:在程序防抖过程中应加入防抖操作 三、加上清除BSS段,代码不运 行__bss_start = 0X87800289。对于32位的SOC来说,一般访问是4字节访问的。0X0,0X4,0X8,0XC。芯片处理的时候以4字节访问,因此会从0X878000288开始清除BSS段。然而0X878000288不属于BSS段。所以我们需要对__bss_start进行四字节对其。按照四字节对其的原理,__bss_start=0X8780028C。所以需要设置__bss_start为四字节对其。 附录:代码分析 Bsp_key,h #ifndef __BSP_KEY_H #define __BSP_KEY_H #include "fsl_common.h" #include "fsl_iomuxc.h" #include "MCIMX6Y2.h" /* 按键值 */ enum keyvalue{ KEY_NONE = 0, KEY0_VALUE, }; /* 函数声明 */ void key_init(void); int read_key(void); int key_getvalue(void); #endif Bsp_key.c #include "bsp_key.h" #include "bsp_delay.h" #include "bsp_gpio.h" /* 初始化按键 */ void key_init(void) { gpio_pin_config_t key_config; IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0); /*复用为GPIO1_IO18 */ IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18, 0XF080); /* GPIO初始化 */ key_config.direction = kGPIO_DigitalInput; gpio_init(GPIO1, 18, &key_config); } /* 读取按键值 * 返回值:0 按下,1 未按下 */ int read_key(void) { int ret = 0; ret = gpio_pinread(GPIO1, 18); return ret; } int key_getvalue(void) { int ret = 0; static unsigned char release = 1; /* 为1表示按键释放 */ if((release==1) && (gpio_pinread(GPIO1, 18) == 0)) /* 按下 */ { delay(10); release = 0; if(gpio_pinread(GPIO1, 18) == 0) /* 如果延时10ms以后KEY0还是0,表示按键有效 */ { ret = KEY0_VALUE; } } else if(gpio_pinread(GPIO1, 18) == 1) /* 未按下 */ { ret = KEY_NONE; release = 1; } return ret; }
|