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.
480 lines
20 KiB
480 lines
20 KiB
// #if 0
|
|
// /*********************************************************
|
|
// *Copyright (C), 2017, Shanghai Eastsoft Microelectronics Co., Ltd
|
|
// *文件名: main.c
|
|
// *作 者: AE Team
|
|
// *版 本: V1.00
|
|
// *日 期: 2021/05/13
|
|
// *描 述: GPIO模块示例程序
|
|
// * 定时扫描GPIO_PA2的电平状态,高电平点亮LED1,低电平熄灭LED1
|
|
// *备 注:
|
|
// *本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
|
|
// **********************************************************/
|
|
// #include "main.h"
|
|
|
|
// #include <stdbool.h> //定义布尔
|
|
|
|
// // extern ozone_message_t ozone_message;
|
|
// extern zkey_module_t key_module;
|
|
// bool rgb_flicker_state = false;
|
|
// extern rgb_message_t rgb_message;
|
|
// /***********************************************************************************************************************
|
|
// * =====================================================看门狗======================================================
|
|
// **
|
|
// ***********************************************************************************************************************/
|
|
// 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");
|
|
// }
|
|
// }
|
|
|
|
// //############### 测试一下看门狗 ##############//
|
|
|
|
// /**
|
|
// * @brief 上电臭氧工作情况,设备中设置有开关机按键,所以外部上电后,不让设备工作
|
|
// *
|
|
// */
|
|
// void power_on_ozone_working_status(void) {
|
|
// // PWM频率1Khz,占空比0,占空比低有效,设置占空比为100,pwm一直输出低电平
|
|
// HOOK_pwm_module_set_pwm_duty(1, 100);
|
|
// light_module_set_timing_light_mode(CLOSE_ALL_LED);
|
|
// light_module_set_rgb_mode(RGB_COLOR_RED);
|
|
// port_fan_set(false); //打开你风扇
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * ======================================================主函数=======================================================
|
|
// **
|
|
// ***********************************************************************************************************************/
|
|
// int main(void) {
|
|
// HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
|
|
// SystemInit();
|
|
// DeviceClockAllEnable(); //打开所有外设时钟
|
|
// User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
|
|
// SysTick_Enable();
|
|
// uart0_init();
|
|
// gpio_init();
|
|
// zkey_init(&key_module);
|
|
// t16n0_1_init(); //配置PA4输出pwm
|
|
// // iwdt_init();
|
|
// power_on_ozone_working_status();
|
|
// // power_on_ozone_work_state(); //上电工作情况
|
|
// // ADCInit("A",4);
|
|
// // printf("Initialization completed\r\n");
|
|
// while (1) {
|
|
// // port_do_debug_light_state();
|
|
// port_key_state();
|
|
// // if (get_ozone_starting_up_state() == true) { //开机中
|
|
// // // if (ozone_message.ozone_work_state == 2)
|
|
// // // is_ozone_work_time_over();
|
|
// // // if (ozone_message.ozone_interva_state == true) {
|
|
// // // set_rgb_flicker(); //间歇状态下rgb亮3灭1
|
|
// // // is_ozone_interva_time_over();
|
|
// // // }
|
|
// // pwm_module_loop();
|
|
// // if (rgb_message.rgb_flicker_mode == true) {
|
|
// // process_rgb_flicker_mode();
|
|
// // rgb_message.already_set_rgb_mode = false;
|
|
// // } else if (rgb_message.rgb_flicker_mode == false) {
|
|
// // if (rgb_message.already_set_rgb_mode == false)
|
|
// // light_module_set_rgb_mode(rgb_message.turn_off_the_mode_before_rgb);
|
|
// // rgb_message.already_set_rgb_mode = true;
|
|
// // }
|
|
// adc_loop_gather();
|
|
// // } else if (get_ozone_starting_up_state() == false) { //关机
|
|
// // }
|
|
// // test_iwdt();
|
|
// // feed_iwdt(); //当产生中断的时候进行喂狗操作
|
|
// }
|
|
// }
|
|
|
|
// #endif
|
|
// #include <stdbool.h> //定义布尔
|
|
|
|
// #include "main.h"
|
|
|
|
// #define INTERVAL_PERIOD 20000
|
|
// #define TIMING_TICK 20000
|
|
// uint32_t g_interval_period = 20000; //现在项目需求只有一种间歇时间,所以这里用这个变量来修改间歇的周期
|
|
// uint32_t g_interval_duty = 100;
|
|
// bool starting_up_state = false;
|
|
// RGB_MODE_T now_rgb_color;
|
|
// RGB_MODE_T shutdown_front_rgb_color;
|
|
// uint32_t timing_time;
|
|
// bool timing_function_enable_falg;
|
|
// static uint32_t timing_shutdown_begin_ticket = 0;
|
|
// uint8_t now_pwm_duty; //记录硬件的pwm占空比
|
|
// extern uint32_t begin_ticket;
|
|
|
|
// /**
|
|
// * @brief 间歇功能当定时功能使能的时候,间歇功能开始工作,当定时功能未使能时间歇功能不工作
|
|
// *
|
|
// */
|
|
// void update_interval_period_duty(void) {
|
|
// static uint8_t interval_key_press_count = 0;
|
|
// interval_key_press_count++;
|
|
// if (interval_key_press_count == 1) {
|
|
// printf("duty 50\r\n");
|
|
// g_interval_period = INTERVAL_PERIOD;
|
|
// g_interval_duty = 50;
|
|
// } else if (interval_key_press_count == 2) {
|
|
// printf("duty 100\r\n");
|
|
// interval_key_press_count = 0;
|
|
// g_interval_period = timing_time;
|
|
// g_interval_duty = 100;
|
|
// }
|
|
// ozone_pwm_control_module_set_pwm_output_1(g_interval_period, g_interval_duty);
|
|
// }
|
|
|
|
// /**
|
|
// * @brief 根据现在的时间进行更改
|
|
// *
|
|
// */
|
|
// void updae_led_light_mode(void) {
|
|
// if ((timing_time / TIMING_TICK) == 0) {
|
|
// light_module_set_timing_light_mode(CLOSE_ALL_LED);
|
|
// } else if ((timing_time / TIMING_TICK) == 1) {
|
|
// light_module_set_timing_light_mode(OPEN_ONE_LED);
|
|
// } else if ((timing_time / TIMING_TICK) == 2) {
|
|
// light_module_set_timing_light_mode(OPEN_TWO_LED);
|
|
// } else if ((timing_time / TIMING_TICK) == 3) {
|
|
// light_module_set_timing_light_mode(OPEN_THREE_LED);
|
|
// } else if ((timing_time / TIMING_TICK) == 4) {
|
|
// light_module_set_timing_light_mode(OPEN_FOUR_LED);
|
|
// }
|
|
// }
|
|
|
|
// void process_gearskey_press_even_1(void) {
|
|
// static uint8_t gearskey_press_count;
|
|
// gearskey_press_count++;
|
|
// if (gearskey_press_count == 1) {
|
|
// update_pwm_output_duty(50);
|
|
// update_rgb_color(RGB_COLOR_BLUE);
|
|
// } else if (gearskey_press_count == 2) {
|
|
// update_pwm_output_duty(25);
|
|
// update_rgb_color(RGB_COLOR_GERRN);
|
|
// } else if (gearskey_press_count == 3) {
|
|
// gearskey_press_count = 0;
|
|
// update_pwm_output_duty(100);
|
|
// update_rgb_color(RGB_COLOR_RED);
|
|
// }
|
|
// }
|
|
|
|
// void update_rgb_color(uint8_t color) {
|
|
// if (color == RGB_CLOSE) {
|
|
// now_rgb_color = RGB_COLOR_RED;
|
|
// light_module_set_rgb_mode(RGB_CLOSE);
|
|
// } else if (color == RGB_COLOR_RED) {
|
|
// now_rgb_color = RGB_COLOR_RED;
|
|
// light_module_set_rgb_mode(RGB_COLOR_RED);
|
|
// } else if (color == RGB_COLOR_BLUE) {
|
|
// now_rgb_color = RGB_COLOR_BLUE;
|
|
// light_module_set_rgb_mode(RGB_COLOR_BLUE);
|
|
// } else if (color == RGB_COLOR_GERRN) {
|
|
// now_rgb_color = RGB_COLOR_GERRN;
|
|
// light_module_set_rgb_mode(RGB_COLOR_GERRN);
|
|
// }
|
|
// }
|
|
|
|
// void update_pwm_output_duty(uint8_t pwm_duty) {
|
|
// if (pwm_duty == 100) {
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 100, g_interval_period, g_interval_duty);
|
|
// now_pwm_duty = 100;
|
|
// } else if (pwm_duty == 50) {
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 50, g_interval_period, g_interval_duty);
|
|
// now_pwm_duty = 50;
|
|
// } else if (pwm_duty == 25) {
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 25, g_interval_period, g_interval_duty);
|
|
// now_pwm_duty = 25;
|
|
// } else if (pwm_duty == 0) {
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 0, g_interval_period, g_interval_duty);
|
|
// now_pwm_duty = 0;
|
|
// }
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * =====================================================开机关机====================================================== *
|
|
// ***********************************************************************************************************************/
|
|
// void shutdown(void) {
|
|
// starting_up_state = false;
|
|
// shutdown_front_rgb_color = now_rgb_color;
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 0, 0, 0);
|
|
// update_rgb_color(RGB_CLOSE);
|
|
// light_module_set_timing_light_mode(CLOSE_ALL_LED);
|
|
// port_fan_set(false); //关闭风扇
|
|
// }
|
|
|
|
// void starting_up(void) {
|
|
// // starting_up_state = true;
|
|
// // // PWM频率1Khz,占空比0,占空比低有效,设置占空比为100,pwm一直输出低电平
|
|
// // if (shutdown_front_rgb_color == RGB_CLOSE) {
|
|
// // update_rgb_color(RGB_COLOR_RED);
|
|
// // } else {
|
|
// // update_rgb_color(now_rgb_color); // last_rgb_mode
|
|
// // }
|
|
// // if (now_pwm_duty == 0) {
|
|
// // now_pwm_duty = 100;
|
|
// // }
|
|
// // update_pwm_output_duty(now_pwm_duty);
|
|
// 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();
|
|
// }
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * =================================================按键初始化和处理================================================== *
|
|
// ***********************************************************************************************************************/
|
|
// 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 (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");
|
|
// // update_rgb_mode(0, now_rgb_mode);
|
|
// // update_pwm_output_duty(0);
|
|
// 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");
|
|
// update_interval_period_duty();
|
|
// } 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 (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();
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * =====================================================HOOK实现====================================================== *
|
|
// ***********************************************************************************************************************/
|
|
// bool pwm_modble_enable_falg;
|
|
|
|
// 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; }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * =====================================================定时功能====================================================== *
|
|
// ***********************************************************************************************************************/
|
|
// /**
|
|
// * @brief 每次按键按下时间timing_time=timing_time+TIMING_TICK
|
|
// * 当timing_time==timing_time = 4 * TIMING_TICK;
|
|
// * timing_time = 0;
|
|
// *
|
|
// */
|
|
// void update_timing_time(void) {
|
|
// timing_shutdown_begin_ticket = get_sys_ticket(); //更新定时关机开始的时间
|
|
// begin_ticket = get_sys_ticket(); //更新间歇开始的时间
|
|
// timing_function_enable_falg = true; //使能定时功能
|
|
// if (timing_time == 0) {
|
|
// timing_time = 1 * TIMING_TICK;
|
|
// } else if ((timing_time / TIMING_TICK) == 1) {
|
|
// timing_time = 2 * TIMING_TICK;
|
|
// } else if ((timing_time / TIMING_TICK) == 2) {
|
|
// timing_time = 3 * TIMING_TICK;
|
|
// } else if ((timing_time / TIMING_TICK) == 3) {
|
|
// timing_time = 4 * TIMING_TICK;
|
|
// } else if ((timing_time / TIMING_TICK) == 4) {
|
|
// timing_time = 0 * TIMING_TICK;
|
|
// timing_function_enable_falg = false;
|
|
// }
|
|
// printf("timing time:%d\r\n", timing_time);
|
|
// }
|
|
|
|
// /**
|
|
// * @brief 定时每过TIMING_TICK timing_time=timing_time-TIMING_TICK
|
|
// * 当TIMING_TICK==0的时候关机
|
|
// *
|
|
// */
|
|
// void try_shutdown(void) {
|
|
// if (port_haspassedms(timing_shutdown_begin_ticket) > TIMING_TICK) {
|
|
// timing_shutdown_begin_ticket = get_sys_ticket();
|
|
// printf("time minus %dms", TIMING_TICK);
|
|
// timing_time -= TIMING_TICK;
|
|
// updae_led_light_mode();
|
|
// }
|
|
// if (timing_time == 0) { //定时时间到
|
|
// timing_function_enable_falg = false; //使能定时功能
|
|
// shutdown();
|
|
// }
|
|
// }
|
|
// bool timing_function_is_enable(void) { return timing_function_enable_falg; }
|
|
// /***********************************************************************************************************************
|
|
// * =======================================================测试========================================================
|
|
// **
|
|
// ***********************************************************************************************************************/
|
|
// void test(void) {
|
|
// light_module_set_rgb_mode(RGB_CLOSE);
|
|
// light_module_set_timing_light_mode(CLOSE_ALL_LED);
|
|
// // PWM频率1Khz,占空比100,占空比高有效,设置占空比为0,pwm一直输出高电平
|
|
// HOOK_pwm_module_set_pwm_duty(1, 0);
|
|
// // printf("100\r\n");
|
|
// // Delayms(30000);
|
|
// // HOOK_pwm_module_set_pwm_duty(1, 25); //电压为25%
|
|
// // Delayms(30000);
|
|
// // HOOK_pwm_module_set_pwm_duty(1, 50); //电压为50%
|
|
// // Delayms(30000);
|
|
// // HOOK_pwm_module_set_pwm_duty(1, 100); //电压为100%
|
|
// // Delayms(30000);
|
|
// HOOK_pwm_module_set_pwm_duty(1, 50); //电压为50%
|
|
// ozone_pwm_control_module_set_pwm_output_2(1, 50, 10000, 50); //这样设置现象应该是,pwm输出50%,定时10s,间歇5s
|
|
// // update_timing_time();
|
|
// }
|
|
|
|
// /**
|
|
// * @brief 上电臭氧工作情况,设备中设置有开关机按键,所以外部上电后,不让设备工作
|
|
// *
|
|
// */
|
|
// void power_on_ozone_working_status(void) {
|
|
// // PWM频率1Khz,占空比0,占空比低有效,设置占空比为100,pwm一直输出低电平
|
|
// // update_pwm_output_duty(1);
|
|
// // update_pwm_output_duty(now_pwm_duty);
|
|
// // update_rgb_color(RGB_CLOSE);
|
|
// light_module_set_timing_light_mode(CLOSE_ALL_LED);
|
|
// port_fan_set(false); //关闭风扇
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * ======================================================主函数=======================================================
|
|
// **
|
|
// ***********************************************************************************************************************/
|
|
// int main(void) {
|
|
// HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
|
|
// SystemInit();
|
|
// DeviceClockAllEnable(); //打开所有外设时钟
|
|
// User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
|
|
// SysTick_Enable();
|
|
// uart0_init();
|
|
// gpio_init();
|
|
// zkey_init(&key_module);
|
|
// t16_pa4_init();
|
|
// power_on_ozone_working_status();
|
|
// // test();
|
|
// // printf("%d\r\n", (10000 % 60000));
|
|
// // printf("%d\r\n", (20000 % 60000));
|
|
// // printf("%d\r\n", (30000 % 60000));
|
|
// // printf("%d\r\n", (40000 % 60000));
|
|
// // ozone_pwm_control_module_set_pwm_output_2(1, 50, 10000, 50); //这样设置现象是,pwm输出50%,定时10s,间歇5s
|
|
// while (1) {
|
|
// 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();
|
|
// if (timing_function_is_enable()) { //定时功能是开启的
|
|
// ozone_pwm_control_module_loop();
|
|
// try_shutdown();
|
|
// }
|
|
// } else { //关机中
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// /***********************************************************************************************************************
|
|
// * =====================================================测试结果======================================================
|
|
// **
|
|
// ***********************************************************************************************************************/
|
|
// /**
|
|
// * 按键测试通过
|
|
// * HOOK_pwm_module_set_pwm_duty()小周期(设置硬件PWM)测试通过
|
|
// * 测试间歇PWM通过
|
|
// *
|
|
// **/
|
|
|
|
// /**
|
|
// * 关机工作
|
|
// * 1.PWM输出0
|
|
// * 2.RGB关闭
|
|
// * 3.定时灯关闭
|
|
// * 4.风扇关闭
|
|
// *
|
|
// */
|