这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » APM32E030按键输入检测与中断

共2条 1/1 1 跳转至

APM32E030按键输入检测与中断

院士
2025-06-20 10:15:28     打赏

此例程主要验证APM32E030的GPIO输入功能与外部中断输入功能,对于普通的按键检测,只需初始化GPIO为输入模式,并配置引脚上下拉,在while1中一直读取即可,GPIO初始化:

void key_init(void)
{
        RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);        //打开GPIOA的时钟
        GPIO_Config_T GPIO_InitStructure;    
        
        GPIO_InitStructure.mode = GPIO_MODE_IN;                    // 输入模式
        GPIO_InitStructure.pin = GPIO_PIN_0|GPIO_PIN_1;       
        GPIO_InitStructure.speed = GPIO_SPEED_50MHz;        
        GPIO_InitStructure.pupd = GPIO_PUPD_PU;                        //上拉输入
        GPIO_Config(GPIOA,&GPIO_InitStructure);
}

进行按键的消抖与按键状态的读取,使用的都是通用的函数:

uint8_t key_getnum(void)
{
        uint8_t keynum=0;
        if(GPIO_ReadInputBit(GPIOA,GPIO_PIN_0)==0)//判断按键是否按下
        {
                Delay_ms(10);
                while(GPIO_ReadInputBit(GPIOA,GPIO_PIN_0)==0);
                Delay_ms(10);
                keynum=1;        
        }
        if(GPIO_ReadInputBit(GPIOA,GPIO_PIN_1)==0)//判断按键是否按下
        {
                Delay_ms(10);
                while(GPIO_ReadInputBit(GPIOA,GPIO_PIN_1)==0);
                Delay_ms(10);
                keynum=2;
        }
        return keynum;

}

对于外部中断输入的验证,我们需要打开引脚的复用,并打开 SYSCFG 时钟,配置中断线与触发边沿,并设置中断优先级

void key_eint_init(void)        //中断按键
{
        RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);        //打开GPIOA的时钟
        RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
        
        GPIO_Config_T GPIO_InitStructure;    
        
        GPIO_InitStructure.mode = GPIO_MODE_IN;                    // 输入模式
        GPIO_InitStructure.pin = GPIO_PIN_0|GPIO_PIN_1;       
        GPIO_InitStructure.speed = GPIO_SPEED_50MHz;        
        GPIO_InitStructure.pupd = GPIO_PUPD_PU;                        //上拉输入
        GPIO_Config(GPIOA,&GPIO_InitStructure);
        
        SYSCFG_EINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_0);  //跟管脚
    SYSCFG_EINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_1);
        
        EINT_Config_T EXTI_InitStructure;
        EXTI_InitStructure.line = EINT_LINE0|EINT_LINE1;
        EXTI_InitStructure.lineCmd = ENABLE;
        EXTI_InitStructure.mode = EINT_MODE_INTERRUPT;
        EXTI_InitStructure.trigger = EINT_TRIGGER_FALLING;
        EINT_Config(&EXTI_InitStructure);
        
        NVIC_EnableIRQRequest(EINT0_1_IRQn, 0x0f);
}

此时,即可使用中断的方式进行按键的读取,在中断中加入自己的逻辑:

void EINT0_1_IRQHandler(void)
{
        if (EINT_ReadStatusFlag(EINT_LINE0) == SET)
    {
        EINT_ClearStatusFlag(EINT_LINE0);
                LED1_turn();
    }

    if (EINT_ReadStatusFlag(EINT_LINE1) == SET)
    {
        EINT_ClearStatusFlag(EINT_LINE1);
                LED2_turn();
    }
}




关键词: APM32E030     按键     输入     中断    

专家
2025-06-24 14:56:24     打赏
2楼

类似GPIO初始化这样的处理,还是用Arduino方式的那样来的直观,比如pinMode、digitalWrite。为啥出品方不提供这样的简单初始化库函数呢?有些初始化处理中的设置,在大多数场合都是用默认的。


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]