此例程主要验证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(); } }