MS-DTU/Anjiehui7_TTS_ST_V2.4_LOCAL/User/gpio_key.c

205 lines
5.1 KiB
C
Raw Normal View History

2025-04-03 14:18:58 +08:00
#include "includes.h"
volatile uint8_t Key_Wakeup = 0; // <20>Ƿ񰴼<C7B7><F1B0B4BC><EFBFBD><EFBFBD><EFBFBD>
// 485<38><35><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define KEY_TASKM_DATA_COUNT 4
loopbuff_t Key_TaskM;
uint8_t Key_TaskM_Data[sizeof(uint8_t) * (KEY_TASKM_DATA_COUNT + 1)] = {0};
// 485<38><35><EFBFBD>ڽ<EFBFBD><DABD>յ<EFBFBD><D5B5>ź<EFBFBD><C5BA><EFBFBD>
SemaphoreHandle_t Key_Semaphore = NULL; // <20><>ֵ<EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Key_Init(void)
{
LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
/* GPIO Ports Clock Enable */
LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOE);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE3);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE4);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE5);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE6);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_3;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_4;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_5;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_6;
EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
EXTI_InitStruct.LineCommand = ENABLE;
EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_FALLING;
LL_EXTI_Init(&EXTI_InitStruct);
/**/
LL_GPIO_SetPinPull(GPIOE, LL_GPIO_PIN_3, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOE, LL_GPIO_PIN_4, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOE, LL_GPIO_PIN_5, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOE, LL_GPIO_PIN_6, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinMode(GPIOE, LL_GPIO_PIN_3, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOE, LL_GPIO_PIN_4, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOE, LL_GPIO_PIN_5, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOE, LL_GPIO_PIN_6, LL_GPIO_MODE_INPUT);
}
void Key_Open()
{
// <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LoopBuff_Create(&Key_TaskM, sizeof(uint8_t), KEY_TASKM_DATA_COUNT, 0, (uint32_t) Key_TaskM_Data);
// <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD>
Key_Semaphore = xSemaphoreCreateBinary();
/* EXTI interrupt init*/
NVIC_SetPriority(EXTI3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(EXTI3_IRQn);
NVIC_SetPriority(EXTI4_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(EXTI4_IRQn);
NVIC_SetPriority(EXTI9_5_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
NVIC_EnableIRQ(EXTI9_5_IRQn);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Key_Handler(void)
{
static uint32_t key_tick = 0;
uint32_t tick = GetTickCount();
uint8_t g_KeyVal = KEY_INVALID;
BaseType_t xHigherPriorityTaskWoken;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
uint8_t pe3 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_3),
pe4 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_4),
pe5 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_5),
pe6 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_6);
if(Wakeup_SleepMode) // ˯<><CBAF>ģʽ
{
Watchdog_Feed(); // ι<><CEB9>
if(pe3 == 0 && pe6 == 0) // ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC>ͳ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
NVIC_SystemReset();
return;
}
// <20><>¼<EFBFBD>Ƿ񰴼<C7B7><F1B0B4BC><EFBFBD><EFBFBD><EFBFBD>
Key_Wakeup = Wakeup_Sleeping;
if(Wakeup_Sleeping)
{
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
delay_ms(10);
Vcc_Enable();
delay_ms(40);
Wakeup_Sleeping = 0;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD>
if(LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_3) && LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_4)
&& LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_5) && LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_6))
{
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;
}
printf("\n\nWake up by KEY.\n\n");
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Sample_NotifyFromISR();
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>300ms<6D><73><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if((tick >= key_tick && tick - key_tick < 300) || (tick < key_tick && 0xFFFFFFFFul - key_tick + 1 + tick < 300))
return;
// ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC>ͳ<EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
if(pe3 == 0 && pe6 == 0)
{
// <20><>λ
VCC_GSM_OFF();
delay_ms(200);
NVIC_SystemReset();
}
g_KeyVal = KEY_INVALID;
if(pe3 == 0)
{
//printf("\n----------- Key pe3 pressed -----------\n");
g_KeyVal = KEY_FUNC;
}
else if(pe4 == 0)
{
//printf("\n----------- Key pe4 pressed -----------\n");
g_KeyVal = KEY_UP;
}
else if(pe5 == 0)
{
//printf("\n----------- Key pe5 pressed -----------\n");
g_KeyVal = KEY_DOWN;
}
else if(pe6 == 0)
{
//printf("\n----------- Key pe6 pressed -----------\n");
g_KeyVal = KEY_SET;
}
if(g_KeyVal != KEY_INVALID)
{
key_tick = GetTickCount();
// <20><><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>ʱ<EFBFBD><CAB1>
Form_ResetTimer();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LCD_Disabled = 0;
// <20><><EFBFBD><EFBFBD><EBBBBA>
LoopBuff_PutItem(&Key_TaskM, &g_KeyVal);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
xSemaphoreGiveFromISR(Key_Semaphore, &xHigherPriorityTaskWoken);
}
}