#include "main.h" #include //定义布尔 #include "board.h" /*********************************************************************************************************************** * =====================================================函数声明====================================================== * ***********************************************************************************************************************/ void onkey(zkey_t *key, zkey_state_t key_state); /*********************************************************************************************************************** * =====================================================全局变量====================================================== * ***********************************************************************************************************************/ static zkey_t s_keys[] = { ZKEY_INIT("timerkey", port_gpio_get_timer_key_state), ZKEY_INIT("gearskey", port_gpio_get_gears_key_state), ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state), ZKEY_INIT("switchkey", port_gpio_get_switch_key_state), }; zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey); /*********************************************************************************************************************** * =====================================================全局状态====================================================== * ***********************************************************************************************************************/ static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位 // 设置 bool g_setting_interval_work_flag = false; //现在的档位 WORK_LEVEL_T g_setting_level = WORK_LEVEL_LOW; //关机前的档位 //标志位 bool g_power_flag = false; //开关机标志位 static int g_error_num; bool g_auto_shutdown_flag = false; //定时功能使能标志位 static uint32_t g_auto_shutdown_countdown_s; //定时时间 //其他 static bool pwm_modble_enable_falg; //硬件pwm使能标志位 /*********************************************************************************************************************** * =======================================================HOOK======================================================== * ***********************************************************************************************************************/ void HOOK_pwm_module_set_pwm_duty(uint32_t frequency, uint32_t duty) { set_pwm_modbul_freq_duty(frequency, duty); port_fan_set(true); //打开风扇 pwm_modble_enable_falg = true; printf("work\r\n"); } void HOOK_pwm_stop(void) { set_pwm_modbul_freq_duty(1, 0); //关闭PWM输出 port_fan_set(false); //风扇结束工作 pwm_modble_enable_falg = false; printf("rest\r\n"); } bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; } int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; } /*********************************************************************************************************************** * =================================================INTERNAL_FUNCTION================================================= * ***********************************************************************************************************************/ /** * @brief 根据档位设置pwm输出,rgb的颜色 * * @param gears */ void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) { printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level); rgb_light_mode_t lightmode; int duty = 0; if (level == WORK_LEVEL_CLOSE) { duty = 0; lightmode = RGB_CLOSE; } else if (level == WORK_LEVEL_LOW) { duty = 25; lightmode = RGB_COLOR_GERRN; } else if (level == WORK_LEVEL_MIDDLE) { duty = 50; lightmode = RGB_COLOR_BLUE; } else if (level == WORK_LEVEL_HIGHT) { duty = 100; lightmode = RGB_COLOR_RED; } if (interval_work) { ozone_pwm_control_module_set_pwm_output_2(1, 0, INTERVAL_WORK_DUTY, INTERVAL_WORK_PERIOD_MS); } else { set_pwm_modbul_freq_duty(1, duty); } light_module_set_rgb_mode(lightmode); light_module_set_rgb_flicker_mode(interval_work); } /** * @brief 关机 */ void shutdown(void) { printf("shutdown\n"); g_power_flag = false; g_error_num = 0; g_auto_shutdown_flag = false; g_auto_shutdown_countdown_s = 0; update_ozone_work_level(false, WORK_LEVEL_CLOSE); port_fan_set(false); //关闭风扇 light_module_close_all_light(); } /*********************************************************************************************************************** * ======================================================看门狗======================================================= * ***********************************************************************************************************************/ void iwdt_init(void) { /** * @brief 看门狗介绍:当计数到0时,窗口计数器+1 * 当窗口计数为“2”的时候,产生中断 * 当窗口计数器为“4”的之前没有进行喂狗操作,产生复位 */ IWDT_InitStruType x; x.WDT_Tms = 4000; x.WDT_IE = Enable; /* IWDT中断使能 */ x.WDT_Rst = Enable; /* IWDT复位使能 */ x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */ IWDT_Init(&x); /* 使能IWDT */ IWDT_Enable(); } void feed_iwdt(void) { //喂狗 if (0x01 == IWDT_GetFlagStatus()) { IWDT_Clear(); // printf("喂狗\r\n"); } } void onkey(zkey_t *key, zkey_state_t key_state) { if (key->hasProcessed) return; /** * @brief 关机时,只处理电源按键 */ if (!g_power_flag) { if (key == &s_keys[3] && key->cur_state == zks_falling_edge) { key->hasProcessed = true; printf("key zks_rising_edge\r\n"); /** * @brief 开机 * 1.设置标志位 * 2.打开风扇 * 3.打开臭氧并打开相应的指示灯 */ g_power_flag = true; //开关机标志位 g_error_num = 0; g_auto_shutdown_flag = false; //定时功能使能标志位 g_auto_shutdown_countdown_s = 0; //定时时间 port_fan_set(true); //打开你风扇 update_ozone_work_level(g_setting_interval_work_flag, g_setting_level); } return; } /** * @brief 发生异常时,除了电源按键外,所有按键失效。 */ if (g_error_num != 0) { //设备存在异常 if (key == &s_keys[3] && key->cur_state == zks_falling_edge) { key->hasProcessed = true; printf("process key[2] event\r\n"); /** * @brief 关机 */ shutdown(); } return; } if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s { printf("process key[0] event\r\n"); /** * @brief 处理定时按键事件 */ if (!g_auto_shutdown_flag) { g_auto_shutdown_flag = true; g_auto_shutdown_countdown_s = 0; } g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S; } else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) { /** * @brief 处理等级按键 */ printf("process key[1] event\r\n"); if (g_setting_level == WORK_LEVEL_HIGHT) { update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_LOW); } else if (g_setting_level == WORK_LEVEL_MIDDLE) { update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_HIGHT); } else if (g_setting_level == WORK_LEVEL_LOW) { update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_MIDDLE); } } else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) { printf("process key[2] event\r\n"); /** * @brief 处理间歇按键事件 */ g_setting_interval_work_flag = !g_setting_interval_work_flag; update_ozone_work_level(g_setting_interval_work_flag, g_setting_level); } else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) { printf("process key[2] event\r\n"); /** * @brief 关机 */ shutdown(); } } /*********************************************************************************************************************** * ======================================================主函数======================================================= ***********************************************************************************************************************/ int main(void) { HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC SystemInit(); DeviceClockAllEnable(); //打开所有外设时钟 User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断) SysTick_Enable(); //硬件初始化 unused_gpio_init(); gpio_init(); uart0_init(); t16_pa4_init(); //模块初始化 zkey_init(&key_module); //上电默认关机 shutdown(); //启动结束 printf("Initialization completed\r\n"); while (true) { /******************************************************************************************************************* * ==================================================调试指示灯=================================================== * *******************************************************************************************************************/ port_do_debug_light_state(); /*********************************************************************************************************************** * =================================================按键模块调度代码================================================== * ***********************************************************************************************************************/ { static uint32_t keylastprocess = 0; if (port_haspassedms(keylastprocess) > KEY_PERIOD) { keylastprocess = get_sys_ticket(); zkey_do_loop_in_each_period(NULL); } } /*********************************************************************************************************************** * ===============================================灯光控制模块调度代码================================================ * ***********************************************************************************************************************/ light_module_schedule(); /*********************************************************************************************************************** * ===============================================臭氧控制模块调度代码================================================ * ***********************************************************************************************************************/ ozone_pwm_control_module_loop(); /*********************************************************************************************************************** * ===================================================自动关机逻辑==================================================== * ***********************************************************************************************************************/ // if (g_power_flag && g_auto_shutdown_flag) { static uint32_t ticket = 0; ticket = get_sys_ticket(); // if (port_haspassedms(ticket) > 1000) { ticket = get_sys_ticket(); if (g_auto_shutdown_countdown_s > 0) { g_auto_shutdown_countdown_s -= 1; } else { g_auto_shutdown_flag = false; /** * @brief 触发定时关机 */ shutdown(); } } // } /*********************************************************************************************************************** * ===================================================定时指示灯显示逻辑==================================================== ***********************************************************************************************************************/ updae_timing_light_state(); /*********************************************************************************************************************** * ===================================================异常监控逻辑==================================================== ***********************************************************************************************************************/ { static uint32_t ticket = 0; if (port_haspassedms(ticket) > EXCEPTION_CHECK_PERIOD) { ticket = get_sys_ticket(); /** * @brief * 这里检测ADC的数值是否超出规定范围 */ if (false) { } } } // End.................................. } }