1、实验现象:当按下KEY0~KEY3按键时,会打印对应看见信息。
#define KEY2_PIN_NUM P2_4
#define KEY2_GPIO_PIN GPIO_GetPin(KEY2_PIN_NUM)
#define KEY3_PIN_NUM P2_3
#define KEY3_GPIO_PIN GPIO_GetPin(KEY3_PIN_NUM)
#define KEY1_PIN_NUM P4_1
#define KEY1_GPIO_PIN GPIO_GetPin(KEY1_PIN_NUM)
#define KEY0_PIN_NUM P4_0
#define KEY0_GPIO_PIN GPIO_GetPin(KEY0_PIN_NUM)
#define KEY_NON 0XFF
#define KEY0_RELEASE 0x01
#define KEY0_PESS 0x02
#define KEY1_RELEASE 0x03
#define KEY1_PESS 0x04
#define KEY2_RELEASE 0x05
#define KEY2_PESS 0x06
#define KEY3_RELEASE 0x07
#define KEY3_PESS 0x08
uint8_t key_sta= KEY_NON;
void int_key_demo(void)
{
Pad_Config(KEY0_PIN_NUM, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(KEY1_PIN_NUM, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(KEY2_PIN_NUM, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pad_Config(KEY3_PIN_NUM, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_UP, PAD_OUT_DISABLE, PAD_OUT_HIGH);
Pinmux_Config(KEY0_PIN_NUM, DWGPIO);
Pinmux_Config(KEY1_PIN_NUM, DWGPIO);
Pinmux_Config(KEY2_PIN_NUM, DWGPIO);
Pinmux_Config(KEY3_PIN_NUM, DWGPIO);
RCC_PeriphClockCmd(APBPeriph_GPIO, APBPeriph_GPIO_CLOCK, ENABLE);
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = KEY0_GPIO_PIN | KEY1_GPIO_PIN | KEY2_GPIO_PIN | KEY3_GPIO_PIN ;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_ITCmd = ENABLE;
GPIO_InitStruct.GPIO_ITTrigger = GPIO_INT_Trigger_EDGE;
GPIO_InitStruct.GPIO_ITPolarity = GPIO_INT_POLARITY_ACTIVE_LOW;
GPIO_InitStruct.GPIO_ITDebounce = GPIO_INT_DEBOUNCE_ENABLE;
GPIO_InitStruct.GPIO_DebounceTime = 10;/* unit:ms , can be 1~64 ms */
GPIO_Init(&GPIO_InitStruct);
/* Enable interrupt */
GPIO_INTConfig(KEY0_GPIO_PIN|KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN, ENABLE);
GPIO_MaskINTConfig(KEY0_GPIO_PIN|KEY1_GPIO_PIN|KEY2_GPIO_PIN|KEY3_GPIO_PIN, DISABLE);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = GPIO20_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = GPIO19_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = GPIO29_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
NVIC_InitStruct.NVIC_IRQChannel = GPIO28_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 3;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
while(1)
{
if (KEY_NON != key_sta)
{
if (key_sta == KEY2_RELEASE) DBG_DIRECT("key2 Pair button release !!!\n");
if (key_sta == KEY2_PESS) DBG_DIRECT("key2 Pair button press !!!\n");
if (key_sta == KEY3_RELEASE) DBG_DIRECT("key3 Pair button release !!!\n");
if (key_sta == KEY3_PESS) DBG_DIRECT("key3 Pair button press !!!\n");
if (key_sta == KEY0_RELEASE) DBG_DIRECT("key0 Pair button release !!!\n");
if (key_sta == KEY0_PESS) DBG_DIRECT("key0 Pair button press !!!\n");
if (key_sta == KEY1_RELEASE) DBG_DIRECT("key1 Pair button release !!!\n");
if (key_sta == KEY1_PESS) DBG_DIRECT("key1 Pair button press !!!\n");
key_sta = KEY_NON;
}
}
}
中断的处理函数
void GPIO19_Handler(void)
{
/* Mask GPIO interrupt */
GPIO_INTConfig(KEY3_GPIO_PIN, DISABLE);
GPIO_MaskINTConfig(KEY3_GPIO_PIN, ENABLE);
GPIO_ClearINTPendingBit(KEY3_GPIO_PIN);
if ( GPIO_ReadInputDataBit(KEY3_GPIO_PIN) ) //Release
{
GPIO->INTPOLARITY &= ~KEY3_GPIO_PIN; //Polarity Low
// System_WakeUpPinEnable(PAIR_BUTTON, PAD_WAKEUP_POL_LOW, PAD_WK_DEBOUNCE_ENABLE);
key_sta = KEY3_RELEASE;
} else
{
GPIO->INTPOLARITY |= KEY3_GPIO_PIN; //Polarity High
// System_WakeUpPinEnable(PAIR_BUTTON, PAD_WAKEUP_POL_HIGH, PAD_WK_DEBOUNCE_ENABLE);
key_sta = KEY3_PESS;
}
GPIO_MaskINTConfig(KEY3_GPIO_PIN, DISABLE);
GPIO_INTConfig(KEY3_GPIO_PIN, ENABLE);
}