一 次偶然的翻阅资料,我突然看到极海的外部中断例程有一个函数:
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);
}
}
当然在编译时得调整一下相应的头文件。
运行结果如下: