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.

429 lines
17 KiB

4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
4 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. #include "main.h"
  2. #include <stdbool.h> //定义布尔
  3. #include "board.h"
  4. #define PWM_FREQHZ 25000 //硬件pwm频率
  5. /***********************************************************************************************************************
  6. * =========================================================================================================== *
  7. ***********************************************************************************************************************/
  8. void onkey(zkey_t *key, zkey_state_t key_state);
  9. /***********************************************************************************************************************
  10. * =========================================================================================================== *
  11. ***********************************************************************************************************************/
  12. static zkey_t s_keys[] = {
  13. ZKEY_INIT("timerkey", port_gpio_get_timer_key_state),
  14. ZKEY_INIT("gearskey", port_gpio_get_gears_key_state),
  15. ZKEY_INIT("intervalkey", port_gpio_get_interval_key_state),
  16. ZKEY_INIT("switchkey", port_gpio_get_switch_key_state),
  17. };
  18. zkey_module_t key_module = ZMODULE_INIT(s_keys, onkey);
  19. extern uint32_t target_frequencyhz;
  20. extern uint32_t target_duty;
  21. /***********************************************************************************************************************
  22. * =========================================================================================================== *
  23. ***********************************************************************************************************************/
  24. static bool error_even_trigger_after_stop_ozone_work_state; //错误事件触发后停止臭氧工作标志位
  25. // 设置
  26. bool g_setting_interval_work_flag = false; //现在间歇工作状态
  27. WORK_LEVEL_T g_setting_level = WORK_LEVEL_HIGHT; //关机前的档位
  28. //标志位
  29. bool g_power_flag = false; //开关机标志位
  30. static int g_error_num;
  31. bool g_auto_shutdown_flag = false; //定时功能使能标志位
  32. static uint32_t g_auto_shutdown_countdown_s; //定时时间
  33. //其他
  34. static bool pwm_modble_enable_falg; //硬件pwm使能标志位
  35. bool fan_control_by_ozone_pwm_falg = false; //风扇由大周期控制
  36. /***********************************************************************************************************************
  37. * =======================================================HOOK======================================================== *
  38. ***********************************************************************************************************************/
  39. void HOOK_pwm_module_set_pwm_duty(uint32_t frequencyhz, uint32_t duty) {
  40. set_pwm_modbul_freq_duty(frequencyhz, duty);
  41. pwm_modble_enable_falg = true;
  42. }
  43. void HOOK_pwm_stop(void) {
  44. set_pwm_modbul_freq_duty(1, 0); //关闭PWM输出
  45. pwm_modble_enable_falg = false;
  46. }
  47. bool HOOK_pwm_is_enable(void) { return pwm_modble_enable_falg; }
  48. int hook_get_autoshutdown_timecount() { return g_auto_shutdown_countdown_s; }
  49. /***********************************************************************************************************************
  50. * =================================================INTERNAL_FUNCTION================================================= *
  51. ***********************************************************************************************************************/
  52. /**
  53. * @brief
  54. *
  55. * @param freq
  56. * @param us
  57. */
  58. int get_duty_by_freq_and_valid_time(uint32_t freq, uint32_t us) {
  59. uint16_t period = 1000000 / freq;
  60. int duty = us * 100 / period;
  61. return duty;
  62. }
  63. /**
  64. * @brief pwm输出rgb的颜色
  65. *
  66. * @param gears
  67. */
  68. void update_ozone_work_level(bool interval_work, WORK_LEVEL_T level) {
  69. printf("update_ozone_work_level(interval_work:%d,level:%d)\n", interval_work, level);
  70. rgb_light_mode_t lightmode;
  71. int duty = 0;
  72. uint32_t pwm_freqhz = 0;
  73. if (level == WORK_LEVEL_CLOSE) {
  74. pwm_freqhz = 1;
  75. duty = 0;
  76. lightmode = RGB_CLOSE;
  77. } else if (level == WORK_LEVEL_LOW) {
  78. pwm_freqhz = 10000;
  79. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  80. lightmode = RGB_COLOR_BLUE;
  81. } else if (level == WORK_LEVEL_HIGHT) {
  82. pwm_freqhz = 25000;
  83. duty = get_duty_by_freq_and_valid_time(pwm_freqhz, 8);
  84. lightmode = RGB_COLOR_RED;
  85. }
  86. if (interval_work) {
  87. ozone_pwm_control_module_set_pwm_output_2(pwm_freqhz, duty, INTERVAL_WORK_PERIOD_MS, INTERVAL_WORK_DUTY);
  88. } else {
  89. set_pwm_modbul_freq_duty(pwm_freqhz, duty);
  90. }
  91. light_module_set_rgb_mode(lightmode);
  92. light_module_set_rgb_flicker_mode(interval_work);
  93. }
  94. /**
  95. * @brief
  96. */
  97. void shutdown(void) {
  98. printf("shutdown\n");
  99. g_power_flag = false;
  100. g_error_num = 0;
  101. g_auto_shutdown_flag = false;
  102. g_auto_shutdown_countdown_s = 0;
  103. g_setting_interval_work_flag = false;
  104. update_ozone_work_level(false, WORK_LEVEL_CLOSE);
  105. g_setting_level = WORK_LEVEL_HIGHT;
  106. port_fan_set(false); //关闭风扇
  107. light_module_close_all_light();
  108. ozone_pwm_control_module_stop_pwm();
  109. }
  110. /***********************************************************************************************************************
  111. * ============================================================================================================= *
  112. ***********************************************************************************************************************/
  113. void iwdt_init(void) {
  114. /**
  115. * @brief 0+1
  116. * 2
  117. * 4
  118. */
  119. IWDT_InitStruType x;
  120. x.WDT_Tms = 4000;
  121. x.WDT_IE = Enable; /* IWDT中断使能 */
  122. x.WDT_Rst = Enable; /* IWDT复位使能 */
  123. x.WDT_Clock = IWDT_CLOCK_WDT; /* LRC */
  124. IWDT_Init(&x);
  125. /* 使能IWDT */
  126. IWDT_Enable();
  127. }
  128. void feed_iwdt(void) {
  129. //喂狗
  130. if (0x01 == IWDT_GetFlagStatus()) {
  131. IWDT_Clear();
  132. // printf("喂狗\r\n");
  133. }
  134. }
  135. /**
  136. * @brief
  137. *
  138. */
  139. void cancel_autoshutdown(void) {
  140. g_auto_shutdown_countdown_s = 0;
  141. g_auto_shutdown_flag = false;
  142. light_module_set_autoshutdown_indicator_light(false);
  143. }
  144. /**
  145. * @brief
  146. *
  147. */
  148. void starting_up(void) {
  149. g_power_flag = true; //开关机标志位
  150. g_error_num = 0;
  151. g_auto_shutdown_flag = false; //定时功能使能标志位
  152. g_auto_shutdown_countdown_s = 0; //定时时间
  153. port_fan_set(true); //打开风扇
  154. update_ozone_work_level(false, WORK_LEVEL_HIGHT);
  155. }
  156. void onkey(zkey_t *key, zkey_state_t key_state) {
  157. if (key->hasProcessed) return;
  158. /**
  159. * @brief ,
  160. */
  161. if (!g_power_flag) {
  162. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  163. key->hasProcessed = true;
  164. // printf("key zks_rising_edge\r\n");
  165. /**
  166. * @brief
  167. * 1.
  168. * 2.
  169. * 3.
  170. */
  171. starting_up();
  172. }
  173. return;
  174. }
  175. /**
  176. * @brief
  177. */
  178. if (g_error_num != 0) { //设备存在异常
  179. if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  180. key->hasProcessed = true;
  181. printf("process key[2] event\r\n");
  182. /**
  183. * @brief
  184. */
  185. shutdown();
  186. }
  187. return;
  188. }
  189. if (key == &s_keys[0] && key->cur_state == zks_falling_edge) //小于3s
  190. {
  191. printf("process key[0] event\r\n");
  192. /**
  193. * @brief
  194. */
  195. if (g_setting_interval_work_flag == true) { // g_setting_interval_work_flag=true现在是间歇工作
  196. ozone_pwm_control_module_stop_pwm();
  197. g_setting_interval_work_flag = false; // 取消间歇工作
  198. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  199. fan_control_by_ozone_pwm_falg = false;
  200. pwm_modble_enable_falg = false; //硬件pwm使能标志位,这个标志位只在间歇功能下做逻辑了,所以取消间歇功能后将pwm_modble_enable_falg = false;
  201. port_fan_set(true); //打开风扇
  202. }
  203. if (!g_auto_shutdown_flag) {
  204. g_auto_shutdown_flag = true;
  205. g_auto_shutdown_countdown_s = 0;
  206. light_module_set_autoshutdown_indicator_light(true);
  207. }
  208. g_auto_shutdown_countdown_s += AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S;
  209. if (g_auto_shutdown_countdown_s > AUTO_SHUTDOWN_ONE_LIGHT_EQ_TIME_S * 4) {
  210. cancel_autoshutdown();
  211. }
  212. } else if (key == &s_keys[1] && key->cur_state == zks_falling_edge) {
  213. /**
  214. * @brief
  215. */
  216. printf("process key[1] event\r\n");
  217. if (g_setting_level == WORK_LEVEL_HIGHT) {
  218. g_setting_level = WORK_LEVEL_LOW;
  219. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_LOW);
  220. } else if (g_setting_level == WORK_LEVEL_LOW) {
  221. g_setting_level = WORK_LEVEL_HIGHT;
  222. update_ozone_work_level(g_setting_interval_work_flag, WORK_LEVEL_HIGHT);
  223. }
  224. } else if (key == &s_keys[2] && key->cur_state == zks_falling_edge) {
  225. printf("process key[2] event\r\n");
  226. /**
  227. * @brief
  228. */
  229. if (g_auto_shutdown_flag) { //处于定时关机模式
  230. cancel_autoshutdown();
  231. }
  232. g_setting_interval_work_flag = !g_setting_interval_work_flag;
  233. // fan_control_by_ozone_pwm_falg为true时风扇由大周期控制
  234. fan_control_by_ozone_pwm_falg = !fan_control_by_ozone_pwm_falg;
  235. update_ozone_work_level(g_setting_interval_work_flag, g_setting_level);
  236. } else if (key == &s_keys[3] && key->cur_state == zks_falling_edge) {
  237. printf("process key[2] event\r\n");
  238. /**
  239. * @brief
  240. */
  241. shutdown();
  242. }
  243. }
  244. #define DO_IT_EACH_MS(time) \
  245. { \
  246. static uint32_t __ticket = 0; \
  247. if (port_haspassedms(__ticket) > time) { \
  248. __ticket = get_sys_ticket();
  249. #define END() \
  250. } \
  251. }
  252. /**
  253. * @brief 绿
  254. *
  255. */
  256. void process_interval_rgb_mode(void) {
  257. static bool last_pwm_modble_enable_falg_2;
  258. if (ozone_pwm_control_is_enable() == false) {
  259. return;
  260. }
  261. if (last_pwm_modble_enable_falg_2 != pwm_modble_enable_falg) {
  262. if (pwm_modble_enable_falg == true) {
  263. close_green_led();
  264. last_pwm_modble_enable_falg_2 = pwm_modble_enable_falg;
  265. light_module_set_rgb_flicker_mode(true);
  266. } else if (pwm_modble_enable_falg == false) {
  267. // light_module_set_rgb_mode(RGB_CLOSE);
  268. // DO_IT_EACH_MS(1000) {
  269. open_green_led();
  270. last_pwm_modble_enable_falg_2 = pwm_modble_enable_falg;
  271. light_module_set_rgb_flicker_mode(false);
  272. // }
  273. // END();
  274. }
  275. }
  276. }
  277. /**********************************************************************************************************************
  278. * ============================================================================================================== *
  279. **********************************************************************************************************************/
  280. void fan_module_schedule(void) {
  281. static bool last_pwm_modble_enable_falg = false;
  282. if (!fan_control_by_ozone_pwm_falg) {
  283. return;
  284. } else if (fan_control_by_ozone_pwm_falg && last_pwm_modble_enable_falg != pwm_modble_enable_falg) {
  285. if (pwm_modble_enable_falg == false) { //代表硬件pwm没有输出
  286. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  287. port_fan_set(false);
  288. } else if (pwm_modble_enable_falg == true) { //代表硬件pwm有输出
  289. last_pwm_modble_enable_falg = pwm_modble_enable_falg;
  290. port_fan_set(true);
  291. }
  292. }
  293. }
  294. /***********************************************************************************************************************
  295. * =============================================================================================================
  296. ***********************************************************************************************************************/
  297. int main(void) {
  298. HRC_Config(Enable, SCU_HRC_48M, Enable); //时钟源SCU_CLK_HRC
  299. SystemInit();
  300. DeviceClockAllEnable(); //打开所有外设时钟
  301. User_SysTickInit(); //滴答定时器初始化为(配置为1ms中断)
  302. SysTick_Enable();
  303. //硬件初始化
  304. unused_gpio_init();
  305. gpio_init();
  306. uart0_init();
  307. //模块初始化
  308. zkey_init(&key_module);
  309. // while (1) {
  310. // }
  311. //上电默认开机并高档工作
  312. starting_up();
  313. //启动结束
  314. printf("Initialization completed\r\n");
  315. //测试
  316. // set_pwm_modbul_freq_duty(25000, 10);
  317. // while (1) {
  318. // }
  319. while (true) {
  320. /*******************************************************************************************************************
  321. * ===================================================================================================== *
  322. *******************************************************************************************************************/
  323. DO_IT_EACH_MS(200) {
  324. static uint8_t debug_led_state = 1;
  325. debug_led_state = !debug_led_state;
  326. port_debug_set(debug_led_state);
  327. }
  328. END()
  329. /***********************************************************************************************************************
  330. * =================================================================================================== *
  331. ***********************************************************************************************************************/
  332. DO_IT_EACH_MS(KEY_PERIOD) { zkey_do_loop_in_each_period(NULL); }
  333. END();
  334. /***********************************************************************************************************************
  335. * =============================================================================================== *
  336. ***********************************************************************************************************************/
  337. light_module_schedule();
  338. /***********************************************************************************************************************
  339. * =============================================================================================== *
  340. ***********************************************************************************************************************/
  341. ozone_pwm_control_module_loop();
  342. /*******************************************************************************************************************
  343. * ===================================================================================================== *
  344. *******************************************************************************************************************/
  345. fan_module_schedule();
  346. /*******************************************************************************************************************
  347. * ==============================================rgb模式============================================== *
  348. *******************************************************************************************************************/
  349. process_interval_rgb_mode();
  350. /*******************************************************************************************************************
  351. * ==================================================PWM均匀增加================================================== *
  352. *******************************************************************************************************************/
  353. DO_IT_EACH_MS(PWM_CHANGE_PERIOD) {
  354. set_pwm_modbul_freq_duty(target_frequencyhz, target_duty);
  355. }
  356. END();
  357. /***********************************************************************************************************************
  358. * ======================================================================================================= *
  359. ***********************************************************************************************************************/
  360. //
  361. DO_IT_EACH_MS(1000) {
  362. if (g_power_flag && g_auto_shutdown_flag) {
  363. if (g_auto_shutdown_countdown_s > 0) {
  364. g_auto_shutdown_countdown_s -= 1;
  365. printf("auto shutdown countdown %d\n", g_auto_shutdown_countdown_s);
  366. } else {
  367. g_auto_shutdown_flag = false;
  368. /**
  369. * @brief
  370. */
  371. shutdown();
  372. }
  373. }
  374. }
  375. END();
  376. /***********************************************************************************************************************
  377. * =======================================================================================================
  378. ***********************************************************************************************************************/
  379. DO_IT_EACH_MS(EXCEPTION_CHECK_PERIOD) {
  380. /**
  381. * @brief
  382. * ADC的数值是否超出规定范围
  383. */
  384. if (false) {
  385. }
  386. }
  387. END();
  388. // End..................................
  389. }
  390. }