STM32_WGY/User/gpio_key.c

220 lines
5.8 KiB
C
Raw Normal View History

2025-04-03 15:29:20 +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 3
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_GPIOB);
/**/
// LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE2);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTB, LL_SYSCFG_EXTI_LINE3);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTB, LL_SYSCFG_EXTI_LINE4);
/**/
LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTB, LL_SYSCFG_EXTI_LINE5);
/**/
// LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTE, LL_SYSCFG_EXTI_LINE6);
/**/
// EXTI_InitStruct.Line_0_31 = LL_EXTI_LINE_2;
// 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_RISING;
// LL_EXTI_Init(&EXTI_InitStruct);
/**/
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_2, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_3, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOB, LL_GPIO_PIN_4, LL_GPIO_PULL_NO);
/**/
LL_GPIO_SetPinPull(GPIOB, 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_2, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_3, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_4, LL_GPIO_MODE_INPUT);
/**/
LL_GPIO_SetPinMode(GPIOB, 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(EXTI2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0));
// NVIC_EnableIRQ(EXTI2_IRQn);
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 //pe2 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_2),
pe3 = LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_3),
pe4 = LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_4),
pe5 = LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_5);
//pe6 = LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_6);
// <20><>¼<EFBFBD>Ƿ񰴼<C7B7><F1B0B4BC><EFBFBD><EFBFBD><EFBFBD>
Key_Wakeup = Wakeup_Sleeping;
if(Wakeup_Sleeping)
{
SysTick->CTRL |= (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);
//SystemClock_Config();
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_2) &&*/ LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_3)
&& LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_4) && LL_GPIO_IsInputPinSet(GPIOB, GPIO_PIN_5)
/*&& LL_GPIO_IsInputPinSet(GPIOE, GPIO_PIN_6)*/)
{
printf("\nWakeup by DISTURB2 ...\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;
g_KeyVal = KEY_INVALID;
// if(pe2 != 0)
// {
// printf("\n----------- Key pe2 pressed -----------\n");
// g_KeyVal = KEY_UP;
// }
// else
if(pe3 == 0)
{
//printf("\n----------- Key pe3 pressed -----------\n");
g_KeyVal = KEY_UP;
}
else if(pe4 == 0)
{
//printf("\n----------- Key pe4 pressed -----------\n");
g_KeyVal = KEY_FUNC;
}
else if(pe5 == 0)
{
//printf("\n----------- Key pe5 pressed -----------\n");
//g_KeyVal = KEY_DOWN;
g_KeyVal = KEY_SET;
}
/*
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);
}
}