NANO130_H2Press/User/gpio_key.c

188 lines
4.1 KiB
C
Raw Normal View History

2025-04-10 14:54:41 +08:00
#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); // <20><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/* 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)
{
// <20><><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC>ٶȴ<D9B6><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
if(GPIO_GET_INT_FLAG(PF, BIT5))
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6>ж<EFBFBD>
Accelero_Handler();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ж<EFBFBD>
if(PE->ISRC)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
Key_Handler();
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Key_Handler(void)
{
static uint32_t key_tick = 0;
uint32_t tick = GetTickCount();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
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)
{
// <20><><EFBFBD>´򿪿<C2B4><F2BFAABF>Ź<EFBFBD><C5B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
WDT->CTL |= WDT_CTL_WTE_Msk;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־
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);
// <20><><EFBFBD><EFBFBD><EFBFBD>жϻ<D0B6><CFBB>ѱ<EFBFBD>־
// CLK->WK_INTSTS |= CLK_WK_INTSTS_PD_WK_IS_Msk;
Vcc_Enable();
delay_ms(40);
Wakeup_Sleeping = 0;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>
if(PE12 && PE11 && PE10 && PE9 && PC7)
{
printf("\nWakeup by DISTURB ...\n");
// <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>İ<EFBFBD><C4B0><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>
return;
}
if(pb9 == 0)
printf("\n\nWake up by SEND KEY.\n\n");
else
printf("\n\nWake up by KEY.\n\n");
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
if(!Sample_Busy())
NVIC_SetPendingIRQ(TMR1_IRQn);
key_tick = GetTickCount();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>Ͱ<EFBFBD><CDB0><EFBFBD>
if(pb9 == 0)
{
// ǿ<>ƶ<EFBFBD>λ
GPS_Located = 0;
GPS_Locate = 1;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(CLK->WK_INTSTS & CLK_WK_INTSTS_PD_WK_IS_Msk)
DTU_semSync = 1;
else
DTU_semGPRS = 1;
return;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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)
{
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ʱ<EFBFBD><CAB1>
Form_ResetTimer();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_Disabled = 0;
NVIC_SetPendingIRQ(EINT0_IRQn);
}
}
void EINT0_IRQHandler(void)
{
NVIC_ClearPendingIRQ(EINT0_IRQn);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6><EFBFBD>ִ<EFBFBD>У<EFBFBD><D0A3>Լ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ
Form_OnKey(g_KeyVal);
}