From 3ea22514fd5b38b22d5050a9e0b52c7e0781a21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B7=E5=BA=8A=E5=B0=B1=E7=8A=AF=E5=9B=B0?= <11730503+psx123456@user.noreply.gitee.com> Date: Sat, 8 Feb 2025 17:22:35 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=8A=B6=E6=80=81=E6=9C=BA=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0HY=E5=8D=8F=E8=AE=AE=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 3 +- APP/application/Src/start.c | 3 + APP/businessLogic/Inc/bl_usart.h | 13 + APP/businessLogic/Inc/parameter.h | 1 + APP/businessLogic/Src/bl_usart.c | 2416 ++++++++++++++++++++++++- APP/businessLogic/Src/inFlash.c | 2 +- APP/businessLogic/Src/interruptSend.c | 9 + APP/businessLogic/Src/parameter.c | 15 + APP/businessLogic/Src/task.c | 5 +- APP/functionalModule/Src/FM_GPIO.c | 6 +- APP/functionalModule/Src/capture.c | 10 +- APP/hardwareDriver/Src/HD_GPIO.c | 3 + Core/Inc/main.h | 1 + Core/Inc/stm32g4xx_it.h | 1 + Core/Src/gpio.c | 4 +- Core/Src/main.c | 28 +- Core/Src/stm32g4xx_it.c | 14 + chargeController.ioc | 4 +- 18 files changed, 2497 insertions(+), 41 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index b69fbd0..3cc0298 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -40,6 +40,7 @@ "usart.h": "c", "w25qxx.h": "c", "w25q256.h": "c", - "gpio.h": "c" + "gpio.h": "c", + "bl_usart.h": "c" } } \ No newline at end of file diff --git a/APP/application/Src/start.c b/APP/application/Src/start.c index 31f5b63..d67370c 100644 --- a/APP/application/Src/start.c +++ b/APP/application/Src/start.c @@ -59,6 +59,9 @@ void startInfo(void) void start(void) { Init(); + + uartCommonInit(); + task_Init(); startInfo(); diff --git a/APP/businessLogic/Inc/bl_usart.h b/APP/businessLogic/Inc/bl_usart.h index c280148..54b9780 100644 --- a/APP/businessLogic/Inc/bl_usart.h +++ b/APP/businessLogic/Inc/bl_usart.h @@ -7,6 +7,11 @@ #include "chargControlTypes.h" #include "uart_dev.h" +/* 是否使能充电控制盒的HY协议 */ +#define HY_ChargeControlBox_PROTOCOL_ENABLE + + + /* SL协议读取寄存器最大地址 */ @@ -35,6 +40,14 @@ #define floatMagnification 10.0f +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + +#define maxDataLenHY 50 + +#endif + + +void uartCommonInit(void); uint16_t checkModebusCrc(uint8_t *arr_buff, uint8_t len); diff --git a/APP/businessLogic/Inc/parameter.h b/APP/businessLogic/Inc/parameter.h index 35d15a8..9d40aa1 100644 --- a/APP/businessLogic/Inc/parameter.h +++ b/APP/businessLogic/Inc/parameter.h @@ -85,6 +85,7 @@ uint8_t getMosTemperState(void); void setMosTemperState(uint8_t state); BOOL getCheckImpedanceState(void); void setCheckImpedanceState(void); +void resetCheckImpedanceState(void); void setLastTime(timeInfo time); timeInfo getLastTime(void); diff --git a/APP/businessLogic/Src/bl_usart.c b/APP/businessLogic/Src/bl_usart.c index 0f8bcae..dcc5217 100644 --- a/APP/businessLogic/Src/bl_usart.c +++ b/APP/businessLogic/Src/bl_usart.c @@ -12,6 +12,76 @@ #include "FM_RTC.h" #include "SOE.h" #include "abnormalManage.h" +#include "timeSliceOffset.h" + +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + +#define HY_hardWordIDStartAddr 8192 +#define HY_hardWordIDSize 6 +#define HY_communicationIDStartAddr (HY_hardWordIDStartAddr + HY_hardWordIDSize) +#define HY_communicationIDSize 4 +static uint8_t HY_hardWordID[HY_hardWordIDSize] = {0x48, 0x59, 0x30, 0x30, 0x30, 0x31}; +static uint8_t HY_communicationID[HY_communicationIDSize] = {0x00, 0x00, 0x00, 0x01}; +static uint8_t HY_startFlag = 0x68; +static uint8_t HY_endFlag = 0x16; + +/* 帧序号 */ +uint8_t HY_frameNumber[4] = {0}; + +#define HY_device g_gw485_uart2_handle + +static void HY_writeHardWordID_Flash(void); +static void HY_readHardWordID_Flash(void); +static void HY_writeCommunicationID_Flash(void); +static void HY_readCommunicationID_Flash(void); + + +/* HY进入配置模式延迟后退出 */ +#define HY_configurationModeDelayedExit_reloadVal 1000 /* 任务执行间隔 */ +#define HY_configurationModeDelayedExit_offset 0 /* 任务执行偏移量 */ +STR_TimeSliceOffset m_HY_configurationModeDelayedExit; +/* 计时 */ +static uint8_t HY_configurationModeDelay = 0; +/* 是否进入配置模式标志 */ +static uint8_t HY_configurationModeFlag = 0; +void Task_HY_configurationModeDelayedExit(void) +{ + if (120 == ++HY_configurationModeDelay) { + HY_configurationModeDelay = 0; + HY_configurationModeFlag = 0; + TimeSliceOffset_Unregister(&m_HY_configurationModeDelayedExit); + m_HY_configurationModeDelayedExit.runFlag = 0; + } +} + +/** + * @brief 启动HY进入配置模式 + * @param + * @retval + */ +void HY_configurationMode_start(void) +{ + HY_configurationModeFlag = 1; + HY_configurationModeDelay = 0; + TimeSliceOffset_Register(&m_HY_configurationModeDelayedExit, Task_HY_configurationModeDelayedExit + , HY_configurationModeDelayedExit_reloadVal, HY_configurationModeDelayedExit_offset); +} + +/** + * @brief HY退出配置模式 + * @param + * @retval + */ +void HY_configurationMode_stop(void) +{ + HY_configurationModeFlag = 0; + TimeSliceOffset_Unregister(&m_HY_configurationModeDelayedExit); + m_HY_configurationModeDelayedExit.runFlag = 0; + HY_configurationModeDelay = 0; +} + +#endif + /* 状态机 */ typedef enum { @@ -32,6 +102,38 @@ typedef enum { readCfgLengthSL, /* 接收到SL读取配置文件长度 */ readSOEStartAddr, /* 接收到SOE起始读取位 */ readSOELength, /* 接收到SOE读取长度 */ + +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + startFlagHY, /* 接收到HY帧头 */ + hardWordIDHY, /* 接收到HY硬件ID */ + communicationIDHY, /* 接收到HY通信ID */ + controlWordHY, /* 接收到HY控制字 */ + dataLengthHY, /* 接收到HY数据长度 */ + + batteryStatusHY, /* 接收到HY电池数据 */ + electricityStatisticsHY, /* 接收到HY电量统计 */ + sensorNumberConfigurationHY, /* 接收到HY传感器号码配置 */ + sensorNumberInquiryHY, /* 接收到HY传感器号码查询 */ + resetInstructionHY, /* 接收到HY复位指令 */ + chargeControlConfigurationHY, /* 接收到HY充电控制配置 */ + chargeControlQueryHY, /* 接收到HY充电控制查询 */ + configureTimeHY, /* 接收到HY时间配置 */ + queryTimeHY, /* 接收到HY时间查询 */ + configureProtocolTypeHY, /* 接收到HY配置协议类型 */ + // responseProtocolTypeHY, /* 接收到HY响应协议类型 */ + queryControlBoxConfigurationHY, /* 接收到HY查询电池控制盒当前配置 */ + querySoftwareVersionHY, /* 接收到HY查询电池控制盒软件版本 */ + enterConfigurationModeHY, /* 接收到HY配置模式 */ + configureHardwareIDHY, /* 接收到HY配置控制盒硬件ID号 */ + hardwareID_communicationIDQueryHY, /* 接收到HY控制盒硬件ID号及通信ID号(原传感器号)查询 */ + modifyCommunicationIDHY, /* 接收到HY修改通信ID号(原传感器号) */ + checkMotherboardTemperatureHY, /* 接收到HY查询主板温度值 */ + + // checkCodeHY, /* 接收到HY校验位 */ + // endFlagHY, /* 接收到HY帧尾 */ +#endif + + } uartStateMachine; /* 功能码 */ @@ -46,6 +148,40 @@ typedef enum SL_Function_Code_Read_SOE = 0x05, /* 读取SOE */ }SL_MsgFunctionCode; +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE +/* HY协议控制字 */ +typedef enum +{ + HY_batteryStatus = 0x60, /* 电池状态数据报 */ + HY_electricityStatistics = 0x61, /* 电量统计数据报 */ + HY_sensorNumberConfiguration = 0x62, /* 传感器号码配置 */ + HY_sensorNumberInquiry = 0x63, /* 传感器号码查询 */ + + HY_resetInstruction = 0x66, /* 复位指令 */ + + HY_chargeControlConfiguration = 0x6C, /* 充电控制配置 */ + HY_chargeControlQuery = 0x6D, /* 充电控制查询 */ + HY_configureTime = 0x6E, /* 配置时间 */ + HY_queryTime = 0x6F, /* 查询时间 */ + + HY_configureProtocolType = 0x70, /* 配置协议类型 */ + HY_responseProtocolType = 0x71, /* 响应配置协议类型 */ + + HY_queryControlBoxConfiguration = 0x74, /* 查询电池控制盒当前配置 */ + HY_querySoftwareVersion = 0x75, /* 查询电池控制盒软件版本 */ + HY_enterConfigurationMode = 0x76, /* 进入配置模式 */ + + HY_configureHardwareID = 0x7B, /* 配置控制盒硬件ID号 */ + HY_hardwareID_communicationIDQuery = 0x7C, /* 控制盒硬件ID号及通信ID号(原传感器号)查询 */ + HY_modifyCommunicationID = 0x7D, /* 修改通信ID号(原传感器号) */ + HY_checkMotherboardTemperature = 0x7E, /* 查询主板温度值 */ + +}HY_MsgFunctionCode; +#endif + + + + /* 寄存器地址 */ typedef enum { @@ -115,7 +251,7 @@ typedef enum { #define gw485RxBufferSize 256 -/* 计时参数,2min后没解析整个配置文件,丢掉当前数据 */ +/* 计时参数,1min后没解析整个配置文件,丢掉当前数据 */ static uint32_t gw485CfgTime = 0; static uint8_t gw485CfgFlag = 0; //0:解析完成或未下发配置文件 1:下发配置文件中 2:上次配置文件下发时间过长 @@ -151,6 +287,32 @@ static BOOL analysisReadCfgLengthSL(void); static BOOL analysisReadSOEStartAddr(void); static BOOL analysisReadSOELength(void); +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + static BOOL analysisStartFlagHY(void); + static BOOL analysisHardWordIDHY(void); + static BOOL analysisCommunicationIDHY(void); + static BOOL analysisControlWordHY(void); + static BOOL analysisDataLengthHY(void); + static BOOL analysisBatteryStatusHY(void); + static BOOL analysisElectricityStatisticsHY(void); + static BOOL analysisSensorNumberConfigurationHY(void); + static BOOL analysisSensorNumberInquiryHY(void); + static BOOL analysisResetInstructionHY(void); + static BOOL analysisChargeControlConfigurationHY(void); + static BOOL analysisChargeControlQueryHY(void); + static BOOL analysisConfigureTimeHY(void); + static BOOL analysisQueryTimeHY(void); + static BOOL analysisConfigureProtocolTypeHY(void); + static BOOL analysisQueryControlBoxConfigurationHY(void); + static BOOL analysisQuerySoftwareVersionHY(void); + static BOOL analysisEnterConfigurationModeHY(void); + static BOOL analysisConfigureHardwareIDHY(void); + static BOOL analysisHardwareID_communicationIDQueryHY(void); + static BOOL analysisModifyCommunicationIDHY(void); + static BOOL analysisCheckMotherboardTemperatureHY(void); + // static BOOL analysisCheckCodeHY(void); + // static BOOL analysisEndFlagHY(void); +#endif /* SL协议寄存器解析 */ static uint16_t SL_ReadRegisterSolarOpenCircuitVoltage(void *pMsg); @@ -307,6 +469,27 @@ BOOL checkCrcSl(void) return FALSE; } +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE +/** + * @brief 校验算法 + * @param 采用累加和取反的校验方式,将终端号码、传感器号码、控制字、数据长度和数据区的所有字节进行算术累加,抛弃高位,只保留最后单字节,将单字节取反; + * @retval + */ +uint8_t HY_CheckFunc(uint8_t *arr_buff, uint8_t len) +{ + uint8_t temp = 0x00; + uint32_t sum = 0x00; + + for(uint8_t i = 0; i < len; i++) { + sum += *arr_buff++; + } + + temp = (~sum) & 0xff; + + return temp; +} +#endif + /** * @brief 状态机函数 * @param @@ -383,6 +566,106 @@ void stateMachine(device_handle device) else if (state == readSOELength) { analysisReadSOELength(); } + +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + else if (state == startFlagHY) { + analysisStartFlagHY(); + } + + else if (state == hardWordIDHY) { + analysisHardWordIDHY(); + } + + else if (state == communicationIDHY) { + analysisCommunicationIDHY(); + } + + else if (state == controlWordHY) { + analysisControlWordHY(); + } + + else if (state == dataLengthHY) { + analysisDataLengthHY(); + } + + else if (state == batteryStatusHY) { + analysisBatteryStatusHY(); + } + + else if (state == electricityStatisticsHY) { + analysisElectricityStatisticsHY(); + } + + else if (state == sensorNumberConfigurationHY) { + analysisSensorNumberConfigurationHY(); + } + + else if (state == sensorNumberInquiryHY) { + analysisSensorNumberInquiryHY(); + } + + else if (state == resetInstructionHY) { + analysisResetInstructionHY(); + } + + else if (state == chargeControlConfigurationHY) { + analysisChargeControlConfigurationHY(); + } + + else if (state == chargeControlQueryHY) { + analysisChargeControlQueryHY(); + } + + else if (state == configureTimeHY) { + analysisConfigureTimeHY(); + } + + else if (state == queryTimeHY) { + analysisQueryTimeHY(); + } + + else if (state == configureProtocolTypeHY) { + analysisConfigureProtocolTypeHY(); + } + + else if (state == queryControlBoxConfigurationHY) { + analysisQueryControlBoxConfigurationHY(); + } + + else if (state == querySoftwareVersionHY) { + analysisQuerySoftwareVersionHY(); + } + + else if (state == enterConfigurationModeHY) { + analysisEnterConfigurationModeHY(); + } + + else if (state == configureHardwareIDHY) { + analysisConfigureHardwareIDHY(); + } + + else if (state == hardwareID_communicationIDQueryHY) { + analysisHardwareID_communicationIDQueryHY(); + } + + else if (state == modifyCommunicationIDHY) { + analysisModifyCommunicationIDHY(); + } + + else if (state == checkMotherboardTemperatureHY) { + analysisCheckMotherboardTemperatureHY(); + } +#endif +} + +void uartCommonInit(void) +{ +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + HY_readCommunicationID_Flash(); + HY_readHardWordID_Flash(); +#endif + + } void gw485DataAnalysis(device_handle device) @@ -398,7 +681,7 @@ void gw485DataAnalysis(device_handle device) gw485RxBufferIndex = 0; state = wait; } - + /* 60S所有配置文件未传输完成,将数据清零 */ if (gw485CfgFlag == 1) { gw485CfgTime++; @@ -415,9 +698,12 @@ void gw485DataAnalysis(device_handle device) // tickstart = HAL_GetTick(); // while (gw485RxBufferIndex != 0 && ((HAL_GetTick() - tickstart) < 5) ) { - stateMachine(device); +// stateMachine(device); // } - + + if (state != wait) { + stateMachine(device); + } } /** @@ -427,7 +713,15 @@ void gw485DataAnalysis(device_handle device) */ BOOL analysisWait(void) { - static uint16_t maxLen = 2; + static const uint16_t maxLen = 2; + +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + /* 解析HY协议的包头 */ + if (gw485RxBuffer[0] == HY_startFlag) { + state = startFlagHY; + return TRUE; + } +#endif /* 解析SL协议的包头 */ if (gw485RxBufferIndex >= 2) { @@ -453,8 +747,8 @@ BOOL analysisWait(void) * @retval TRUE:解析成功 FALSE:解析失败 */ BOOL analysisStartFlagSL(void) -{ - static uint16_t maxLen = 9; +{ + static const uint16_t maxLen = 9; /* 解析SL协议设备地址 */ if (gw485RxBufferIndex >= 9) { @@ -481,8 +775,6 @@ BOOL analysisStartFlagSL(void) } } - - if (gw485RxBufferIndex < maxLen) { return FALSE; } @@ -500,7 +792,7 @@ BOOL analysisStartFlagSL(void) */ BOOL analysisAddressSL(void) { - static uint16_t maxLen = 10; + static const uint16_t maxLen = 10; /* 解析SL功能码 */ if (gw485RxBufferIndex >= 10) { @@ -556,7 +848,7 @@ BOOL analysisAddressSL(void) */ BOOL analysisFunctionCodeSL(void) { - static uint16_t maxLen = 12; + static const uint16_t maxLen = 12; /* 解析读取寄存器起始位置 */ if ((gw485RxBufferIndex >= 12) && (gw485RxBuffer[9] == SL_Function_Code_Read_Register)) { @@ -650,7 +942,7 @@ BOOL analysisFunctionCodeSL(void) */ BOOL analysisReadRegStartAddressSL(void) { - static uint16_t maxLen = 14; + static const uint16_t maxLen = 14; /* 解析读取寄存器长度 */ if (gw485RxBufferIndex >= 14) { @@ -779,7 +1071,7 @@ void analysisEndFlagSL(device_handle device) */ BOOL analysisWriteRegStartAddressSL(void) { - static uint16_t maxLen = 14; + static const uint16_t maxLen = 14; /* 解析写入寄存器长度 */ if (gw485RxBufferIndex >= 14) { @@ -852,7 +1144,7 @@ BOOL analysisWriteRegStartNumberSL(void) */ BOOL analysisRegLengthSL(void) { - static uint16_t maxLen = 12; + static const uint16_t maxLen = 12; /* crc校验 */ if (gw485RxBufferIndex >= 12) { uint32_t tempRegStatus = 0; @@ -914,7 +1206,7 @@ BOOL analysisRegStatusSL(void) */ BOOL analysisCfgFramesNumSL(void) { - static uint16_t maxLen = 14; + static const uint16_t maxLen = 14; /* 解析下发配置文件数据内容长度 */ if (gw485RxBufferIndex >= maxLen) { @@ -2574,3 +2866,2097 @@ void SL_MsgProcFunc_Read_SOE(device_handle device, void *pMsg, uint32_t MsgLen) uart_insertDataSend(device, 15 + replayPackDatalen); } + +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + +/** + * @brief 状态 startFlagHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisStartFlagHY(void) +{ + static const uint16_t maxLen = 7; + + /* 解析HY协议硬件ID */ + if (gw485RxBufferIndex >= 7) { + if (gw485RxBuffer[1] == HY_hardWordID[0] + && gw485RxBuffer[2] == HY_hardWordID[1] + && gw485RxBuffer[3] == HY_hardWordID[2] + && gw485RxBuffer[4] == HY_hardWordID[3] + && gw485RxBuffer[5] == HY_hardWordID[4] + && gw485RxBuffer[6] == HY_hardWordID[5]) { + state = hardWordIDHY; + return TRUE; + } + + else if (gw485RxBuffer[1] == 0xFF + && gw485RxBuffer[2] == 0xFF + && gw485RxBuffer[3] == 0xFF + && gw485RxBuffer[4] == 0xFF + && gw485RxBuffer[5] == 0xFF + && gw485RxBuffer[6] == 0xFF) { + state = hardWordIDHY; + return TRUE; + } + } + + if (gw485RxBufferIndex < maxLen) { + return FALSE; + } + + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; +} + +/** + * @brief 状态 hardWordIDHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisHardWordIDHY(void) +{ + static const uint16_t maxLen = 11; + + /* 解析HY协议通信ID */ + if (gw485RxBufferIndex >= 11) { + if (gw485RxBuffer[7] == HY_communicationID[0] + && gw485RxBuffer[8] == HY_communicationID[1] + && gw485RxBuffer[9] == HY_communicationID[2] + && gw485RxBuffer[10] == HY_communicationID[3]) { + state = communicationIDHY; + return TRUE; + } + // log_info("in data: 0x%x 0x%x 0x%x 0x%x \n", gw485RxBuffer[7], gw485RxBuffer[8], gw485RxBuffer[9], gw485RxBuffer[10]); + // log_info("HY_communicationID: 0x%x 0x%x 0x%x 0x%x \n", HY_communicationID[0], HY_communicationID[1], + // HY_communicationID[2], HY_communicationID[3]); + + if (gw485RxBuffer[7] == 0xFF + && gw485RxBuffer[8] == 0xFF + && gw485RxBuffer[9] == 0xFF + && gw485RxBuffer[10] == 0xFF) { + state = communicationIDHY; + return TRUE; + } + } + + if (gw485RxBufferIndex < maxLen) { + return FALSE; + } + + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; +} + +/** + * @brief 状态 communicationIDHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisCommunicationIDHY(void) +{ + /* 硬件ID、通信ID全为0xFF时,控制字只能为查询ID */ + if (gw485RxBuffer[1] == 0xFF + && gw485RxBuffer[2] == 0xFF + && gw485RxBuffer[3] == 0xFF + && gw485RxBuffer[4] == 0xFF + && gw485RxBuffer[5] == 0xFF + && gw485RxBuffer[6] == 0xFF + && gw485RxBuffer[7] == 0xFF + && gw485RxBuffer[8] == 0xFF + && gw485RxBuffer[9] == 0xFF + && gw485RxBuffer[10] == 0xFF) { + + if (gw485RxBuffer[11] == HY_sensorNumberInquiry + || gw485RxBuffer[11] == HY_hardwareID_communicationIDQuery) { + state = controlWordHY; + return TRUE; + } + } + + else { + if (gw485RxBuffer[11] == HY_batteryStatus + || gw485RxBuffer[11] == HY_electricityStatistics + || gw485RxBuffer[11] == HY_sensorNumberConfiguration + || gw485RxBuffer[11] == HY_resetInstruction + || gw485RxBuffer[11] == HY_chargeControlConfiguration + || gw485RxBuffer[11] == HY_chargeControlQuery + || gw485RxBuffer[11] == HY_configureTime + || gw485RxBuffer[11] == HY_queryTime + || gw485RxBuffer[11] == HY_configureProtocolType + || gw485RxBuffer[11] == HY_responseProtocolType + || gw485RxBuffer[11] == HY_queryControlBoxConfiguration + || gw485RxBuffer[11] == HY_querySoftwareVersion + || gw485RxBuffer[11] == HY_enterConfigurationMode + || gw485RxBuffer[11] == HY_configureHardwareID + || gw485RxBuffer[11] == HY_modifyCommunicationID + || gw485RxBuffer[11] == HY_checkMotherboardTemperature) { + state = controlWordHY; + return TRUE; + } + } + + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; +} + +/** + * @brief 状态 controlWordHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisControlWordHY(void) +{ + static const uint16_t maxLen = 14; + + /* 解析数据长度 */ + if (gw485RxBufferIndex >= 14) { + uint32_t tempDataLen = 0; + tempDataLen = (gw485RxBuffer[12] << 8) | gw485RxBuffer[13]; + + if (tempDataLen >= 1 && tempDataLen <= maxDataLenHY) { + frameLength = tempDataLen + 16; + state = dataLengthHY; + return TRUE; + } + } + + if (gw485RxBufferIndex < maxLen) { + return FALSE; + } + + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; +} + +/** + * @brief 状态 dataLengthHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisDataLengthHY(void) +{ + if (gw485RxBuffer[11] == HY_batteryStatus) { + state = batteryStatusHY; + } + + else if (gw485RxBuffer[11] == HY_electricityStatistics) { + state = electricityStatisticsHY; + } + + else if (gw485RxBuffer[11] == HY_sensorNumberConfiguration) { + state = sensorNumberConfigurationHY; + } + + else if (gw485RxBuffer[11] == HY_sensorNumberInquiry) { + state = sensorNumberInquiryHY; + } + + else if (gw485RxBuffer[11] == HY_resetInstruction) { + state = resetInstructionHY; + } + + else if (gw485RxBuffer[11] == HY_chargeControlConfiguration) { + state = chargeControlConfigurationHY; + } + + else if (gw485RxBuffer[11] == HY_chargeControlQuery) { + state = chargeControlQueryHY; + } + + else if (gw485RxBuffer[11] == HY_configureTime) { + state = configureTimeHY; + } + + else if (gw485RxBuffer[11] == HY_queryTime) { + state = queryTimeHY; + } + + else if (gw485RxBuffer[11] == HY_configureProtocolType) { + state = configureProtocolTypeHY; + } + + // else if (gw485RxBuffer[11] == HY_responseProtocolType) { + // state = queryControlBoxConfigurationHY; + // } + + else if (gw485RxBuffer[11] == HY_queryControlBoxConfiguration) { + state = queryControlBoxConfigurationHY; + } + + else if (gw485RxBuffer[11] == HY_querySoftwareVersion) { + state = querySoftwareVersionHY; + } + + else if (gw485RxBuffer[11] == HY_enterConfigurationMode) { + state = enterConfigurationModeHY; + } + + else if (gw485RxBuffer[11] == HY_configureHardwareID) { + state = configureHardwareIDHY; + } + + else if (gw485RxBuffer[11] == HY_hardwareID_communicationIDQuery) { + state = hardwareID_communicationIDQueryHY; + } + + else if (gw485RxBuffer[11] == HY_modifyCommunicationID) { + state = modifyCommunicationIDHY; + } + + else if (gw485RxBuffer[11] == HY_checkMotherboardTemperature) { + state = checkMotherboardTemperatureHY; + } + + return TRUE; +} + +/** + * @brief 状态 HY_batteryStatus + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisBatteryStatusHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("HY_batteryStatus \n"); + + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + if (gw485RxBuffer[18] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[19] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_batteryStatus; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(38 >> 8); + *(replay_pack + 1) = (uint8_t)38; + replay_pack += 2; + + /* 数据域 */ + float temp; + //电池电压 + // *(float *)(replay_pack) = getBatteryVoltage(); + temp = getBatteryVoltage(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //输出电流 + // *(float *)(replay_pack) = getDischargCurrent(); + temp = getDischargCurrent(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //充电电流 + // *(float *)(replay_pack) = getChargCurrent(); + temp = getChargCurrent(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //剩余电量 + // *(float *)(replay_pack) = getSOC(); + temp = getSOC(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //充电开路电压 + // *(float *)(replay_pack) = getSolarOpenCircuitVoltage(); + temp = getSolarOpenCircuitVoltage(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //充电开关状态 + *(replay_pack) = getChargMosState(); + replay_pack += 1; + //充电电流 + // *(float *)(replay_pack) = getChargCurrent(); + temp = getChargCurrent(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //充电开路电压 + // *(float *)(replay_pack) = getSolarOpenCircuitVoltage(); + temp = getSolarOpenCircuitVoltage(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //充电开关状态 + *(replay_pack) = getChargMosState(); + replay_pack += 1; + //工作温度 + // *(float *)(replay_pack) = getHighSideMosTemperature(); + temp = getHighSideMosTemperature(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 52); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + uart_insertDataSend(HY_device, 54); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 electricityStatisticsHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisElectricityStatisticsHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisElectricityStatisticsHY \n"); + + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + //比较校验位和结束标志 + if (gw485RxBuffer[18] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[19] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_electricityStatistics; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(16 >> 8); + *(replay_pack + 1) = (uint8_t)16; + replay_pack += 2; + + /* 数据域 */ + //统计时长 + float tempF; + uint32_t tempU32; + timeInfo time1, time2; + getRTC_Time(&time1); + time2 = getLastTime(); + tempU32 = differTime(&time1, &time2); + setLastTime(time1); + memcpy(replay_pack, &tempU32, sizeof(uint32_t)); + replay_pack += 4; + + //总消耗电量 + tempF = getTotalElectricityConsumption(); + totalElectricityConsumptionInt(0); + memcpy(replay_pack, &tempF, sizeof(float)); + replay_pack += 4; + + //总充电电量 + tempF = getTotalChargCapacity(); + totalChargCapacityInt(0); + memcpy(replay_pack, &tempF, sizeof(float)); + replay_pack += 4; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 30); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 32); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 sensorNumberConfigurationHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisSensorNumberConfigurationHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisSensorNumberConfigurationHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 比较数据域中的硬件ID是否正确 */ + uint8_t flag = 0; + if (gw485RxBuffer[18] != HY_hardWordID[0] + || gw485RxBuffer[19] != HY_hardWordID[1] + || gw485RxBuffer[20] != HY_hardWordID[2] + || gw485RxBuffer[21] != HY_hardWordID[3] + || gw485RxBuffer[22] != HY_hardWordID[4] + || gw485RxBuffer[23] != HY_hardWordID[5]) { + flag = 1; + // state = wait; + // gw485RxBufferIndex--; + // memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + // return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + /* 保存要修改的通信ID */ + HY_communicationID[0] = gw485RxBuffer[24]; + HY_communicationID[1] = gw485RxBuffer[25]; + HY_communicationID[2] = gw485RxBuffer[26]; + HY_communicationID[3] = gw485RxBuffer[27]; + HY_writeCommunicationID_Flash(); + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_sensorNumberConfiguration; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + if (flag) { + *(replay_pack) = 0x00; + } else { + *(replay_pack) = 0xFF; + } + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 sensorNumberInquiryHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisSensorNumberInquiryHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisSensorNumberInquiryHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_sensorNumberInquiry; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(14 >> 8); + *(replay_pack + 1) = (uint8_t)14; + replay_pack += 2; + + /* 数据域 */ + //硬件ID + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + //通信ID + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 28); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 30); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 resetInstructionHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisResetInstructionHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisResetInstructionHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_sensorNumberInquiry; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + *(replay_pack) = 0xFF; + replay_pack++; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 chargeControlConfigurationHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisChargeControlConfigurationHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisSensorNumberInquiryHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + /* 判断打开还是关闭充电 */ + uint8_t flag = 0; + if (gw485RxBuffer[19] == 0x00) { + beginChargWork(); + } else if (gw485RxBuffer[19] == 0x01) { + stopChargWork(); + } else { + // state = wait; + // gw485RxBufferIndex--; + // memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + // return FALSE; + flag = 1; + } + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_chargeControlConfiguration; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + if (flag) { + *(replay_pack) = 0x00; + } else { + *(replay_pack) = 0xFF; + } + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 chargeControlQueryHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisChargeControlQueryHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisChargeControlQueryHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_chargeControlQuery; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(6 >> 8); + *(replay_pack + 1) = (uint8_t)6; + replay_pack += 2; + + /* 数据域 */ + //接口状态 + if (getChargControlFlag() + && getDutyRatio() > 0 + && getDutyRatio() < 1) { + *(replay_pack) = 0x01; + *(replay_pack + 1) = 0x01; + } else { + *(replay_pack) = 0x00; + *(replay_pack + 1) = 0x00; + } + replay_pack += 2; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 20); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 22); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 configureTimeHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisConfigureTimeHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisChargeControlQueryHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + timeInfo timeTemp; + timeTemp.year = gw485RxBuffer[18]; + timeTemp.month = gw485RxBuffer[19]; + timeTemp.day = gw485RxBuffer[20]; + timeTemp.hour = gw485RxBuffer[21]; + timeTemp.minute = gw485RxBuffer[22]; + timeTemp.second = gw485RxBuffer[23]; + setRTC_Time(&timeTemp); + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_configureTime; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + *(replay_pack) = 0xFF; + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 queryTimeHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisQueryTimeHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisQueryTimeHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_queryTime; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(10 >> 8); + *(replay_pack + 1) = (uint8_t)10; + replay_pack += 2; + + /* 数据域 */ + //时间 + timeInfo timeTemp; + getRTC_Time(&timeTemp); + *(replay_pack + 0) = timeTemp.year; + *(replay_pack + 1) = timeTemp.month; + *(replay_pack + 2) = timeTemp.day; + *(replay_pack + 3) = timeTemp.hour; + *(replay_pack + 4) = timeTemp.minute; + *(replay_pack + 5) = timeTemp.second; + replay_pack += 6; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 24); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 26); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 configureProtocolTypeHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisConfigureProtocolTypeHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisConfigureProtocolTypeHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 判断协议类型 */ + uint8_t flag = 0; + if (gw485RxBuffer[16] == 0x01) { + g_cfgParameter.gw485_Baud = 9600; + Init_GW485_uart(g_cfgParameter.gw485_Baud); + } else if (gw485RxBuffer[16] == 0x02) { + g_cfgParameter.gw485_Baud = 115200; + Init_GW485_uart(g_cfgParameter.gw485_Baud); + } else { + flag = 1; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_responseProtocolType; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + if (flag) { + *(replay_pack) = 0x00; + } else { + *(replay_pack) = 0x01; + } + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 queryControlBoxConfigurationHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisQueryControlBoxConfigurationHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisQueryControlBoxConfigurationHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_queryControlBoxConfiguration; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(8 >> 8); + *(replay_pack + 1) = (uint8_t)8; + replay_pack += 2; + + /* 数据域 */ + //协议类型 + if (g_cfgParameter.gw485_Baud == 9600) { + *(replay_pack) = 0x01; + } else if (g_cfgParameter.gw485_Baud == 115200) { + *(replay_pack) = 0x02; + } else { + *(replay_pack) = 0x00; + } + replay_pack += 1; + + //电压等级 + *(replay_pack) = 0x00; + replay_pack += 3; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 22); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 24); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 querySoftwareVersionHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisQuerySoftwareVersionHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisQuerySoftwareVersionHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_querySoftwareVersion; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(17 >> 8); + *(replay_pack + 1) = (uint8_t)17; + replay_pack += 2; + + /* 数据域 */ + //版本信息 + memcpy(replay_pack, getVersionnInformation(), 13); + replay_pack += 13; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 31); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 33); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 enterConfigurationModeHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisEnterConfigurationModeHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisEnterConfigurationModeHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + HY_configurationMode_start(); + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_enterConfigurationMode; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + *(replay_pack) = 0xFF; + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 configureHardwareIDHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisConfigureHardwareIDHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisConfigureHardwareIDHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 判断是否进入配置模式 */ + uint8_t flag = 0; + if (HY_configurationModeFlag == 1) { + HY_hardWordID[0] = gw485RxBuffer[18]; + HY_hardWordID[1] = gw485RxBuffer[19]; + HY_hardWordID[2] = gw485RxBuffer[20]; + HY_hardWordID[3] = gw485RxBuffer[21]; + HY_hardWordID[4] = gw485RxBuffer[22]; + HY_hardWordID[5] = gw485RxBuffer[23]; + HY_writeHardWordID_Flash(); + HY_configurationMode_stop(); + } else { + flag = 1; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_configureHardwareID; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + if (flag) { + *(replay_pack) = 0x00; + } else { + *(replay_pack) = 0xFF; + } + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 hardwareID_communicationIDQueryHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisHardwareID_communicationIDQueryHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisHardwareID_communicationIDQueryHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_hardwareID_communicationIDQuery; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(14 >> 8); + *(replay_pack + 1) = (uint8_t)14; + replay_pack += 2; + + /* 数据域 */ + //硬件ID + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + //通信ID + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 28); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 30); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 modifyCommunicationIDHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisModifyCommunicationIDHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisSensorNumberConfigurationHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 比较数据域中的硬件ID是否正确 */ + uint8_t flag = 0; + if (gw485RxBuffer[18] != HY_hardWordID[0] + || gw485RxBuffer[19] != HY_hardWordID[1] + || gw485RxBuffer[20] != HY_hardWordID[2] + || gw485RxBuffer[21] != HY_hardWordID[3] + || gw485RxBuffer[22] != HY_hardWordID[4] + || gw485RxBuffer[23] != HY_hardWordID[5]) { + flag = 1; + // state = wait; + // gw485RxBufferIndex--; + // memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + // return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + /* 保存要修改的通信ID */ + HY_communicationID[0] = gw485RxBuffer[24]; + HY_communicationID[1] = gw485RxBuffer[25]; + HY_communicationID[2] = gw485RxBuffer[26]; + HY_communicationID[3] = gw485RxBuffer[27]; + HY_writeCommunicationID_Flash(); + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_sensorNumberConfiguration; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(5 >> 8); + *(replay_pack + 1) = (uint8_t)5; + replay_pack += 2; + + /* 数据域 */ + //状态 + if (flag) { + *(replay_pack) = 0x00; + } else { + *(replay_pack) = 0xFF; + } + replay_pack += 1; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 19); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 21); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +/** + * @brief 状态 checkMotherboardTemperatureHY + * @param + * @retval TRUE:解析成功 FALSE:解析失败 + */ +BOOL analysisCheckMotherboardTemperatureHY(void) +{ + /* 解析帧 */ + if (gw485RxBufferIndex >= frameLength) { + log_info("analysisCheckMotherboardTemperatureHY \n"); + + /* 比较校验位和结束标志 */ + if (gw485RxBuffer[frameLength - 2] != HY_CheckFunc(gw485RxBuffer, frameLength - 2) + || gw485RxBuffer[frameLength - 1] != HY_endFlag) { + state = wait; + gw485RxBufferIndex--; + memcpy(gw485RxBuffer, gw485RxBuffer + 1, gw485RxBufferIndex); + return FALSE; + } + + /* 获取帧序号 */ + HY_frameNumber[0] = gw485RxBuffer[14]; + HY_frameNumber[1] = gw485RxBuffer[15]; + HY_frameNumber[2] = gw485RxBuffer[16]; + HY_frameNumber[3] = gw485RxBuffer[17]; + + uint8_t *replay_pack = getInsertData(); + /* 起始标志 */ + *(replay_pack) = HY_startFlag; + replay_pack++; + + /* 硬件ID */ + *(replay_pack + 0) = HY_hardWordID[0]; + *(replay_pack + 1) = HY_hardWordID[1]; + *(replay_pack + 2) = HY_hardWordID[2]; + *(replay_pack + 3) = HY_hardWordID[3]; + *(replay_pack + 4) = HY_hardWordID[4]; + *(replay_pack + 5) = HY_hardWordID[5]; + replay_pack += 6; + + /* 通信ID */ + *(replay_pack + 0) = HY_communicationID[0]; + *(replay_pack + 1) = HY_communicationID[1]; + *(replay_pack + 2) = HY_communicationID[2]; + *(replay_pack + 3) = HY_communicationID[3]; + replay_pack += 4; + + /* 控制字 */ + *(replay_pack) = HY_checkMotherboardTemperature; + replay_pack++; + + /* 数据长度 */ + *(replay_pack) = (uint8_t)(8 >> 8); + *(replay_pack + 1) = (uint8_t)8; + replay_pack += 2; + + /* 数据域 */ + //温度 + float temp; + temp = getHighSideMosTemperature(); + memcpy(replay_pack, &temp, sizeof(float)); + replay_pack += 4; + + //帧序号 + *(replay_pack) = HY_frameNumber[0]; + *(replay_pack + 1) = HY_frameNumber[1]; + *(replay_pack + 2) = HY_frameNumber[2]; + *(replay_pack + 3) = HY_frameNumber[3]; + replay_pack += 4; + + /* 校验码 */ + *(replay_pack) = HY_CheckFunc(getInsertData(), 22); + replay_pack++; + + /* 结束码 */ + *(replay_pack) = HY_endFlag; + replay_pack++; + + uart_insertDataSend(HY_device, 24); + + gw485RxBufferIndex = 0; + state = wait; + } + + if (gw485RxBufferIndex < frameLength) { + return FALSE; + } + + return TRUE; +} + +// /** +// * @brief 状态 readSOELength +// * @param +// * @retval TRUE:解析成功 FALSE:解析失败 +// */ +// BOOL analysisCheckCodeHY(void) +// { +// log_info("analysisCheckCodeHY \n"); + +// return TRUE; +// } + +// /** +// * @brief 状态 readSOELength +// * @param +// * @retval TRUE:解析成功 FALSE:解析失败 +// */ +// BOOL analysisEndFlagHY(void) +// { +// log_info("analysisEndFlagHY \n"); + +// return TRUE; +// } + +/** + * @brief 向flash中存入硬件ID的值 + * @param + * @retval + */ +void HY_writeHardWordID_Flash(void) +{ + write_Flash(HY_hardWordID, HY_hardWordIDStartAddr, HY_hardWordIDSize); +} + +/** + * @brief 向flash中读取硬件ID的值,当所有值都为0xFF时,该值不生效 + * @param + * @retval + */ +void HY_readHardWordID_Flash(void) +{ + uint8_t temp[6]; + read_Flash(temp, HY_hardWordIDStartAddr, HY_hardWordIDSize); + int i = 0; + for (; i < HY_hardWordIDSize; i++) { + if (temp[0] != 0xFF) { + break; + } + } + + if (i != HY_hardWordIDSize) { + i = 0; + for (; i < HY_hardWordIDSize; i++) { + HY_hardWordID[i] = temp[i]; + } + } + + log_info("HY_hardWordID[0]:%x\n", HY_hardWordID[0]); + log_info("HY_hardWordID[1]:%x\n", HY_hardWordID[1]); + log_info("HY_hardWordID[2]:%x\n", HY_hardWordID[2]); + log_info("HY_hardWordID[3]:%x\n", HY_hardWordID[3]); + log_info("HY_hardWordID[4]:%x\n", HY_hardWordID[4]); + log_info("HY_hardWordID[5]:%x\n", HY_hardWordID[5]); +} + +/** + * @brief 向flash中存入通信ID的值 + * @param + * @retval + */ +void HY_writeCommunicationID_Flash(void) +{ + write_Flash(HY_communicationID, HY_communicationIDStartAddr, HY_communicationIDSize); +} + +/** + * @brief 向flash中读取通信ID的值,当所有值都为0xFF时,该值不生效 + * @param + * @retval + */ +void HY_readCommunicationID_Flash(void) +{ + uint8_t temp[HY_communicationIDSize]; + read_Flash(temp, HY_communicationIDStartAddr, HY_communicationIDSize); + int i = 0; + for (; i < HY_communicationIDSize; i++) { + if (temp[0] != 0xFF) { + break; + } + } + + if (i != HY_communicationIDSize) { + i = 0; + for (; i < HY_communicationIDSize; i++) { + HY_communicationID[i] = temp[i]; + } + } + + log_info("HY_communicationID[0]:%x\n", HY_communicationID[0]); + log_info("HY_communicationID[1]:%x\n", HY_communicationID[1]); + log_info("HY_communicationID[2]:%x\n", HY_communicationID[2]); + log_info("HY_communicationID[3]:%x\n", HY_communicationID[3]); +} + +#endif \ No newline at end of file diff --git a/APP/businessLogic/Src/inFlash.c b/APP/businessLogic/Src/inFlash.c index 1d755b9..022ef35 100644 --- a/APP/businessLogic/Src/inFlash.c +++ b/APP/businessLogic/Src/inFlash.c @@ -281,7 +281,7 @@ void config_info_start(void) // fTemp = 0.01f; // saveLoopImpedance(&fTemp); readLoopImpedance(&fTemp); - setLoopImpedance(fTemp); + // setLoopImpedance(fTemp); // if (getLoopImpedance() < 0 || getLoopImpedance() > 0.3f) { if (!setLoopImpedance(fTemp)) { setLoopImpedance(0.01f); diff --git a/APP/businessLogic/Src/interruptSend.c b/APP/businessLogic/Src/interruptSend.c index 284d764..08d34d5 100644 --- a/APP/businessLogic/Src/interruptSend.c +++ b/APP/businessLogic/Src/interruptSend.c @@ -1,5 +1,6 @@ #include "interruptSend.h" +#include "bl_usart.h" #define RS485_MAX_PACK_DATA_LEN 256 @@ -168,6 +169,14 @@ void setSendOverStateGw(void) NVIC_SystemReset(); } +#ifdef HY_ChargeControlBox_PROTOCOL_ENABLE + /* HY,复位指令 */ + if (uart_send.sendDataGw->data[11] = 0x66 + && uart_send.sendDataGw->data[14] == 0xFF) { + NVIC_SystemReset(); + } +#endif + uart_send.sendOverStateGw = TRUE; uart_send.sendStateGw = FALSE; uart_send.sendDataGw->dataState = FALSE; diff --git a/APP/businessLogic/Src/parameter.c b/APP/businessLogic/Src/parameter.c index 503ff6f..7b12aee 100644 --- a/APP/businessLogic/Src/parameter.c +++ b/APP/businessLogic/Src/parameter.c @@ -4,6 +4,7 @@ #include "FM_GPIO.h" #include "capture.h" #include "bl_chargControl.h" +#include config_parameter g_cfgParameter = {0}; static otherParameter g_otherParameter = {0}; @@ -127,6 +128,16 @@ void setCheckImpedanceState(void) checkImpedanceState = TRUE; } +/** + * @brief 回路阻抗检测成功后设置回路阻抗检测状态 + * @param + * @retval + * + */ +void resetCheckImpedanceState(void) +{ + checkImpedanceState = FALSE; +} /** * @brief 设置上次读取充放电量参数的时间 @@ -498,6 +509,10 @@ BOOL setLoopImpedance(float loopImpedance) if (loopImpedance < 0 || loopImpedance > 0.3f) { return FALSE; } + + if (fpclassify(loopImpedance) == FP_NAN) { + return FALSE; + } g_otherParameter.loopImpedance = loopImpedance; return TRUE; diff --git a/APP/businessLogic/Src/task.c b/APP/businessLogic/Src/task.c index f2127e4..f015bd0 100644 --- a/APP/businessLogic/Src/task.c +++ b/APP/businessLogic/Src/task.c @@ -264,7 +264,8 @@ void Task_wdi(void) // uart_interruptSend(g_gw485_uart2_handle, "hello world\n", sizeof("hello world\n")); /* 每天复位一次,复位前将电量信息写入flash中 */ - static uint32_t temp = 60 * 60 * 24; + static uint32_t temp = 60 * 60 * 24; +// static uint32_t temp = 60 * 30; if (!(--temp)) { temp = 0; float tempF; @@ -276,6 +277,8 @@ void Task_wdi(void) time = getLastTime(); saveTime(&time); // NVIC_SystemReset(); + resetCheckImpedanceState(); + temp = 60 * 60 * 24; } } diff --git a/APP/functionalModule/Src/FM_GPIO.c b/APP/functionalModule/Src/FM_GPIO.c index 62a9f31..17cb093 100644 --- a/APP/functionalModule/Src/FM_GPIO.c +++ b/APP/functionalModule/Src/FM_GPIO.c @@ -15,7 +15,8 @@ void FM_GPIO_Init(void) */ void POW_FF_PCON_Open(void) { - HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_SET); + // HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_SET); + HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_RESET); } /** @@ -25,7 +26,8 @@ void POW_FF_PCON_Open(void) */ void POW_FF_PCON_Close(void) { - HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_RESET); + // HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(POW_FF_CON_GPIO_Port, POW_FF_CON_Pin, GPIO_PIN_SET); } /** diff --git a/APP/functionalModule/Src/capture.c b/APP/functionalModule/Src/capture.c index 0bcf7a4..4664a77 100644 --- a/APP/functionalModule/Src/capture.c +++ b/APP/functionalModule/Src/capture.c @@ -134,11 +134,11 @@ const float32_t Proportion = 3.0 / 4095.0; // 0.178709805, 0.3671073616, 0.3671073616, 0.178709805 // }; -/* matlab生成的3阶滤波器系数,乘比例使和接近为1 */ -const int firLen = 4; -const float32_t firLP[4] = { - 0.163708486, 0.336291513, 0.336291513, 0.163708486 -}; +// /* matlab生成的3阶滤波器系数,乘比例使和接近为1 */ +// const int firLen = 4; +// const float32_t firLP[4] = { +// 0.163708486, 0.336291513, 0.336291513, 0.163708486 +// }; // void captureFirInit(void); diff --git a/APP/hardwareDriver/Src/HD_GPIO.c b/APP/hardwareDriver/Src/HD_GPIO.c index ee399bd..64b3aaf 100644 --- a/APP/hardwareDriver/Src/HD_GPIO.c +++ b/APP/hardwareDriver/Src/HD_GPIO.c @@ -114,6 +114,9 @@ void HD_GPIO_Init(void) HAL_GPIO_Init(EXCHG_PROT_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); } \ No newline at end of file diff --git a/Core/Inc/main.h b/Core/Inc/main.h index 1eaae35..3dc05e7 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -111,6 +111,7 @@ void Error_Handler(void); #define DEBUG_RX_GPIO_Port GPIOC #define EXCHG_PROT_Pin GPIO_PIN_5 #define EXCHG_PROT_GPIO_Port GPIOB +#define EXCHG_PROT_EXTI_IRQn EXTI9_5_IRQn #define RUN_LED_Pin GPIO_PIN_6 #define RUN_LED_GPIO_Port GPIOB #define POW_FF_CON_Pin GPIO_PIN_7 diff --git a/Core/Inc/stm32g4xx_it.h b/Core/Inc/stm32g4xx_it.h index 615361c..31095ea 100644 --- a/Core/Inc/stm32g4xx_it.h +++ b/Core/Inc/stm32g4xx_it.h @@ -56,6 +56,7 @@ void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); void DMA1_Channel1_IRQHandler(void); +void EXTI9_5_IRQHandler(void); void TIM1_BRK_TIM15_IRQHandler(void); void TIM1_UP_TIM16_IRQHandler(void); void USART2_IRQHandler(void); diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 60dcbe7..f33c580 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -99,9 +99,11 @@ void MX_GPIO_Init(void) HAL_GPIO_Init(EXCHG_PROT_GPIO_Port, &GPIO_InitStruct); /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI9_5_IRQn); + HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); - } /* USER CODE BEGIN 2 */ diff --git a/Core/Src/main.c b/Core/Src/main.c index 7d18c24..12d8b20 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -95,20 +95,20 @@ int main(void) /* USER CODE END SysInit */ /* Initialize all configured peripherals */ -// MX_GPIO_Init(); -// MX_DMA_Init(); -// MX_ADC1_Init(); -// MX_ADC2_Init(); -// MX_TIM3_Init(); -// MX_TIM6_Init(); -// MX_UART4_Init(); -// MX_USART2_UART_Init(); -// MX_USART3_UART_Init(); -// MX_TIM7_Init(); -// MX_TIM16_Init(); -// MX_TIM15_Init(); -// MX_RTC_Init(); -// MX_SPI1_Init(); +// MX_GPIO_Init(); +// MX_DMA_Init(); +// MX_ADC1_Init(); +// MX_ADC2_Init(); +// MX_TIM3_Init(); +// MX_TIM6_Init(); +// MX_UART4_Init(); +// MX_USART2_UART_Init(); +// MX_USART3_UART_Init(); +// MX_TIM7_Init(); +// MX_TIM16_Init(); +// MX_TIM15_Init(); +// MX_RTC_Init(); +// MX_SPI1_Init(); /* USER CODE BEGIN 2 */ // while (1) { diff --git a/Core/Src/stm32g4xx_it.c b/Core/Src/stm32g4xx_it.c index dacac84..873e907 100644 --- a/Core/Src/stm32g4xx_it.c +++ b/Core/Src/stm32g4xx_it.c @@ -217,6 +217,20 @@ void DMA1_Channel1_IRQHandler(void) /* USER CODE END DMA1_Channel1_IRQn 1 */ } +/** + * @brief This function handles EXTI line[9:5] interrupts. + */ +void EXTI9_5_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI9_5_IRQn 0 */ + + /* USER CODE END EXTI9_5_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(EXCHG_PROT_Pin); + /* USER CODE BEGIN EXTI9_5_IRQn 1 */ + + /* USER CODE END EXTI9_5_IRQn 1 */ +} + /** * @brief This function handles TIM1 break interrupt and TIM15 global interrupt. */ diff --git a/chargeController.ioc b/chargeController.ioc index c3208df..cf61922 100644 --- a/chargeController.ioc +++ b/chargeController.ioc @@ -139,6 +139,7 @@ NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.DMA1_Channel1_IRQn=true\:4\:0\:true\:false\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.EXTI15_10_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.EXTI9_5_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false @@ -351,13 +352,14 @@ RCC.FCLKCortexFreq_Value=72000000 RCC.FDCANFreq_Value=72000000 RCC.FamilyName=M RCC.HCLKFreq_Value=72000000 +RCC.HSE_VALUE=8000000 RCC.HSI48_VALUE=48000000 RCC.HSI_VALUE=16000000 RCC.I2C1Freq_Value=72000000 RCC.I2C2Freq_Value=72000000 RCC.I2C3Freq_Value=72000000 RCC.I2SFreq_Value=72000000 -RCC.IPParameters=ADC12Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value +RCC.IPParameters=ADC12Freq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CRSFreq_Value,CortexFreq_Value,EXTERNAL_CLOCK_VALUE,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2SFreq_Value,LPTIM1Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,RTCClockSelection,RTCFreq_Value,SAI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART4Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USBFreq_Value,VCOInputFreq_Value,VCOOutputFreq_Value RCC.LPTIM1Freq_Value=72000000 RCC.LPUART1Freq_Value=72000000 RCC.LSCOPinFreq_Value=32000