[原创] 【极海APM32F407】9, 外部按键中断

ddllxxrr   2023-6-9 05:23 楼主

     一 次偶然的翻阅资料,我突然看到极海的外部中断例程有一个函数:

              APM_MINI_PBInit(BUTTON_KEY2, BUTTON_MODE_EINT);
              APM_MINI_PBInit(BUTTON_KEY1, BUTTON_MODE_EINT);

      当时我兴奋不已,我以为就这么一句就可以声明这个管脚是外部中断了。

      可是当我追过去的时候,发现只是一个复杂的函数。在我失望的同时我也想改写一下这个函数。

      顺便评估一下手里的板子。

     改写的函数如下:

    

void APM_Init(ButtonMode_TypeDef Button_Mode)
{
    GPIO_Config_T     GPIO_configStruct;
    EINT_Config_T     EINT_configStruct;

    /** Enable the BUTTON Clock */
    RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOC);

    /** Configure Button pin as input floating */
    GPIO_ConfigStructInit(&GPIO_configStruct);
    GPIO_configStruct.mode = GPIO_MODE_IN;
    GPIO_configStruct.pin = GPIO_PIN_10|GPIO_PIN_11;
    GPIO_configStruct.pupd  = GPIO_PUPD_UP;
    GPIO_Config(GPIOC, &GPIO_configStruct);

    if (Button_Mode == BUTTON_MODE_EINT)
    {
        /** Enable the SYSCFG Clock */
        RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);

        /** Reset the SYSCFG Periph */
        SYSCFG_Reset();

        /** Connect Button EINT Line to Button GPIO Pin */
        SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOC, SYSCFG_PIN_10);
        SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOC, SYSCFG_PIN_11);
        /** Configure Button EINT line */
        EINT_configStruct.line =EINT_LINE_10;
        EINT_configStruct.mode = EINT_MODE_INTERRUPT;
        EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
        EINT_configStruct.lineCmd = ENABLE;
        EINT_Config(&EINT_configStruct);
			
			  EINT_configStruct.line =EINT_LINE_11;
        EINT_configStruct.mode = EINT_MODE_INTERRUPT;
        EINT_configStruct.trigger = EINT_TRIGGER_FALLING;
        EINT_configStruct.lineCmd = ENABLE;
        EINT_Config(&EINT_configStruct);

        /** Enable and set Button EINT Interrupt to the lowest priority */
        NVIC_EnableIRQRequest(EINT15_10_IRQn, 0x0f, 0x0f);
    }
}

同时在apm32F4xx_int.c中加入中断函数:

void EINT15_10_IRQHandler(void)
{
    if(EINT_ReadIntFlag(EINT_LINE_10))
    {
        GPIO_ToggleBit(GPIOE,GPIO_PIN_5);

        /**Clear EINT_LINE0 interrupt flag*/
        EINT_ClearIntFlag(EINT_LINE_10);
    }
		if(EINT_ReadIntFlag(EINT_LINE_11))
    {
        GPIO_ToggleBit(GPIOE,GPIO_PIN_6);

        /**Clear EINT_LINE0 interrupt flag*/
        EINT_ClearIntFlag(EINT_LINE_11);
    }
}

主函数如下:

int main(void)
{
//    APM_MINI_LEDInit(LED2);
//    APM_MINI_LEDInit(LED3);
	   GPIO_Config_T  configStruct;
	
	   RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOE );

    /** Configure the GPIO_LED pin */
    GPIO_ConfigStructInit(&configStruct);
    configStruct.pin = GPIO_PIN_5|GPIO_PIN_6;
    configStruct.mode = GPIO_MODE_OUT;
    configStruct.speed = GPIO_SPEED_50MHz;

	  GPIO_Config(GPIOE, &configStruct);
    APM_Init(BUTTON_MODE_EINT);

    while (1)
    {
        
			  SysTick_Delay_ms(1000);
        GPIO_ToggleBit(GPIOE,GPIO_PIN_5);
			  GPIO_ToggleBit(GPIOE,GPIO_PIN_6);
    }
}

当然在编译时得调整一下相应的头文件。

运行结果如下:

476702518


 

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

回复评论 (2)

不用加消抖,效果也挺好的呀,有绝招呀!
点赞  2023-6-9 17:15

jiayou~

gitee/casy
点赞  2023-6-12 19:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复