/* * task.c * * Created on: 2024年6月24日 * Author: psx */ #include "task.h" #include "tim.h" #include "pwm.h" #include "adc.h" #include "rs485.h" #include "gpio.h" #include "flash.h" #include "sl_protocol.h" #include "mppt_control.h" #include "inflash.h" #include /** * @brief 运行指示灯 * @param * @retval */ STR_TimeSliceOffset m_runled; void Task_RunLED(void) { static uint8_t flag = RESET; flag = !flag; GPIO_WriteBit(RUN_LED_GPIO, RUN_LED_PIN, flag); return; } /** * @brief mppt控制 * @param * @retval */ STR_TimeSliceOffset m_mpptControl; void Task_mpptControl(void) { // uart_dev_write(g_gw485_uart4_handle, "hello world \n", sizeof("hello world \n")); test(); return; } /** * @brief 串口数据解析和处理 * @param * @retval */ STR_TimeSliceOffset m_usart; uint8_t RegistrationRequestFlag = 0; void Task_usart(void) { // printf(" task3******** \n"); read_and_process_uart_data(g_gw485_uart4_handle); return; } /** * @brief 看门狗 * @param * @retval */ STR_TimeSliceOffset m_wdi; void Task_wdi(void) { static uint32_t temp = 0; if (wdi_RESET == temp++) { NVIC_SystemReset(); } GPIO_WriteBit(WDI_INPUT_GPIO, WDI_INPUT_PIN, SET); GPIO_WriteBit(WDI_INPUT_GPIO, WDI_INPUT_PIN, RESET); return; } /** * @brief 接收到广播指令后,发送数据给网关,未接收到指令再次发送,最多三次,间隔时间3s * @param * @retval */ uint8_t recvbroadcast_flag = 0; device_handle g_recvBroadcastDevice; uint8_t g_recvBroadcastRegisterNumber; STR_TimeSliceOffset m_recvbroadcast; void Task_recvbroadcast(void) { m_recvbroadcast.count = recvbroadcast_reloadVal; static uint8_t run_number = 0; /* 超过三次,不再发送 */ if (run_number++ == 3 || run_number > 3) { RegistrationRequestFlag = 0; run_number = 0; TimeSliceOffset_Unregister(&m_recvbroadcast); return; } // if (g_Mppt_Para.Registration_Status == REGISTER_SUCCESS) { // TimeSliceOffset_Unregister(&m_recvbroadcast); // return; // } SL_Mppt_RegistrationRequest_pack recvpack = {0}; /* 起始标志 */ recvpack.start_Flag[0] = g_slConfigInfo.start_Flag[0]; recvpack.start_Flag[1] = g_slConfigInfo.start_Flag[1]; /* ID */ recvpack.address[0] = 0xFF; recvpack.address[1] = 0xFF; recvpack.address[2] = 0xFF; recvpack.address[3] = 0xFF; recvpack.address[4] = 0xFF; recvpack.address[5] = 0xFF; recvpack.address[6] = 0xFF; /* 功能码 */ recvpack.function_Code = SL_Function_Code_Registration_request; /* 寄存器长度 */ recvpack.register_Length_H = g_recvBroadcastRegisterNumber >> 8; recvpack.register_Length_L = g_recvBroadcastRegisterNumber; /* 注册状态 */ recvpack.registration_Status_H = g_Mppt_Para.Registration_Status >> 8; recvpack.registration_Status_L = g_Mppt_Para.Registration_Status; /* 接入节点ID */ recvpack.access_Node_ID[0] = g_slConfigInfo.address[0]; recvpack.access_Node_ID[1] = g_slConfigInfo.address[1]; recvpack.access_Node_ID[2] = g_slConfigInfo.address[2]; recvpack.access_Node_ID[3] = g_slConfigInfo.address[3]; recvpack.access_Node_ID[4] = g_slConfigInfo.address[4]; recvpack.access_Node_ID[5] = g_slConfigInfo.address[5]; recvpack.access_Node_ID[6] = g_slConfigInfo.address[6]; /* 接入节点类型 */ recvpack.access_Node_Type_H = g_Mppt_Para.Access_Node_Type >> 8; recvpack.access_Node_Type_L = g_Mppt_Para.Access_Node_Type; /* 校验位 */ // uint8_t *rpack_buf = (uint8_t *)&recvpack; uint16_t crc = CheckFunc((uint8_t *)&recvpack, SL_MPPT_REGISTRATIONREQUEST_PACK_SIZE - 3); recvpack.check_Bit_H = crc >> 8; recvpack.check_Bit_L = crc; /* 结束标志 */ recvpack.end_Flag = g_slConfigInfo.end_Flag; /* 校验位 */ for (uint8_t var = 0; var < 10; ++var) { Delay_Ms(randomDelay()); if (!Check_485_bus_busy(g_recvBroadcastDevice)) { if (recvbroadcast_flag == 1) { recvbroadcast_flag = 0; run_number = 0; return; } uart_dev_write(g_recvBroadcastDevice, (uint8_t *)&recvpack, SL_MPPT_REGISTRATIONREQUEST_PACK_SIZE + 1); if (g_recvBroadcastDevice == g_bat485_uart3_handle) { USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); } else { USART_ITConfig(USART4, USART_IT_RXNE, ENABLE); } break; } } } /** * @brief 初始化各个寄存器 * @param * @retval */ void g_Mppt_Para_Init(void) { g_Mppt_Para.Registration_Status = UNREGISTER; g_Mppt_Para.address[0] = g_slConfigInfo.address[0]; g_Mppt_Para.address[1] = g_slConfigInfo.address[1]; g_Mppt_Para.address[2] = g_slConfigInfo.address[2]; g_Mppt_Para.address[3] = g_slConfigInfo.address[3]; g_Mppt_Para.address[4] = g_slConfigInfo.address[4]; g_Mppt_Para.address[5] = g_slConfigInfo.address[5]; g_Mppt_Para.address[6] = g_slConfigInfo.address[6]; g_Mppt_Para.Access_Node_Type = g_slConfigInfo.Access_Node_Type; g_Mppt_Para.Communication_Methods = g_slConfigInfo.Communication_Methods; g_Mppt_Para.Battery_Voltage = 0; g_Mppt_Para.Battery_temperature = 0; g_Mppt_Para.Remaining_Battery_Bower = 0; g_Mppt_Para.Solar_Open_Circuit_Voltage1 = 0; g_Mppt_Para.Solar_Open_Circuit_Voltage2 = 0; } /** * @brief 初始化各个任务 * @param * @retval */ void task_Init(void) { read_config_info(); g_Mppt_Para_Init(); TimeSliceOffset_Register(&m_runled, Task_RunLED, runled_reloadVal, runled_offset); TimeSliceOffset_Register(&m_mpptControl, Task_mpptControl, mpptControl_reloadVal, mpptControl_offset); TimeSliceOffset_Register(&m_usart, Task_usart, usart_reloadVal, usart_offset); TimeSliceOffset_Register(&m_wdi, Task_wdi, wdi_reloadVal, wdi_offset); TimeSliceOffset_Start(); /* 启动时间片轮询 */ } /** * @brief 初始化所需外设和寄存器中的变量 * @param * @retval */ void hardware_Init(void) { TIM3_Init(); uart_dev_init(); PWM_TIM_Configuration(); ADC_all_Init(); RUN_LED_Init(); G_FFMOS_CON_Init(); WDI_INPUT_Init(); BEEP_Init(); POW_OUT_CON_Init(); DSG_PROT_Init(); SPI_Flash_Init(); Set_duty_ratio(0.5); }