1221|2

1万

帖子

16

TA的资源

版主

楼主
 

【极海APM32F407】9, 外部按键中断 [复制链接]

 

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

              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


 

最新回复

jiayou~   详情 回复 发表于 2023-6-12 19:37
点赞 关注
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复
举报

6841

帖子

11

TA的资源

版主

沙发
 
不用加消抖,效果也挺好的呀,有绝招呀!
 
 
 

回复

266

帖子

0

TA的资源

一粒金砂(高级)

板凳
 

jiayou~

个人签名

gitee/casy

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表