ZNY_Pakistan/Anjiehui7_ZNY/User/gpio_key.c

205 lines
5.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "includes.h"
volatile uint8_t Key_Wakeup = 0; // 是否按键唤醒
// 485串口接收的循环缓冲
#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串口接收的信号量
SemaphoreHandle_t Key_Semaphore = NULL; // 二值信号量句柄
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()
{
// 分配循环缓冲
LoopBuff_Create(&Key_TaskM, sizeof(uint8_t), KEY_TASKM_DATA_COUNT, 0, (uint32_t) Key_TaskM_Data);
// 创建信号量
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);
}
// 处理按键
void Key_Handler(void)
{
static uint32_t key_tick = 0;
uint32_t tick = GetTickCount();
uint8_t g_KeyVal = KEY_INVALID;
BaseType_t xHigherPriorityTaskWoken;
// 保存键值
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) // 睡眠模式
{
Watchdog_Feed(); // 喂狗
if(pe3 == 0 && pe6 == 0) // 同时按功能键和充装键,复位
NVIC_SystemReset();
return;
}
// 记录是否按键唤醒
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;
// 判断是否为低电平,排除干扰
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");
// 由干扰引起的按键中断,发信号休眠
return;
}
printf("\n\nWake up by KEY.\n\n");
// 采集数据
Sample_NotifyFromISR();
}
// 防抖动300ms以内的连续按键丢弃
if((tick >= key_tick && tick - key_tick < 300) || (tick < key_tick && 0xFFFFFFFFul - key_tick + 1 + tick < 300))
return;
// 同时按功能键和充装键,复位
if(pe3 == 0 && pe6 == 0)
{
// 复位
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();
// 重新计算时间
Form_ResetTimer();
// 不允许休眠
LCD_Disabled = 0;
// 加入缓冲
LoopBuff_PutItem(&Key_TaskM, &g_KeyVal);
// 发送消息给任务
xSemaphoreGiveFromISR(Key_Semaphore, &xHigherPriorityTaskWoken);
}
}