#include "includes.h" volatile uint8_t g_KeyVal = KEY_INVALID; void Key_Init(void) { SYS->PE_H_MFP &= ~(SYS_PE_H_MFP_PE12_MFP_Msk | SYS_PE_H_MFP_PE11_MFP_Msk | SYS_PE_H_MFP_PE10_MFP_Msk | SYS_PE_H_MFP_PE9_MFP_Msk); SYS->PE_H_MFP |= (SYS_PE_H_MFP_PE12_MFP_GPE12 | SYS_PE_H_MFP_PE11_MFP_GPE11 | SYS_PE_H_MFP_PE10_MFP_GPE10 | SYS_PE_H_MFP_PE9_MFP_GPE9); SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB9_MFP_Msk; SYS->PB_H_MFP |= SYS_PB_H_MFP_PB9_MFP_GPB9; /* Set GPIO Input */ GPIO_SetMode(PE, BIT12, GPIO_PMD_INPUT); // KEY_SET GPIO_SetMode(PE, BIT11, GPIO_PMD_INPUT); // KEY_DOWN GPIO_SetMode(PE, BIT10, GPIO_PMD_INPUT); // KEY_UP GPIO_SetMode(PE, BIT9, GPIO_PMD_INPUT); // KEY_MENU GPIO_SetMode(PB, BIT9, GPIO_PMD_INPUT); // KEY_SEND GPIO_ENABLE_PULL_UP(PB, BIT9); // 允许内部弱上拉(无外部上拉) /* Interrupt Type: Falling Edge */ GPIO_EnableInt(PE, 12, GPIO_INT_FALLING); GPIO_EnableInt(PE, 11, GPIO_INT_FALLING); GPIO_EnableInt(PE, 10, GPIO_INT_FALLING); GPIO_EnableInt(PE, 9, GPIO_INT_FALLING); GPIO_EnableInt(PB, 9, GPIO_INT_FALLING); /* Enable interrupt de-bounce function and select de-bounce sampling cycle time is 512 clocks of LIRC clock */ GPIO_SET_DEBOUNCE_TIME(GPIO_DBCLKSRC_IRC10K, GPIO_DBCLKSEL_256); GPIO_ENABLE_DEBOUNCE(PE, BIT12); GPIO_ENABLE_DEBOUNCE(PE, BIT11); GPIO_ENABLE_DEBOUNCE(PE, BIT10); GPIO_ENABLE_DEBOUNCE(PE, BIT9); GPIO_ENABLE_DEBOUNCE(PB, BIT9); } void Key_Open() { /* Enable GPIO IRQ */ NVIC_SetPriority (GPDEF_IRQn, 2); NVIC_EnableIRQ(GPDEF_IRQn); NVIC_SetPriority (EINT0_IRQn, 3); /* set Priority for On-Key Process */ NVIC_EnableIRQ(EINT0_IRQn); } /** * @brief GPIO DEF IRQ * * @param None * * @return None * * @details The PE default IRQ, declared in startup_M451Series.s. */ void GPDEF_IRQHandler(void) { // 如果是加速度传感器中断 if(GPIO_GET_INT_FLAG(PF, BIT5)) { // 处理加速度中断 Accelero_Handler(); } // 如果是按键中断 if(PE->ISRC) { // 处理按键中断 Key_Handler(); } } // 处理按键 void Key_Handler(void) { static uint32_t key_tick = 0; uint32_t tick = GetTickCount(); // 保存键值 uint8_t pe12 = PE12, pe11 = PE11, pe10 = PE10, pe9 = PE9; uint8_t pb9 = PB9; if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk) { // 重新打开看门狗计数器 WDT->CTL |= WDT_CTL_WTE_Msk; } // 清除中断标志 PE->ISRC = PE->ISRC; GPIO_CLR_INT_FLAG(PB, BIT9); if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk) { if((tick >= key_tick && tick - key_tick < 500) || (tick < key_tick && 0xFFFFFFFFul - key_tick + 1 + tick < 500)) { // printf("\n*** The 2nd key is ignored ***\n"); return; } delay_ms(10); // 清除中断唤醒标志 // CLK->WK_INTSTS |= CLK_WK_INTSTS_PD_WK_IS_Msk; Vcc_Enable(); delay_ms(40); Wakeup_Sleeping = 0; // 判断是否为低电平,排除干扰 if(PE12 && PE11 && PE10 && PE9 && PC7) { printf("\nWakeup by DISTURB ...\n"); // 由干扰引起的按键中断,发信号休眠 return; } if(pb9 == 0) printf("\n\nWake up by SEND KEY.\n\n"); else printf("\n\nWake up by KEY.\n\n"); // 采集数据 if(!Sample_Busy()) NVIC_SetPendingIRQ(TMR1_IRQn); key_tick = GetTickCount(); } // 如果是发送按键 if(pb9 == 0) { // 强制定位 GPS_Located = 0; GPS_Locate = 1; // 并发送 if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk) DTU_semSync = 1; else DTU_semGPRS = 1; return; } // 操作按键 g_KeyVal = KEY_INVALID; if(pe12 == 0) { // printf("\n----------- Key UP pressed -----------\n"); g_KeyVal = KEY_UP; } else if(pe11 == 0) { // printf("\n----------- Key DOWN pressed -----------\n"); g_KeyVal = KEY_DOWN; } else if(pe10 == 0) { // printf("\n----------- Key FUNC pressed -----------\n"); g_KeyVal = KEY_FUNC; } else if(pe9 == 0) { // printf("\n----------- Key SET pressed -----------\n"); g_KeyVal = KEY_SET; } if(g_KeyVal != KEY_INVALID) { // 重新计算时间 Form_ResetTimer(); // 不允许休眠 LCD_Disabled = 0; NVIC_SetPendingIRQ(EINT0_IRQn); } } void EINT0_IRQHandler(void) { NVIC_ClearPendingIRQ(EINT0_IRQn); // 按键处理:放在中断里执行,以及时响应 Form_OnKey(g_KeyVal); }