| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- /*
- * Copyright (c) 2006-2019, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2019-09-09 RT-Thread first version
- */
- #include <rtthread.h>
- #include <board.h>
- #include <rtdevice.h>
- #include "beep.h"
- #include "hmi.h"
- #include <control.h>
- #include "dtu_uart2.h"
- #include "sht30_collect.h"
- #include "sound.h"
- #include <ledblink.h>
- #include "test.h"
- #define DBG_ENABLE
- #define DBG_COLOR
- #define DBG_TAG "main"
- #define DBG_LEVEL DBG_LOG
- #include <rtdbg.h> //must after of DBG_LVL, DBG_TAG or other options
- #define WDT_DEVICE_NAME "wdt" /* 看门狗设备名称 */
- /********************************************************************/
- rt_device_t wdg_dev; /* 看门狗设备句柄 */
- Device_Status_typedef device_status;
- /*****************LED thread*****************************************/
- /*栈空间地址对齐*/
- ALIGN(RT_ALIGN_SIZE)
- /********************************************************************/
- // 外部函数声明,消除警告信息
- int memtrace();
- /********************************************************************/
- static int wdt_init(void);
- static void idle_hook(void);
- /********************************************************************/
- int main(void)
- {
- CompileTime; // 读取固件的编译时间
- /* 初始化设备 */
- rt_device_init(wdg_dev);
- led_add_device(LED0_PIN);
- led_set_level(1, 0);
- LOG_W("System Clock information:");
- LOG_I("SYSCLK_Frequency = %d", HAL_RCC_GetSysClockFreq());
- LOG_I("HCLK_Frequency = %d", HAL_RCC_GetHCLKFreq());
- LOG_I("PCLK1_Frequency = %d", HAL_RCC_GetPCLK1Freq());
- LOG_I("PCLK2_Frequency = %d", HAL_RCC_GetPCLK2Freq());
- Beep_Tip(100);
- // 读FLASH配置文件,未配置则设置默认配置
- Check_ParamConfig();
- // Recode_e_code(e_reboot , 0);
- // 是否触发固件更新
- if (device_status.update_flag == 0)
- {
- // 开机自检
- if (device_status.version_type != vt_ROBOT)
- {
- HardWare_Check(0);
- }
- // 工作状态置位线程
- if (device_status.dtype != dt_BZY && device_status.version_type != vt_ROBOT)
- {
- Workstatus_check();
- }
- /********************/
- // 工作流程
- if (device_status.version_type != vt_ROBOT)
- {
- Work_Loop_Task();
- }
- /*******************/
- }
- // 看门狗初始化
- wdt_init();
- // 打印内存占用
- memtrace();
- }
- /*初始化看门狗*/
- static int wdt_init(void)
- {
- rt_err_t ret = RT_EOK;
- rt_uint32_t timeout = 10; /*溢出时间,秒*/
- /* 根据设备名称查找看门狗设备,获取设备句柄 */
- wdg_dev = rt_device_find(WDT_DEVICE_NAME);
- if (!wdg_dev)
- {
- LOG_E("find %s failed!", WDT_DEVICE_NAME);
- return RT_ERROR;
- }
- /* 设置看门狗溢出时间 */
- ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
- if (ret != RT_EOK)
- {
- LOG_E("set %s timeout failed!", WDT_DEVICE_NAME);
- return RT_ERROR;
- }
- /* 启动看门狗 */
- ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
- if (ret != RT_EOK)
- {
- LOG_E("start %s failed!", WDT_DEVICE_NAME);
- return -RT_ERROR;
- }
- /* 设置空闲线程回调函数 */
- rt_thread_idle_sethook(idle_hook);
- return ret;
- }
- /*空闲钩子函数*/
- static void idle_hook(void)
- {
- // #if 1
- // #if Color_EN == 0
- // time_t now;
- // time(&now);
- // static struct tm alarm_new;
- // alarm_new = *localtime(&now);
- // if ((alarm_new.tm_hour) == 8 && (alarm_new.tm_min == 20) && (alarm_new.tm_sec == 0))
- // {
- // #if ROBOT_EN == 0
- // rt_hw_cpu_reset();
- // #endif
- // }
- // #endif
- // #endif
- // // else {
- // // rt_kprintf("%d:%d:%d\n",alarm_new.tm_hour,alarm_new.tm_min,alarm_new.tm_sec);
- // // }
- // /* 在空闲线程的回调函数里喂狗 */
- rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
- led_tog(1);
- // rt_kprintf("feed the dog!\n ");
- }
- /*
- 1 INIT_BOARD_EXPORT(fn) 非常早期的初始化,此时调度器还未启动
- 2 INIT_PREV_EXPORT(fn) 主要是用于纯软件的初始化、没有太多依赖的函数
- 3 INIT_DEVICE_EXPORT(fn) 外设驱动初始化相关,比如网卡设备
- 4 INIT_COMPONENT_EXPORT(fn) 组件初始化,比如文件系统或者 LWIP
- 5 INIT_ENV_EXPORT(fn) 系统环境初始化,比如挂载文件系统
- 6 INIT_APP_EXPORT(fn) 应用初始化,比如 GUI 应用
- */
- // uint8_t log_en_inr = 10; // 打印log的速度 数值越小 打印越频繁
- // static int8_t log_en_cnt = -1;
- uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr);
- /**
- * @brief 用于确认打印log的时机
- *
- * @param log_en_cnt 计数使用
- * @param log_en_inr 频率(与数值成正比)
- * @return uint8_t 1-开启 0-关闭
- */
- uint8_t CheckLogTime(int16_t *log_en_cnt, int16_t log_en_inr)
- {
- uint8_t res = 0;
- if ((*log_en_cnt == log_en_inr - 1) || (*log_en_cnt == -1))
- {
- if (*log_en_cnt == -1)
- {
- *log_en_cnt = 1;
- }
- else
- {
- *log_en_cnt = 0;
- }
- res = 1;
- }
- else
- {
- *log_en_cnt += 1;
- }
- // rt_kprintf("log_en_cnt - log_en_inr %d / %d %d\n" , *log_en_cnt , log_en_inr , res);
- if (log_en_cnt > log_en_inr || log_en_inr < -1)
- return res;
- return res;
- }
|