- #define APM_LED2_On GPIO_SetBit(GPIOE,GPIO_PIN_6)
- #define APM_LED2_Off GPIO_ResetBit(GPIOE,GPIO_PIN_6)
- #define APM_LED2_Toggle GPIO_ToggleBit(GPIOE,GPIO_PIN_6)
- #define APM_LED3_On GPIO_SetBit(GPIOE,GPIO_PIN_5)
- #define APM_LED3_Off GPIO_ResetBit(GPIOE,GPIO_PIN_5)
- #define APM_LED3_Toggle GPIO_ToggleBit(GPIOE,GPIO_PIN_5)
- void APM_GPIOInit(void)
- {
- GPIO_Config_T configStruct;
- /* Enable the GPIO_LED Clock */
- RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOE);
- /* Configure the GPIO_LED pin */
- GPIO_ConfigStructInit(&configStruct);
- configStruct.pin = GPIO_PIN_6|GPIO_PIN_5;
- configStruct.mode = GPIO_MODE_OUT;
- configStruct.speed = GPIO_SPEED_50MHz;
- GPIO_Config(GPIOE, &configStruct);
- }
- void APM_EINTInit(void)
- {
- GPIO_Config_T GPIO_configStruct;
- EINT_Config_T EINT_configStruct;
- /* Enable the BUTTON Clock */
- RCM_EnableAHB1PeriphClock(RCM_AHB1_PERIPH_GPIOA);
- /* Configure Button pin as input floating */
- GPIO_ConfigStructInit(&GPIO_configStruct);
- GPIO_configStruct.mode = GPIO_MODE_IN;
- GPIO_configStruct.pin = GPIO_PIN_0|GPIO_PIN_1;
- GPIO_configStruct.pupd = GPIO_PUPD_UP;
- GPIO_Config(GPIOA, &GPIO_configStruct);
- /* Enable the SYSCFG Clock */
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
-
- /* Connect Button EINT Line to Button GPIO Pin */
- SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_0);
- /* Configure Button EINT line */
- EINT_configStruct.line = EINT_LINE_0;
- 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(EINT0_IRQn, 0x0f, 0x0f);
-
- SYSCFG_ConfigEINTLine(SYSCFG_PORT_GPIOA, SYSCFG_PIN_1);
- /* Configure Button EINT line */
- EINT_configStruct.line = EINT_LINE_1;
- 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(EINT1_IRQn, 0x0f, 0x0f);
- }
由于按键采用的是外部中断的方式继续的采集,所以要求中断处理函数:
- void EINT0_IRQHandler(void)
- {
- if(EINT_ReadIntFlag(EINT_LINE_0))
- {
- APM_LED3_Toggle;
- /*Clear EINT_LINE0 interrupt flag*/
- EINT_ClearIntFlag(EINT_LINE_0);
- }
- }
- void EINT1_IRQHandler(void)
- {
- if(EINT_ReadIntFlag(EINT_LINE_1))
- {
- APM_LED2_Toggle;
- /*Clear EINT_LINE0 interrupt flag*/
- EINT_ClearIntFlag(EINT_LINE_1);
- }
- }
效果如下:按键一次对应的LED翻转一次