452 lines
12 KiB
C
452 lines
12 KiB
C
////////////////////////////////////////////////////////////////////////////////
|
|
/// @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>© 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();
|
|
//}
|
|
|
|
/// @}
|
|
|
|
/// @}
|
|
|
|
/// @}
|