本帖最后由 LIZARD925 于 2025-6-19 00:07 编辑
此例程主要验证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();
}
}
外部中断的中断函数具体在此处:
|