(四)arm裸机开发--- KEY按键输入,控制蜂鸣器

前面章节我们只介绍了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字节对齐,不对齐的话可能会出现很多意想不到的问题,全看运气。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值