|
|
@ -1,16 +1,16 @@ |
|
|
|
#include "main.h" |
|
|
|
|
|
|
|
#include <stdbool.h> //定义布尔 |
|
|
|
#include <stdbool.h> //瀹氫箟甯冨皵 |
|
|
|
|
|
|
|
#include "board.h" |
|
|
|
|
|
|
|
#define PWM_FREQHZ 25000 //硬件pwm频率 |
|
|
|
#define PWM_FREQHZ 25000 //纭�欢pwm棰戠巼 |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* =====================================================函数声明====================================================== * |
|
|
|
* =====================================================鍑芥暟澹版槑====================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
void onkey(zkey_t *key, zkey_state_t key_state); |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* =====================================================全局变量====================================================== * |
|
|
|
* =====================================================鍏ㄥ眬鍙橀噺====================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
|
|
|
|
static zkey_t s_keys[] = { |
|
|
@ -22,22 +22,22 @@ static zkey_t s_keys[] = { |
|
|
|
zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey); |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* =====================================================全局状态====================================================== * |
|
|
|
* =====================================================鍏ㄥ眬鐘舵€�====================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位 |
|
|
|
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_setting_interval_work_flag = false; //鐜板湪鐨勬。浣� |
|
|
|
WORK_LEVEL_T g_setting_level = WORK_LEVEL_LOW; //鍏虫満鍓嶇殑妗d綅 |
|
|
|
|
|
|
|
//标志位 |
|
|
|
bool g_power_flag = false; //开关机标志位 |
|
|
|
//鏍囧織浣� |
|
|
|
bool g_power_flag = false; //寮€鍏虫満鏍囧織浣� |
|
|
|
static int g_error_num; |
|
|
|
bool g_auto_shutdown_flag = false; //定时功能使能标志位 |
|
|
|
static uint32_t g_auto_shutdown_countdown_s; //定时时间 |
|
|
|
bool g_auto_shutdown_flag = false; //瀹氭椂鍔熻兘浣胯兘鏍囧織浣� |
|
|
|
static uint32_t g_auto_shutdown_countdown_s; //瀹氭椂鏃堕棿 |
|
|
|
|
|
|
|
//其他 |
|
|
|
static bool pwm_modble_enable_falg; //硬件pwm使能标志位 |
|
|
|
//鍏朵粬 |
|
|
|
static bool pwm_modble_enable_falg; //纭�欢pwm浣胯兘鏍囧織浣� |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* =======================================================HOOK======================================================== * |
|
|
@ -47,7 +47,7 @@ void HOOK_pwm_module_set_pwm_duty(uint32_t frequencyhz, uint32_t duty) { |
|
|
|
pwm_modble_enable_falg = true; |
|
|
|
} |
|
|
|
void HOOK_pwm_stop(void) { |
|
|
|
set_pwm_modbul_freq_duty(PWM_FREQHZ, 0); //关闭PWM输出 |
|
|
|
set_pwm_modbul_freq_duty(PWM_FREQHZ, 0); //鍏抽棴PWM杈撳嚭 |
|
|
|
pwm_modble_enable_falg = false; |
|
|
|
} |
|
|
|
bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; } |
|
|
@ -57,7 +57,7 @@ int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; } |
|
|
|
* =================================================INTERNAL_FUNCTION================================================= * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
/** |
|
|
|
* @brief 根据档位设置pwm输出,rgb的颜色 |
|
|
|
* @brief 鏍规嵁妗d綅璁剧疆pwm杈撳嚭锛宺gb鐨勯�鑹� |
|
|
|
* |
|
|
|
* @param gears |
|
|
|
*/ |
|
|
@ -90,7 +90,7 @@ void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @brief 关机 |
|
|
|
* @brief 鍏虫満 |
|
|
|
*/ |
|
|
|
void shutdown(void) { |
|
|
|
printf("shutdown\n"); |
|
|
@ -101,83 +101,83 @@ void shutdown(void) { |
|
|
|
|
|
|
|
update_ozone_work_level(false, WORK_LEVEL_CLOSE); |
|
|
|
|
|
|
|
port_fan_set(false); //关闭风扇 |
|
|
|
port_fan_set(false); //鍏抽棴椋庢墖 |
|
|
|
light_module_close_all_light(); |
|
|
|
} |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ======================================================看门狗======================================================= * |
|
|
|
* ======================================================鐪嬮棬鐙�======================================================= * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
void iwdt_init(void) { |
|
|
|
/** |
|
|
|
* @brief 看门狗介绍:当计数到0时,窗口计数器+1 |
|
|
|
* 当窗口计数为“2”的时候,产生中断 |
|
|
|
* 当窗口计数器为“4”的之前没有进行喂狗操作,产生复位 |
|
|
|
* @brief 鐪嬮棬鐙椾粙缁嶏細褰撹�鏁板埌0鏃讹紝绐楀彛璁℃暟鍣�+1 |
|
|
|
* 褰撶獥鍙h�鏁颁负鈥�2鈥濈殑鏃跺€欙紝浜х敓涓�柇 |
|
|
|
* 褰撶獥鍙h�鏁板櫒涓衡€�4鈥濈殑涔嬪墠娌℃湁杩涜�鍠傜嫍鎿嶄綔锛屼骇鐢熷�浣� |
|
|
|
*/ |
|
|
|
IWDT_InitStruType x; |
|
|
|
|
|
|
|
x.WDT_Tms = 4000; |
|
|
|
x.WDT_IE = Enable; /* IWDT中断使能 */ |
|
|
|
x.WDT_Rst = Enable; /* IWDT复位使能 */ |
|
|
|
x.WDT_IE = Enable; /* IWDT涓�柇浣胯兘 */ |
|
|
|
x.WDT_Rst = Enable; /* IWDT澶嶄綅浣胯兘 */ |
|
|
|
x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */ |
|
|
|
IWDT_Init(&x); |
|
|
|
/* 使能IWDT */ |
|
|
|
/* 浣胯兘IWDT */ |
|
|
|
IWDT_Enable(); |
|
|
|
} |
|
|
|
void feed_iwdt(void) { |
|
|
|
//喂狗 |
|
|
|
//鍠傜嫍 |
|
|
|
if (0x01 == IWDT_GetFlagStatus()) { |
|
|
|
IWDT_Clear(); |
|
|
|
// printf("喂狗\r\n"); |
|
|
|
// printf("鍠傜嫍\r\n"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void onkey(zkey_t *key, zkey_state_t key_state) { |
|
|
|
if (key->hasProcessed) return; |
|
|
|
/** |
|
|
|
* @brief 关机时,只处理电源按键 |
|
|
|
* @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.打开臭氧并打开相应的指示灯 |
|
|
|
* @brief 寮€鏈� |
|
|
|
* 1.璁剧疆鏍囧織浣� |
|
|
|
* 2.鎵撳紑椋庢墖 |
|
|
|
* 3.鎵撳紑鑷�哀骞舵墦寮€鐩稿簲鐨勬寚绀虹伅 |
|
|
|
*/ |
|
|
|
|
|
|
|
g_power_flag = true; //开关机标志位 |
|
|
|
g_power_flag = true; //寮€鍏虫満鏍囧織浣� |
|
|
|
g_error_num = 0; |
|
|
|
g_auto_shutdown_flag = false; //定时功能使能标志位 |
|
|
|
g_auto_shutdown_countdown_s = 0; //定时时间 |
|
|
|
g_auto_shutdown_flag = false; //瀹氭椂鍔熻兘浣胯兘鏍囧織浣� |
|
|
|
g_auto_shutdown_countdown_s = 0; //瀹氭椂鏃堕棿 |
|
|
|
|
|
|
|
port_fan_set(true); //打开你风扇 |
|
|
|
port_fan_set(true); //鎵撳紑浣犻�鎵� |
|
|
|
update_ozone_work_level(g_setting_interval_work_flag, g_setting_level); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* @brief 发生异常时,除了电源按键外,所有按键失效。 |
|
|
|
* @brief 鍙戠敓寮傚父鏃讹紝闄や簡鐢垫簮鎸夐敭澶栵紝鎵€鏈夋寜閿�け鏁堛€� |
|
|
|
*/ |
|
|
|
if (g_error_num != 0) { //设备存在异常 |
|
|
|
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 关机 |
|
|
|
* @brief 鍏虫満 |
|
|
|
*/ |
|
|
|
shutdown(); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s |
|
|
|
if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //灏忎簬3s |
|
|
|
{ |
|
|
|
printf("process key[0] event\r\n"); |
|
|
|
/** |
|
|
|
* @brief 处理定时按键事件 |
|
|
|
* @brief 澶勭悊瀹氭椂鎸夐敭浜嬩欢 |
|
|
|
*/ |
|
|
|
if (!g_auto_shutdown_flag) { |
|
|
|
g_auto_shutdown_flag = true; |
|
|
@ -193,7 +193,7 @@ void onkey(zkey_t *key, zkey_state_t key_state) { |
|
|
|
|
|
|
|
} else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) { |
|
|
|
/** |
|
|
|
* @brief 处理等级按键 |
|
|
|
* @brief 澶勭悊绛夌骇鎸夐敭 |
|
|
|
*/ |
|
|
|
printf("process key[1] event\r\n"); |
|
|
|
if (g_setting_level == WORK_LEVEL_HIGHT) { |
|
|
@ -209,14 +209,14 @@ void onkey(zkey_t *key, zkey_state_t key_state) { |
|
|
|
} else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) { |
|
|
|
printf("process key[2] event\r\n"); |
|
|
|
/** |
|
|
|
* @brief 处理间歇按键事件 |
|
|
|
* @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 关机 |
|
|
|
* @brief 鍏虫満 |
|
|
|
*/ |
|
|
|
shutdown(); |
|
|
|
} |
|
|
@ -232,36 +232,36 @@ void onkey(zkey_t *key, zkey_state_t key_state) { |
|
|
|
} \ |
|
|
|
} |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ======================================================主函数======================================================= |
|
|
|
* ======================================================涓诲嚱鏁�======================================================= |
|
|
|
***********************************************************************************************************************/ |
|
|
|
int main(void) { |
|
|
|
HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC |
|
|
|
HRC_Config(Enable, SCU_HRC_48M, Enable); //鏃堕挓婧怱CU_CLK_HRC |
|
|
|
SystemInit(); |
|
|
|
DeviceClockAllEnable(); //打开所有外设时钟 |
|
|
|
User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断) |
|
|
|
DeviceClockAllEnable(); //鎵撳紑鎵€鏈夊�璁炬椂閽� |
|
|
|
User_SysTickInit(); //婊寸瓟瀹氭椂鍣ㄥ垵濮嬪寲涓�(閰嶇疆涓�1ms涓�柇) |
|
|
|
SysTick_Enable(); |
|
|
|
//硬件初始化 |
|
|
|
//纭�欢鍒濆�鍖� |
|
|
|
unused_gpio_init(); |
|
|
|
gpio_init(); |
|
|
|
uart0_init(); |
|
|
|
|
|
|
|
//模块初始化 |
|
|
|
//妯″潡鍒濆�鍖� |
|
|
|
zkey_init(&key_module); |
|
|
|
|
|
|
|
//上电默认关机 |
|
|
|
//涓婄數榛樿�鍏虫満 |
|
|
|
shutdown(); |
|
|
|
|
|
|
|
//启动结束 |
|
|
|
//鍚�姩缁撴潫 |
|
|
|
printf("Initialization completed\r\n"); |
|
|
|
|
|
|
|
//测试 |
|
|
|
//娴嬭瘯 |
|
|
|
// set_pwm_modbul_freq_duty(25000, 10); |
|
|
|
// while (1) { |
|
|
|
// } |
|
|
|
|
|
|
|
while (true) { |
|
|
|
/******************************************************************************************************************* |
|
|
|
* ==================================================调试指示灯=================================================== * |
|
|
|
* ==================================================璋冭瘯鎸囩ず鐏�=================================================== * |
|
|
|
*******************************************************************************************************************/ |
|
|
|
DO_IT_EACH_MS(200) { |
|
|
|
static uint8_t debug_led_state = 1; |
|
|
@ -270,22 +270,22 @@ int main(void) { |
|
|
|
} |
|
|
|
END() |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* =================================================按键模块调度代码================================================== * |
|
|
|
* =================================================鎸夐敭妯″潡璋冨害浠g爜================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); } |
|
|
|
END(); |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ===============================================灯光控制模块调度代码================================================ * |
|
|
|
* ===============================================鐏�厜鎺у埗妯″潡璋冨害浠g爜================================================ * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
light_module_schedule(); |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ===============================================臭氧控制模块调度代码================================================ * |
|
|
|
* ===============================================鑷�哀鎺у埗妯″潡璋冨害浠g爜================================================ * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
ozone_pwm_control_module_loop(); |
|
|
|
|
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ===================================================自动关机逻辑==================================================== * |
|
|
|
* ===================================================鑷�姩鍏虫満閫昏緫==================================================== * |
|
|
|
***********************************************************************************************************************/ |
|
|
|
// |
|
|
|
DO_IT_EACH_MS(1000) { |
|
|
@ -296,7 +296,7 @@ int main(void) { |
|
|
|
} else { |
|
|
|
g_auto_shutdown_flag = false; |
|
|
|
/** |
|
|
|
* @brief 触发定时关机 |
|
|
|
* @brief 瑙﹀彂瀹氭椂鍏虫満 |
|
|
|
*/ |
|
|
|
shutdown(); |
|
|
|
} |
|
|
@ -304,12 +304,12 @@ int main(void) { |
|
|
|
} |
|
|
|
END(); |
|
|
|
/*********************************************************************************************************************** |
|
|
|
* ===================================================异常监控逻辑==================================================== |
|
|
|
* ===================================================寮傚父鐩戞帶閫昏緫==================================================== |
|
|
|
***********************************************************************************************************************/ |
|
|
|
DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) { |
|
|
|
/** |
|
|
|
* @brief |
|
|
|
* 这里检测ADC的数值是否超出规定范围 |
|
|
|
* 杩欓噷妫€娴婣DC鐨勬暟鍊兼槸鍚﹁秴鍑鸿�瀹氳寖鍥� |
|
|
|
*/ |
|
|
|
if (false) { |
|
|
|
} |
|
|
|