You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

501 lines
18 KiB

#include "main.h"
#include <stdbool.h> //定义布尔
#define TIMING_TICK 20000
#define INTERVAL_PERIOD 10000
/***********************************************************************************************************************
* =====================================================全局变量====================================================== *
***********************************************************************************************************************/
bool starting_up_state = false; //开关机标志位
bool timing_function_enable_falg = false; //定时功能使能标志位
static uint32_t s_timing_shutdown_begin_ticket = 0; //定时开始时,此时的系统时间
static uint32_t s_timing_time; //定时时间
static uint32_t s_interval_period = 0; //间歇功能的周期
static uint8_t s_now_interval_duty = 0; //间歇功能的占空比
static uint8_t s_intervalkey_press_count = 0; //间歇按键按下的次数
WORK_LEVEL_T now_level; //现在的档位
WORK_LEVEL_T shutdown_before_level; //关机前的档位
error_state_t error_state; //哪个错误事件
static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位
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; }
//####################### 间歇功能 ################################//
void process_intervalkey_press_even(void) {
s_intervalkey_press_count++;
if (s_intervalkey_press_count == 1) {
update_interval_period_duty(50);
} else {
update_interval_period_duty(100); // 调用update_interval_period_duty(100)后将s_intervalkey_press_count=0
}
}
/**
* @brief
*
*/
void update_interval_period_duty(uint8_t interval_duty) {
if (interval_duty == 100) { //占空比设置100一直工作
printf("duty 100\r\n");
s_interval_period = 0;
s_now_interval_duty = 100;
s_intervalkey_press_count = 0;
ozone_pwm_control_disable();
restore_the_mode_before_intermittent_work();
} else if (interval_duty == 50) {
printf("duty 50\r\n");
s_interval_period = INTERVAL_PERIOD;
s_now_interval_duty = 50;
ozone_pwm_control_enable();
}
ozone_pwm_control_module_set_pwm_output_1(s_interval_period, s_now_interval_duty);
}
/**
* @brief 恢复间歇工作前的工作档位
*
*/
void restore_the_mode_before_intermittent_work(void) {
if (now_level == WORK_LEVEL_LOW) {
light_module_set_rgb_mode(RGB_COLOR_GERRN);
set_pwm_modbul_freq_duty(1, 25);
port_fan_set(true); //打开风扇
} else if (now_level == WORK_LEVEL_MIDDLE) {
light_module_set_rgb_mode(RGB_COLOR_BLUE);
set_pwm_modbul_freq_duty(1, 50);
port_fan_set(true); //打开风扇
} else if (now_level == WORK_LEVEL_HIGHT) {
light_module_set_rgb_mode(RGB_COLOR_RED);
set_pwm_modbul_freq_duty(1, 100);
port_fan_set(true); //打开风扇
}
}
/**
* @brief 间歇功能开启时,rgb亮3s灭1s
*
*/
void process_rgb_flicker(void) {
static uint32_t rgb_ticket = 0;
static uint8_t rgb_ticket_count = 0;
if (port_haspassedms(rgb_ticket) > 1000) {
rgb_ticket = get_sys_ticket();
if (rgb_ticket_count < 3) {
if (now_level == WORK_LEVEL_LOW) {
light_module_set_rgb_mode(RGB_COLOR_GERRN);
} else if (now_level == WORK_LEVEL_MIDDLE) {
light_module_set_rgb_mode(RGB_COLOR_BLUE);
} else if (now_level == WORK_LEVEL_HIGHT) {
light_module_set_rgb_mode(RGB_COLOR_RED);
}
} else {
light_module_set_rgb_mode(RGB_CLOSE);
rgb_ticket_count = 0;
}
rgb_ticket_count++;
}
}
/***********************************************************************************************************************
* =======================================================按键======================================================== *
***********************************************************************************************************************/
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);
void onkey(zkey_t *key, zkey_state_t key_state) {
/**
* @brief 判断每个按键触发的状态
*
* @param key
* @param key_state
*/
if (starting_up_state) { //开机中
if (error_state.fan_error_status == false && error_state.way_circuit_error_status == false) { //设备无异常
if (key == &s_keys[0] && //定时按键
key->cur_state == zks_keep && //长按
!key->hasProcessed && //没有被处理过
key->keep_state_count >= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //按下持续时间大于3s
{
key->hasProcessed = true;
} else if (key == &s_keys[0] && //定时按键
key->cur_state == zks_falling_edge && //下降沿触发
!key->hasProcessed && key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) //小于3s
{
key->hasProcessed = true;
printf("key0 zks_falling_edge\r\n");
update_timing_time();
updae_led_light_mode();
} else if (key == &s_keys[1] && //高低档位选择
key->cur_state == zks_rising_edge && //
!key->hasProcessed && //
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
key->hasProcessed = true;
printf("key1 zks_rising_edge\r\n");
process_gearskey_press_even();
} else if (key == &s_keys[2] && //间歇功能设置选择
key->cur_state == zks_rising_edge && //
!key->hasProcessed && //
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
key->hasProcessed = true;
printf("key2 zks_rising_edge\r\n");
process_intervalkey_press_even();
} else if (key == &s_keys[3] && //开关按键
key->cur_state == zks_rising_edge && //
!key->hasProcessed && //
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
key->hasProcessed = true;
printf("key2 zks_rising_edge\r\n");
shutdown();
}
} else if (error_state.fan_error_status == true || error_state.way_circuit_error_status == true) { //设备存在异常
if (key == &s_keys[3] && //开关按键
key->cur_state == zks_rising_edge && //
!key->hasProcessed && //
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
key->hasProcessed = true;
printf("key2 zks_rising_edge\r\n");
shutdown();
}
}
} else { //关机中
if (key == &s_keys[3] && //开关按键
key->cur_state == zks_rising_edge && //
!key->hasProcessed && //
key->keep_state_count <= POWER_KEY_TRIGGER_TIME / KEY_SCAN_PERIOD) {
key->hasProcessed = true;
printf("key zks_rising_edge\r\n");
starting_up();
}
}
}
/**
* @brief 上电臭氧工作情况,设备中有开关机按键,所以外部上电后,不让设备工作
*
*/
void power_on_ozone_working_status(void) {
update_ozone_work_gears(WORK_LEVEL_CLOSE);
light_module_set_timing_light_mode(CLOSE_ALL_LED);
port_fan_set(false); //关闭风扇
}
//####################### 档位设置 #######################/
/**
* @brief 根据档位设置pwm输出,rgb的颜色
*
* @param gears
*/
void update_ozone_work_gears(WORK_LEVEL_T level) {
if (level == WORK_LEVEL_CLOSE) {
ozone_pwm_control_module_set_pwm_output_2(1, 0, s_interval_period, s_now_interval_duty);
light_module_set_rgb_mode(RGB_CLOSE);
} else if (level == WORK_LEVEL_LOW) {
ozone_pwm_control_module_set_pwm_output_2(1, 25, s_interval_period, s_now_interval_duty);
light_module_set_rgb_mode(RGB_COLOR_GERRN);
} else if (level == WORK_LEVEL_MIDDLE) {
ozone_pwm_control_module_set_pwm_output_2(1, 50, s_interval_period, s_now_interval_duty);
light_module_set_rgb_mode(RGB_COLOR_BLUE);
} else if (level == WORK_LEVEL_HIGHT) {
ozone_pwm_control_module_set_pwm_output_2(1, 100, s_interval_period, s_now_interval_duty);
light_module_set_rgb_mode(RGB_COLOR_RED);
}
now_level = level;
}
void process_gearskey_press_even(void) {
static uint8_t gearskey_press_count;
gearskey_press_count++;
if (gearskey_press_count == 1) {
update_ozone_work_gears(WORK_LEVEL_MIDDLE);
} else if (gearskey_press_count == 2) {
update_ozone_work_gears(WORK_LEVEL_LOW);
} else if (gearskey_press_count == 3) {
gearskey_press_count = 0;
update_ozone_work_gears(WORK_LEVEL_HIGHT);
}
}
//####################### 开机关机 #######################/
void shutdown(void) {
ozone_pwm_control_disable();
error_state.fan_error_status = false;
error_state.way_circuit_error_status = false;
s_intervalkey_press_count = 0;
shutdown_before_level = now_level;
starting_up_state = false;
update_ozone_work_gears(WORK_LEVEL_CLOSE);
light_module_set_timing_light_mode(CLOSE_ALL_LED);
port_fan_set(false); //关闭风扇
}
/**
* @brief 开机后,根据关机时的档位进行设置,如果关机时档位为关闭则设置为高档工作
*
*/
void starting_up(void) {
//开机没有间歇功能所以设置占空比为100
update_interval_period_duty(100);
//开机没有定时功能所以将 timing_function_enable_falg = false; s_timing_time = 0;
timing_function_enable_falg = false;
s_timing_time = 0;
starting_up_state = true;
if (shutdown_before_level == WORK_LEVEL_CLOSE) {
update_ozone_work_gears(WORK_LEVEL_HIGHT);
} else {
update_ozone_work_gears(shutdown_before_level);
}
port_fan_set(true); //打开你风扇
}
void process_switchkey(void) {
static bool switchkey_press_count = 0;
switchkey_press_count = !switchkey_press_count;
if (switchkey_press_count) { //开机
starting_up();
} else { //关机
shutdown();
}
}
//####################### 定时功能 #######################/
/**
* @brief 根据现在的时间进行更改
*
*/
void updae_led_light_mode(void) {
if ((s_timing_time / TIMING_TICK) == 0) {
light_module_set_timing_light_mode(CLOSE_ALL_LED);
} else if ((s_timing_time / TIMING_TICK) == 1) {
light_module_set_timing_light_mode(OPEN_ONE_LED);
} else if ((s_timing_time / TIMING_TICK) == 2) {
light_module_set_timing_light_mode(OPEN_TWO_LED);
} else if ((s_timing_time / TIMING_TICK) == 3) {
light_module_set_timing_light_mode(OPEN_THREE_LED);
} else if ((s_timing_time / TIMING_TICK) == 4) {
light_module_set_timing_light_mode(OPEN_FOUR_LED);
}
}
/**
* @brief 每次按键按下时间timing_time=timing_time+TIMING_TICK
* 当timing_time==timing_time = 4 * TIMING_TICK;
* timing_time = 0;
*
*/
void update_timing_time(void) {
s_timing_shutdown_begin_ticket = get_sys_ticket(); //更新定时关机开始的时间
update_begin_ticket(); //更新间歇开始的时间
timing_function_enable_falg = true; //使能定时功能
if (s_timing_time == 0) {
s_timing_time = 1 * TIMING_TICK;
} else if ((s_timing_time / TIMING_TICK) == 1) {
s_timing_time = 2 * TIMING_TICK;
} else if ((s_timing_time / TIMING_TICK) == 2) {
s_timing_time = 3 * TIMING_TICK;
} else if ((s_timing_time / TIMING_TICK) == 3) {
s_timing_time = 4 * TIMING_TICK;
} else if ((s_timing_time / TIMING_TICK) == 4) {
s_timing_time = 0 * TIMING_TICK;
timing_function_enable_falg = false;
update_interval_period_duty(100);
}
printf("timing time:%d\r\n", s_timing_time);
}
/**
* @brief 定时每过TIMING_TICK timing_time=timing_time-TIMING_TICK
* 当TIMING_TICK==0的时候关机
*
*/
void try_shutdown(void) {
if (port_haspassedms(s_timing_shutdown_begin_ticket) > TIMING_TICK) {
s_timing_shutdown_begin_ticket = get_sys_ticket();
printf("time minus %dms", TIMING_TICK);
s_timing_time -= TIMING_TICK;
updae_led_light_mode();
}
if (s_timing_time == 0) { //定时时间到
timing_function_enable_falg = false; //失能定时功能
shutdown();
}
}
bool timing_function_is_enable(void) { return timing_function_enable_falg; }
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 process_error_even(void) {
if (error_state.fan_error_status == false && error_state.way_circuit_error_status == false) { //没有错误
return;
} else {
if (!error_even_trigger_after_stop_ozone_work_state) {
error_even_trigger_after_stop_ozone_work_state = true;
set_pwm_modbul_freq_duty(1, 0);
light_module_set_rgb_mode(RGB_CLOSE);
light_module_set_timing_light_mode(CLOSE_ALL_LED);
port_fan_set(false); //关闭风扇
}
if (error_state.fan_error_status == true) { //电扇电压异常
static uint32_t error_even_fan_ticket = 0;
static uint8_t one_led_flicker_state = 1;
if (port_haspassedms(error_even_fan_ticket) > 500) {
error_even_fan_ticket = get_sys_ticket();
one_led_flicker_state = !one_led_flicker_state;
port_led0_set(one_led_flicker_state);
}
} else if (error_state.way_circuit_error_status == true) { //总电路电压异常
static uint32_t error_even_way_circuit = 0;
static uint8_t two_led_flicker_state = 1;
if (port_haspassedms(error_even_way_circuit) > 500) {
error_even_way_circuit = get_sys_ticket();
two_led_flicker_state = !two_led_flicker_state;
port_led0_set(two_led_flicker_state);
port_led1_set(two_led_flicker_state);
}
}
}
}
/***********************************************************************************************************************
* =======================================================测试========================================================
**
***********************************************************************************************************************/
void test(void) {
port_fan_set(false);
Delayms(10000);
port_fan_set(true);
printf("open\r\n");
Delayms(10000);
while (1) {
// unused_gpio_init();
// gpio_init();
// port_fan_set(false);
// printf("close\r\n");
// Delayms(30000);
// port_fan_set(true);
// printf("open\r\n");
// Delayms(10000);
}
error_state.way_circuit_error_status = true;
error_state.fan_error_status = true;
// while (1) {
// port_fan_set(true); //测试关闭风扇
// printf("open\r\n");
// Delayms(50000);
// port_fan_set(false); //测试关闭风扇
// printf("close\r\n");
// Delayms(50000);
// port_do_debug_light_state();
// printf("Initialization completed\r\n");
// }
// while (1) {
// port_do_debug_light_state();
// printf("Initialization completed\r\n");
// }
}
/**
* @brief 间歇功能使能后,rgb闪烁
*
*/
/***********************************************************************************************************************
* ======================================================主函数=======================================================
**
***********************************************************************************************************************/
int main(void) {
HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
SystemInit();
DeviceClockAllEnable(); //打开所有外设时钟
User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
SysTick_Enable();
// all_gpio_reset();
unused_gpio_init();
gpio_init();
uart0_init();
zkey_init(&key_module);
t16_pa4_init();
// iwdt_init();
power_on_ozone_working_status();
printf("Initialization completed\r\n");
//test();
while (true) {
port_do_debug_light_state();
// feed_iwdt();
static uint32_t keylastprocess = 0;
if (port_haspassedms(keylastprocess) > 20) {
keylastprocess = get_sys_ticket();
zkey_do_loop_in_each_period(NULL);
}
if (starting_up_state) { //开机中
port_do_debug_light_state();
process_error_even();
try_adc_gather();
if (timing_function_is_enable()) { //定时功能是开启的
try_shutdown();
}
if (ozone_pwm_control_is_enable() == true) {
ozone_pwm_control_module_loop();
process_rgb_flicker();
}
} else { //关机中
}
}
}
/**
* 上电工作状态设置测试通过
* 开关机按键测试通过
* 定时按键测试通过
* 间歇按键闪烁测试通过
* 档位按键测试通过
* 模拟风扇错误触发后led0闪烁测试通过
* 模拟总电路错误触发后led0,led1闪烁测试通过
* 注意:需要加个逻辑,如果总电路电压异常,则风扇电压异常不触发,这个逻辑之后再加
*/