前面章节我们只介绍了GPIO的输出功能,这一节我们介绍输入功能,通过KEY按键的输入控制蜂鸣器响。
一.硬件原理图
可以看到只有key0贴片了,管脚为UART1_CTS。当没有按下时,管脚状态为高,按下时,管脚状态为低。
二.配置GPIO
下面的数据都是通过芯片手册查到的。
1.配置时钟。为了方便起见,我们将所有的时钟全部打开。
2.配置复用功能,IOMUXC_SW_MUX_CTL_PAD_UART1_CTS_B寄存器设置为0x5,即标准IO GPIO1_IO18 。
3.配置电器属性,IOMUXC_SW_PAD_CTL_PAD_UART1_CTS_B寄存器设置为0xf040
4.配置输入输出。GPIO1_GDIR为&~(1<<19),读取GPIO1_DR的值。
三.编写代码
bsp_key.c
#include "bsp_key.h"
void key_init(void){
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18 ,0);
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xf040);
GPIO1->GDIR &= ~(1<<18);
}
int read_key(){
int ret;
int pushbutton = OFF;
ret = ((GPIO1->DR) >> 18) & 0x1; //用于读取第18位的值。
if(!ret){
delay(10); //用于按键消抖
if(ret == (((GPIO1->DR) >> 18) & 0x1)){
pushbutton = ON;
}
}
return pushbutton;
}
main.c
#include "bsp_clk.h"
#include "bsp_led.h"
#include "bsp_beep.h"
#include "bsp_key.h"
#include "bsp_delay.h"
int main(void){
//使能时钟
enable_clock();
//设置复用功能和电器属性和输入输出
led_init();
beep_init();
key_init();
while (1)
{ if(read_key() == ON){
led_switch(LED0,ON);
beep_switch(ON);
delay(500);
}else{
led_switch(LED0,OFF);
beep_switch(OFF);
}
}
return 0;
}
总结
这一节就是把输出换成了输入,检测按键状态还是通过延时,也没有采用中断方式,比较low,主要还是熟悉reference。
碰到的一个问题:清除bss段的时候,必须要4字节对齐,不对齐的话可能会出现很多意想不到的问题,全看运气。