#include "power_key.h" #include "tasks.h" Power_KeyStatus_Struct_t Power_KeyStatus = Power_KeyStatus_Init; uint32_t Power_KeyCheck_TimeDelay = 0; void Power_Key_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); //Key PA6 GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); //Lock PB7 HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET); GPIO_InitStruct.Pin = GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } void Power_OnOff_Process(void) { switch(Power_KeyStatus) { case Power_KeyStatus_Init: //初始状态,检测到按键按下进入OnCheck { if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET) { Power_KeyCheck_TimeDelay = HAL_GetTick(); Power_KeyStatus = Power_KeyStatus_OnCheck; } break; } case Power_KeyStatus_OnCheck: //OnCheck状态检测按下时间,到达延时且按键松开进入OnEnd { if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_ON_TIME) { Power_KeyStatus = Power_KeyStatus_OnEnd; HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET); } break; } case Power_KeyStatus_OnEnd: //OnEnd状态检测到按键再次按下,进入OffCheck { if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET) { Power_KeyCheck_TimeDelay = HAL_GetTick(); Power_KeyStatus = Power_KeyStatus_OffCheck; } break; } case Power_KeyStatus_OffCheck: //OffCheck状态检测按下时间,到达延时进入Off { if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_OFF_TIME) { Power_KeyStatus = Power_KeyStatus_Off; } break; } case Power_KeyStatus_Off: //Off关闭自锁,喂狗,关闭所有中断,关闭驱动IO和灯控IO,等待按键松开 { PowerOff_Process(1, FALSE); break; } default:break; } }