TJ-WW03-H03/APP_smoke_N_V1.3/HARDWARE/KEY/key.c

452 lines
12 KiB
C
Raw Permalink Normal View History

2024-07-29 10:32:25 +08:00
////////////////////////////////////////////////////////////////////////////////
/// @file key.c
/// @author AE TEAM
/// @brief key intput.
////////////////////////////////////////////////////////////////////////////////
/// @attention
///
/// THE EXISTING FIRMWARE IS ONLY FOR REFERENCE, WHICH IS DESIGNED TO PROVIDE
/// CUSTOMERS WITH CODING INFORMATION ABOUT THEIR PRODUCTS SO THEY CAN SAVE
/// TIME. THEREFORE, MINDMOTION SHALL NOT BE LIABLE FOR ANY DIRECT, INDIRECT OR
/// CONSEQUENTIAL DAMAGES ABOUT ANY CLAIMS ARISING OUT OF THE CONTENT OF SUCH
/// HARDWARE AND/OR THE USE OF THE CODING INFORMATION CONTAINED HEREIN IN
/// CONNECTION WITH PRODUCTS MADE BY CUSTOMERS.
///
/// <H2><CENTER>&COPY; COPYRIGHT MINDMOTION </CENTER></H2>
////////////////////////////////////////////////////////////////////////////////
// Define to prevent recursive inclusion
#define _KEY_C_
#include "main.h"
// Files includes
#include "key.h"
// #include "delay.h"
#include "public.h"
#include "tim3_pwm_output.h"
#include "sim_eeprom.h"
#include "adc_dma_multichanit.h"
void SystemInit(void);
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup MM32_Hardware_Abstract_Layer
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup KEY
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @addtogroup KEY_Exported_Functions
/// @{
////////////////////////////////////////////////////////////////////////////////
/// @brief Keyboard Scanning
/// @note None.
/// @param None.
/// @retval Keyboard value.
////////////////////////////////////////////////////////////////////////////////
// unsigned char have_key ;
unsigned char have_key;//__attribute__((at(0x200000C4)));
u8 key_long_flag = 0;
u8 KEY_Scan()
{
//printf("\nKEY1:%d\n",KEY1);
if (KEY1 == 0)
{
if (g_work.key_down == 0)
{
//待机模式下 按下按键 需要显示点亮
if (g_work.power == 1 && g_work.work_conditon == STANDY) // 开机的情况下每一次按键 睡眠时间重新计时
{
//g_work.m_time._Sleep_time = 0; // 每一次按键 重新计时休眠
have_key++;
//printf(" %p %d\r\n",&have_key,have_key);
if (have_key >= 5) // 超过5次 上锁 2023年7月11日16:49:25 客户需要暂时屏蔽上锁机制
{
have_key = 0;
//g_work.key_down_times = 0;
if (g_work.m_conditon.m_conditon.lock == 0)
{
g_work.m_time._Sleep_time = 1500;
g_work.m_work_flag._beep_flag = 1;
g_work.m_conditon.m_conditon.lock = 1;
}
else
{
g_work.m_work_flag._beep_flag = 2;
g_work.m_time._Sleep_time = 0;
g_work.m_conditon.m_conditon.lock = 0;
}
Write_condtion();
}
else if (have_key <= 2)
{
if (g_work.m_time._Sleep_time > 2000) //点亮电量指示灯 2s
g_work.m_time._Sleep_time = 0;
}
}
if (g_work.work_conditon == STANDY)
{
if (g_work.m_time._full_stop_led_time >= 30000)
{
if (g_work.m_conditon.m_conditon.lock == 0)
{
g_work.m_time._full_stop_led_time = 28000;
g_work.m_time._Sleep_time = 0;
}
else
{
if (have_key <= 2)
{
g_work.m_time._Sleep_time = 0;
}
}
}
}
g_work.key_down = 1;
}
if (key_long_flag == 0)
{
key_long_flag = 1;
g_work.key_value = 1;
}
}
else
{
key_long_flag = 0;
g_work.key_value = 0;
g_work.key_down = 0;
}
if (g_work.m_time._key_down_time > 1000)
{
g_work.m_time._key_down_time = 0;
g_work.key_value = 0;
if (g_work.work_conditon == STANDY)
{
if (g_work.m_conditon.m_conditon.V_conditon < 3 && g_work.m_conditon.m_conditon.lock == 0) // 电池电量充足 开锁状态
{
if (g_work.m_work_flag.zero_T_flag == 0) // 下降到保护温度 和 没有零度保护
{
if (g_work.power == 1)
{
g_work.work_conditon = ORDER_HOT;
g_work.m_time._Sleep_time = 0;
g_work.m_work_flag._beep_flag = 1; // 短鸣
// printf("V:%d \r\n",g_work.v_value);
}
}
else
{
// printf("err!!\r\n");
if (g_work.err_fault == NO_WARING)
{
g_work.err_fault = LOW_T_ERR;
g_work.m_time._Sleep_time = 0;
}
}
}
}
else
{
//printf("off!!\r\n");
g_work.m_time._Sleep_time = 0;
g_work.power = 0;
}
// if( g_work.work_conditon == STANDY )
// {
//// OPEN_ON();
//
// if( g_work.m_conditon.m_conditon.V_conditon < 3 && g_work.m_conditon.m_conditon.lock == 0 )
// {
//
// if( g_work.temp_1 < PROTECT_TEMP && g_work.m_work_flag.zero_T_flag == 0)
// {
// if( g_work.power == 1 )
// {
// g_work.work_conditon = ORDER_HOT;
// g_work.m_time._Sleep_time = 0;
// //printf("V:%d \r\n",g_work.v_value);
// }
//
// }
// else
// {
// if( g_work.power == 1 )
// {
// g_work.m_time._Sleep_time = 0;
// }
//
//
// if( g_work.temp_1 >= PROTECT_TEMP )
// {
// if( ADCFilterValue[1] >4070 || ADCFilterValue[2] > 4070)
// {
// if( g_work.err_fault == NO_WARING )
// {
// g_work.m_time._Sleep_time = 0;
// g_work.err_fault = SHORT_ERR;
// }
//
//
//
// }
//
// if( ADCFilterValue[1] < 10 || ADCFilterValue[2] < 10)
// {
//
// if( g_work.err_fault == NO_WARING )
// {
// g_work.m_time._Sleep_time = 0;
// g_work.err_fault = OPEN_ERR;
// }
//
//
// }
//
// if( g_work.err_fault == NO_WARING )
// {
// g_work.err_fault = PRO_T_ERR;
// }
// }
// else
// {
// if( g_work.m_work_flag.zero_T_flag == 1 )
// {
// g_work.err_fault = LOW_T_ERR;
// }
// }
//
// }
//
// //g_work.work_conditon = ORDER_HOT;
//
// }
//
//// if( g_work.power == 1 )
//// {
//// g_work.m_time._Sleep_time = 0;
//// }
// }
// else
// {
//
// g_work.m_time._Sleep_time = 0;
// g_work.power = 0;
// }
}
WWDG_SetCounter(0x7e);
// printf("%d \r\n",g_work.m_time._Sleep_time);
return g_work.key_value;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief initialize KEY GPIO pin
/// @note if use jtag/swd interface GPIO PIN as KEY, need to be careful, can not debug or program.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = KEY1_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = STANDBY_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(STANDBY_GPIO_Port, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = V_5_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_FLOATING;
GPIO_Init(V_5_GPIO_Port, &GPIO_InitStruct);
}
void wake_io_init()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOB, ENABLE);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = KEY1_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);
GPIO_StructInit(&GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = V_5_Pin;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_FLOATING;
GPIO_Init(V_5_GPIO_Port, &GPIO_InitStruct);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief Enter standby mode.
/// @note None.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
static void PWR_Standby(void)
{
// PWR CLOCK
RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWR, ENABLE);
// RCC->APB2RSTR|=0X01FC;//REAST IO
// Enable to wake up pin function
PWR_WakeUpPinCmd(ENABLE);
// Enter standby mode
PWR_EnterSTANDBYMode();
}
void GPIO_AIN_Init()
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_StructInit(&GPIO_InitStruct);
RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA | RCC_AHBENR_GPIOB |
RCC_AHBENR_GPIOC | RCC_AHBENR_GPIOD,
ENABLE);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOB, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOD, &GPIO_InitStruct);
}
static void EXTI_NVIC_Init(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
// ENABLE External interrupt
NVIC_InitStruct.NVIC_IRQChannel = EXTI4_15_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPriority = 2;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
}
static void EXTI_Config(void)
{
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_StructInit(&EXTI_InitStruct);
// External interrupt Mode
SYSCFG_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource15); // 按键
// Interrupt threads where pins are located
EXTI_InitStruct.EXTI_Line = EXTI_Line15;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
// rising trigger
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
SYSCFG_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); // 5V充电
// Interrupt threads where pins are located
EXTI_InitStruct.EXTI_Line = EXTI_Line5;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
// rising trigger
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
////////////////////////////////////////////////////////////////////////////////
/// @brief External interrupt wake-up standby initialization
/// @note External Wake-up Pin Selection.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void WKUP_Init(void)
{
EXTI_NVIC_Init();
EXTI_Config();
wake_io_init();
// printf("14\r\n");
// Instead of booting, enter standby mode
// PWR_Standby();
}
////////////////////////////////////////////////////////////////////////////////
/// @brief initialize LED GPIO pin
/// @note if use jtag/swd interface GPIO PIN as LED, need to be careful,
/// can not debug or program.
/// @param None.
/// @retval None.
////////////////////////////////////////////////////////////////////////////////
void PWR_STANDBY_NRST_Init(void)
{
// s32 i;
// // GPIO_AIN_Init();
// WKUP_Init();
// Bat_T_OFF();
// ADC_Cmd(ADC1, DISABLE);
// ADC_DMACmd(ADC1, DISABLE);
// // UART_Cmd(UART1,DISABLE);
// // if( g_work.m_work_flag._sleep_flag == 0 )
// // {
// GPIO_AIN_Init();
// WKUP_Init();
// RCC_APB1PeriphClockCmd(RCC_APB1ENR_PWREN, ENABLE);
// PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);
// //}
// // PWR_Standby();
// // g_work.m_work_flag._sleep_flag = 1;
// SystemInit();
}
//void EXTI4_15_IRQHandler(void)
//{
// EXTI_ClearITPendingBit(EXTI_Line15 | EXTI_Line5);
// // g_work.power = 1;
// // if( g_work.m_work_flag._sleep_flag == 1 )
// // {
// // g_work.m_time._Sleep_time = 0;
// //
// //
// // printf("sleep_out\r\n");
// // all_init();
// // g_work.m_work_flag._sleep_flag = 0;
// // }
// // LED1_ON();
//}
/// @}
/// @}
/// @}