//////////////////////////////////////////////////////////////////////////////// /// main文件 /// /// /// 包含操作系统、设备驱动初始化及任务的创建 /// @file app.c /// @author gkl /// @date 2017-05-25 /// @version v0.1 //////////////////////////////////////////////////////////////////////////////// // 包含的头文件 #include #include "gd32f4xx.h" #include "service_autoreturn.h" #include "agent_hyt.h" #include "enet_to_udp.h" #include "pdebug.h" #include "Lan8720.h" #include "device_adc_collect.h" #include "service_areascan.h" #include "service_presetbitscan.h" #include "service_selfcheck.h" #include "service_statusmonitor.h" #include "service_update.h" #include "ptz_struct.h" #include "Usart.h" #include "w25q128.h" #include "device_interrupt.h" #include "l6235d.h" #include "device_dac_out.h" #include "get_angle.h" #include "speed_to_bldc.h" #include "device_photoelectricswitch.h" #include "device_adc_collect.h" #include "rotate_bldc.h" #include "angle_poweroffsave.h" #include "device_wdog.h" #include "comm_cfginfo.h" #include "Restore_factory_set.h" #include "ptz_struct.h" #include "ptz_global_variable.h" #include "beep.h" #include "rotate_step.h" #include "speed_to_step.h" #include "systick.h" #include "service_error_count.h" // /// 起始任务 /// /// 初始化硬件及相关模块 /// @param none /// @param none /// @return none /// @note 修改日志 /// gkl于2017-05-27创建 //uint32_t ck_f = 0U; static void task_start (void *p_arg) { (void)p_arg; BSP_Init(); // 初始化系统tick BSP_Tick_Init(); systick_config(); #if (OS_TASK_STAT_EN > 0) OSStatInit(); #endif rcu_periph_clock_enable(RCU_SYSCFG);//将系统时钟使能放最前面 //看门狗初始化 init_wdog_module(); //初始化终端串口 init_term_uart(); term_printf("\n\n/**********************************************\r\n"); term_printf("\n Hello HYT Terminal \r\n\r\n"); term_printf("* @ Build: %s %s\r\n",__DATE__,__TIME__); term_printf("* @ Version: v2.0\r\n"); term_printf("* @ Copyright: Huiyuan \r\n"); term_printf("**********************************************/\r\n\r\n"); //默认打开回复 g_ptz.cmd_reply_switch = CMD_REPLY; g_ptz.hori_repeat_locate_switch = 1;//重复定位打开 g_ptz.vert_repeat_locate_switch = 1;//重复定位打开 // /*临时调试*/ // g_ptz.hori_self_check = 255; // g_ptz.vert_self_check = 255; // // g_ptz.hori_angleP.angle_allow_max = 360.0; // g_ptz.hori_angleP.angle_allow_min = 0.0; // // g_ptz.vert_angleP.angle_allow_max = 90.0; // g_ptz.vert_angleP.angle_allow_min = -90.0; // g_ptz.vert_ps_sw1_state = 1; // g_ptz.vert_ps_sw2_state = 1; // /**********/ //蜂鸣器初始化 beep_init(); term_printf("\n beep init \r\n\r\n"); // ck_f=rcu_clock_freq_get(CK_APB1); OSTimeDlyHMSM(0u, 0u, 0u, 100u); //蜂鸣器开,初始化开始 beep_enable(); //flash引脚初始化 Flash_GPIO_Init(); //获取配置文件 get_system_config_from_file(); //顶部开关引脚初始化 ptz_aux_switch_init(); term_printf("\n ptz aux switch init \r\n\r\n"); //以太网初始化 init_udp_module(); term_printf("\n udp init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 0u, 100u); //DAC输出初始化 init_dac_out_module(); term_printf("\n dac out init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 0u, 50u); //光电开关初始化 init_photoelectric_switch_module(); term_printf("\n photoelectric switch init \r\n\r\n"); //转动控制模块初始化 init_rotate_monitor_module(); term_printf("\n rotate mode init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 0u, 100u); //速度计算初始化 init_speed_module(); term_printf("\n speed init \r\n\r\n"); //区域扫描模块初始化 init_area_scan_module(); term_printf("\n area scan init \r\n\r\n"); //预置位扫描模块初始化 init_preset_bit_scan_module(); term_printf("\n preset bit init \r\n\r\n"); //状态检测模块初始化 init_status_monitor_module(); term_printf("\n status init \r\n\r\n"); //软件更新模块初始化 init_update_module(); term_printf("\n update init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 0u, 100u); //按键恢复出厂设置 init_reset_module(); term_printf("\n reset init \r\n\r\n"); //初始化自动回传模块 init_auto_return_module(); term_printf("\n auto return init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 0u, 50u); //代理层初始化 init_agent_module(); term_printf("\n agent init \r\n\r\n"); //继电器开关初始化 init_relay_module(); //外部中断初始化 EXTI_IRQ_init(); term_printf("\n exti irq init \r\n\r\n"); //掉电保护初始化 init_power_off_module(); term_printf("\n power off init \r\n\r\n"); //数据采集初始化电压、电流、温度 init_data_collect_module(); term_printf("\n data collect init \r\n\r\n"); OSTimeDlyHMSM(0u, 0u, 1u, 0u); #ifdef PTZ_PHOTOELECTRIC_SWITCH g_ptz.vert_ps_sw1_down_fall = 0; g_ptz.vert_ps_sw1_up_rise = 0; g_ptz.vert_ps_sw2_up_fall = 0; g_ptz.vert_ps_sw2_down_rise = 0; g_ptz.hori_ps_sw3_right_fall = 0; g_ptz.hori_ps_sw3_right_rise = 0; g_ptz.hori_ps_sw3_left_fall = 0; g_ptz.hori_ps_sw3_left_rise = 0; #endif //角度计算模块初始化 init_angle_module(); term_printf("\n angle init \r\n\r\n"); //自检模块初始化 init_self_check_module(); term_printf("\n self check bit init \r\n\r\n"); init_error_count_task();//创建误差计算任务 //蜂鸣器关,初始化结束 beep_disable(); while (DEF_TRUE) { OSTimeDlyHMSM(0u, 0u, 1u, 0u); OSTaskDel(OS_PRIO_SELF); } } /// 主函数 /// /// 创建第一个任务,由该任务再创建其他功能任务 /// @param none /// @param none /// @return none /// @note 修改日志+ /// gkl于2017-05-26创建 static OS_STK task_start_stk[TASK_START_STK_SIZE]; int main (void) { // __enable_irq(); // __disable_fault_irq(); // __set_FAULTMASK(0); CPU_INT08U task_err; CPU_INT08U name_err; CPU_Init(); Mem_Init(); Math_Init(); BSP_IntDisAll(); OSInit(); task_err = OSTaskCreateExt((void (*)(void *)) task_start, (void *) 0, (OS_STK *)&task_start_stk[TASK_START_STK_SIZE - 1], (INT8U ) TASK_START_PRIO, (INT16U ) TASK_START_PRIO, (OS_STK *)&task_start_stk[0], (INT32U ) TASK_START_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if (OS_TASK_NAME_EN > 0) OSTaskNameSet(TASK_START_PRIO, "task start", &name_err); #endif if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { pdebug(DEBUG_LEVEL_INFO,"create main success...\n\r"); } else { pdebug(DEBUG_LEVEL_FATAL,"create main failed...\n\r"); } OSStart(); return (1);//OSCPUUsage } /*! \brief none 串口打印任务堆栈信息 \param[in] none \param[out] none \retval none \note LH @2022.10.26 */ static void task_print() { OS_TCB *p_tcb; OS_STK_DATA stkDat; p_tcb = &OSTCBTbl[0]; char cpuusage = OSCPUUsage; /* 优先级 堆使用数量 堆空闲数量 使用率 CPU使用率 任务名字 */ term_printf(" Prio Used Free Per cpuusage TaskName\r\n"); while(p_tcb != NULL) { OSTaskStkChk(p_tcb->OSTCBPrio, &stkDat); term_printf(" %2d %5d %5d %02d%% %d %s\r\n ",p_tcb->OSTCBPrio, stkDat.OSUsed, stkDat.OSFree, (stkDat.OSUsed * 100)/(stkDat.OSUsed + stkDat.OSFree), cpuusage, p_tcb->OSTCBTaskName); p_tcb = p_tcb->OSTCBPrev; } term_printf("\r\n"); OSTimeDlyHMSM(0u, 0u, 1u, 0u); } static void task_print_task() { while(1) { task_print(); } } /*! \brief none 打印任务创建 \param[in] none \param[out] none \retval none \note LH @2022.10.11 */ static OS_STK task_printf_stk[TASK_PTZ_TASK_PRINTF_STK_SIZE]; static void creat_task_printf(void) { CPU_INT08U task_err; CPU_INT08U name_err; task_err = OSTaskCreateExt((void (*)(void *)) task_print_task, (void *) 0, (OS_STK *)&task_printf_stk[TASK_PTZ_TASK_PRINTF_STK_SIZE - 1], (INT8U ) TASK_PTZ_TASK_PRINTF_PRIO, (INT16U ) TASK_PTZ_TASK_PRINTF_PRIO, (OS_STK *)&task_printf_stk[0], (INT32U ) TASK_PTZ_TASK_PRINTF_STK_SIZE, (void *) 0, (INT16U )(OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR)); #if (OS_TASK_NAME_EN > 0) OSTaskNameSet(TASK_PTZ_TASK_PRINTF_PRIO, "task_print_task", &name_err); #endif if ((task_err == OS_ERR_NONE) && (name_err == OS_ERR_NONE)) { pdebug(DEBUG_LEVEL_INFO,"create task_print_task success...\n\r"); } else { pdebug(DEBUG_LEVEL_FATAL,"create task_print_task failed...\n\r"); } } void task_printf_init() { creat_task_printf(); }