//////////////////////////////////////////////////////////////////////////////// /// @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. /// ///

© COPYRIGHT MINDMOTION

//////////////////////////////////////////////////////////////////////////////// // 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(); //} /// @} /// @} /// @}