打印
[APM32E0]

APM32E030按键输入检测与中断

[复制链接]
194|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 LIZARD925 于 2025-6-19 00:07 编辑

此例程主要验证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();
    }
}
外部中断的中断函数具体在此处:


3-2 APM32E030-按键控制LED.zip

172.43 KB

使用特权

评论回复
沙发
雾里闲逛| | 2025-6-20 10:02 | 只看该作者
按键采集与响应上面,我其实挺犹豫是不是使用中断方式。
感觉使用中断有点浪费,另一方面,中断也在那,不用它也在那。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

15

帖子

0

粉丝