power_key.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "power_key.h"
  2. #include "tasks.h"
  3. Power_KeyStatus_Struct_t Power_KeyStatus = Power_KeyStatus_Init;
  4. uint32_t Power_KeyCheck_TimeDelay = 0;
  5. void Power_Key_Init(void)
  6. {
  7. GPIO_InitTypeDef GPIO_InitStruct;
  8. __HAL_RCC_GPIOA_CLK_ENABLE();
  9. __HAL_RCC_GPIOB_CLK_ENABLE();
  10. //Key PA6
  11. GPIO_InitStruct.Pin = GPIO_PIN_6;
  12. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  13. GPIO_InitStruct.Pull = GPIO_PULLUP;
  14. HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  15. //Lock PB7
  16. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);
  17. GPIO_InitStruct.Pin = GPIO_PIN_7;
  18. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  19. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  20. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  21. }
  22. void Power_OnOff_Process(void)
  23. {
  24. switch(Power_KeyStatus)
  25. {
  26. case Power_KeyStatus_Init: //初始状态,检测到按键按下进入OnCheck
  27. {
  28. if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET)
  29. {
  30. Power_KeyCheck_TimeDelay = HAL_GetTick();
  31. Power_KeyStatus = Power_KeyStatus_OnCheck;
  32. }
  33. break;
  34. }
  35. case Power_KeyStatus_OnCheck: //OnCheck状态检测按下时间,到达延时且按键松开进入OnEnd
  36. {
  37. if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_ON_TIME)
  38. {
  39. Power_KeyStatus = Power_KeyStatus_OnEnd;
  40. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);
  41. }
  42. break;
  43. }
  44. case Power_KeyStatus_OnEnd: //OnEnd状态检测到按键再次按下,进入OffCheck
  45. {
  46. if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_RESET)
  47. {
  48. Power_KeyCheck_TimeDelay = HAL_GetTick();
  49. Power_KeyStatus = Power_KeyStatus_OffCheck;
  50. }
  51. break;
  52. }
  53. case Power_KeyStatus_OffCheck: //OffCheck状态检测按下时间,到达延时进入Off
  54. {
  55. if((HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_6) == GPIO_PIN_SET) && (HAL_GetTick() - Power_KeyCheck_TimeDelay) > POWER_OFF_TIME)
  56. {
  57. Power_KeyStatus = Power_KeyStatus_Off;
  58. }
  59. break;
  60. }
  61. case Power_KeyStatus_Off: //Off关闭自锁,喂狗,关闭所有中断,关闭驱动IO和灯控IO,等待按键松开
  62. {
  63. PowerOff_Process(1, FALSE);
  64. break;
  65. }
  66. default:break;
  67. }
  68. }