188 lines
4.1 KiB
C
188 lines
4.1 KiB
C
#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);
|
|
}
|