#include "inFlash.h" #include "parameter.h" #include "pDebug.h" //#include "cfg_protocol.h" #include "configParameter.h" static void save_config_info(config_info *save_config_info); /** * @brief 保存配置信息 * @param save_config_info 需要保存的配置信息 * @retval None */ void save_config_info(config_info *save_config_info) { write_Flash((uint8_t *)save_config_info, CONFIG_SAVE_ADDR_BEGIN, CONFIG_INFO_SIZE); } // /** // * @brief 保存配置信息到备份区 // * @param save_config_info 需要保存的配置信息 // * @retval None // */ // static void save_backups_config_info(config_info *save_config_info) // { // write_Flash((uint8_t *)save_config_info, CONFIG_SAVE_addr, CONFIG_INFO_SIZE); // } /** * @brief 读取配置信息 * @param read_config_info 读取配置信息并保存在output_config_info中 * @retval None */ void read_config_info(config_info *output_config_info) { read_Flash((uint8_t *)output_config_info, CONFIG_SAVE_ADDR_BEGIN, CONFIG_INFO_SIZE); } // /** // * @brief 读取备份的配置信息 // * @param read_config_info 读取配置信息并保存在output_config_info中 // * @retval None // */ // static void read_backups_config_info(config_info *output_config_info) // { // read_Flash((uint8_t *)output_config_info, CONFIG_SAVE_addr, CONFIG_INFO_SIZE); // } void saveConfigInfo(config_info *configInfo) { save_config_info(configInfo); // save_backups_config_info(config_info); } void cfgTest(void) { // uint32_t tempTime = HAL_GetTick(); // config_info temp_configInfo; // read_config_info(&temp_configInfo); // log_info("1 read time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // saveConfigInfo(&temp_configInfo); // log_info("1 write time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // for (int i = 0; i < 10; i++) { // read_config_info(&temp_configInfo); // saveConfigInfo(&temp_configInfo); // } // log_info("10 time : %d \n", HAL_GetTick() - tempTime); // uint32_t tempTime = HAL_GetTick(); // float tempF; // readtotalElectricityConsumption(&tempF); // log_info("1 read time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // savetotalElectricityConsumption(&tempF); // log_info("1 write time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // for (int i = 0; i < 10; i++) { // readtotalElectricityConsumption(&tempF); // savetotalElectricityConsumption(&tempF); // } // log_info("10 time : %d \n", HAL_GetTick() - tempTime); // uint32_t tempTime = HAL_GetTick(); // timeInfo tempT; // readTime(&tempT); // log_info("1 read time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // saveTime(&tempT); // log_info("1 write time : %d \n", HAL_GetTick() - tempTime); // tempTime = HAL_GetTick(); // for (int i = 0; i < 10; i++) { // readTime(&tempT); // saveTime(&tempT); // } // log_info("10 time : %d \n", HAL_GetTick() - tempTime); uint32_t tempTime = HAL_GetTick(); uint8_t tempBuf[30]; write_Flash((uint8_t *)"hello 12345\n", 2048, sizeof("hello 12345\n")); log_info("1 write time : %d \n", HAL_GetTick() - tempTime); tempTime = HAL_GetTick(); read_Flash(tempBuf, 2048, sizeof("hello 12345\n")); log_info("1 read time : %d \n", HAL_GetTick() - tempTime); log_info("%s\n", tempBuf); tempTime = HAL_GetTick(); for (int i = 0; i < 10; i++) { read_Flash(tempBuf, 2048, sizeof("hello world\n")); write_Flash((uint8_t *)"hello world\n", 2048, sizeof("hello world\n")); } log_info("10 time : %d \n", HAL_GetTick() - tempTime); } /** * @brief 检测flash中是否有配置文件或者文件是否有损坏,若两处flash中都损坏则使用默认文件 * @param config_info 读取的配置信息 * @retval None * */ void readFlashContent(config_info *configInfo) { read_config_info(configInfo); /* 配置文件正确就返回 */ // static volatile uint16_t tempCrc1, tempCrc2; // tempCrc1 = configInfo->crc; // tempCrc2 = checkModebusCrc((uint8_t *)configInfo, CONFIG_INFO_SIZE - 2); // if (tempCrc1 == tempCrc2) { // return; // } if (configInfo->crc == checkModebusCrc((uint8_t *)configInfo, CONFIG_INFO_SIZE - 2)) { return; } // /* 更深处的配置文件正确就返回 */ // read_backups_config_info(config_info); // if (config_info->crc == configCheckFunc((uint8_t *)config_info, CONFIG_INFO_SIZE - 2)) { // save_config_info(config_info); // return; // } /* 配置文件错误使用默认配置 */ configInfo->uniqueDeviceID[0] = 0x11; configInfo->uniqueDeviceID[1] = 0x11; configInfo->uniqueDeviceID[2] = 0x11; configInfo->uniqueDeviceID[3] = 0x11; configInfo->uniqueDeviceID[4] = 0x11; configInfo->uniqueDeviceID[5] = 0x11; configInfo->uniqueDeviceID[6] = 0x11; configInfo->gw485_Baud = 115200; configInfo->bat485_Baud = 115200; configInfo->powerBoxType = 0x01; configInfo->constantVoltageV = 14; configInfo->floatI = 0.1f; configInfo->startSolarOpenCircuitV = 17; configInfo->stopSolarOutputCircuitV = 15; configInfo->checkCanStartTime = 5; configInfo->shortCircuitJudgmentDelay = 10; configInfo->inputPowerLowJudgmentDelay = 30; configInfo->inputPowerLowAgainOutputDelay = 1800; configInfo->firstStageProtectionDelay = 2; configInfo->firstStageProtectionCurr = 50; configInfo->secondStageProtectionDelay = 50000; configInfo->secondStageProtectionCurr = 35; configInfo->thirdStageProtectionDelay = 600000; configInfo->thirdStageProtectionCurr = 30; configInfo->inputPowerLowDetectionDelay = 10; configInfo->inputPowerLowDetectionVolt = 10.0f; configInfo->maxOpenSolarOutputCircuitV = 25; configInfo->maxChargCurr = 35; configInfo->minCheckLoopImpedanceChargCurr = 5; configInfo->stopPowerOutputTemperature = 100; configInfo->reducePowerOutputTemperature = 90; configInfo->fullPowerOutputTemperature = 50; configInfo->constantVoltageChargeV = 14.4f; configInfo->FloatChargeV = 14.2f; configInfo->collectOpenCircuitVoltageTime = 1800; // configInfo->firstStageProtectionCurr = firstStageProtectionCurrMacro; // configInfo->firstStageProtectionDelay = firstStageProtectionDelayMacro; // configInfo->firstStageProtectionValue = firstStageProtectionValueMacro; // configInfo->secondStageProtectionCurr = secondStageProtectionCurrMacro; // configInfo->secondStageProtectionDelay = secondStageProtectionDelayMacro; // configInfo->thirdStageProtectionCurr = thirdStageProtectionCurrMacro; // configInfo->thirdStageProtectionDelay = thirdStageProtectionDelayMacro; // configInfo->checkLoopImpedanceChargCurr = checkLoopImpedanceChargCurrMacro; // configInfo->lowInputLoadDetectionVolt = lowInputLoadDetectionVoltMacro; // configInfo->lowInputLoadDetectionDelay = lowInputLoadDetectionDelayMacro; // configInfo->maxChargCurr = maxChargCurrMacro; // configInfo->maxOpenSolarOpenCircuitV = maxOpenSolarOpenCircuitVMacro; } /** * @brief 通过配置文件初始化系统参数 * @param None * @retval None * */ void config_info_start(void) { Flash_Init(); config_info temp_configInfo; readFlashContent(&temp_configInfo); g_cfgParameter.startFlagSL[0] = 'S'; g_cfgParameter.startFlagSL[1] = 'L'; g_cfgParameter.endFlagSL = 0x16; g_cfgParameter.Access_Node_Type = POWERBOX; g_cfgParameter.Communication_Methods = RS485; g_cfgParameter.gw485_Baud = temp_configInfo.gw485_Baud; g_cfgParameter.bat485_Baud = temp_configInfo.bat485_Baud; g_cfgParameter.uniqueDeviceID[0] = temp_configInfo.uniqueDeviceID[0]; g_cfgParameter.uniqueDeviceID[1] = temp_configInfo.uniqueDeviceID[1]; g_cfgParameter.uniqueDeviceID[2] = temp_configInfo.uniqueDeviceID[2]; g_cfgParameter.uniqueDeviceID[3] = temp_configInfo.uniqueDeviceID[3]; g_cfgParameter.uniqueDeviceID[4] = temp_configInfo.uniqueDeviceID[4]; g_cfgParameter.uniqueDeviceID[5] = temp_configInfo.uniqueDeviceID[5]; g_cfgParameter.uniqueDeviceID[6] = temp_configInfo.uniqueDeviceID[6]; g_cfgParameter.powerBoxType = temp_configInfo.powerBoxType; g_cfgParameter.constantVoltageV = temp_configInfo.constantVoltageV; g_cfgParameter.floatI = temp_configInfo.floatI; g_cfgParameter.startSolarOpenCircuitV = temp_configInfo.startSolarOpenCircuitV; g_cfgParameter.stopSolarOutputCircuitV = temp_configInfo.stopSolarOutputCircuitV; g_cfgParameter.checkCanStartTime = temp_configInfo.checkCanStartTime; g_cfgParameter.shortCircuitJudgmentDelay = temp_configInfo.shortCircuitJudgmentDelay; g_cfgParameter.inputPowerLowJudgmentDelay = temp_configInfo.inputPowerLowJudgmentDelay; g_cfgParameter.inputPowerLowAgainOutputDelay= temp_configInfo.inputPowerLowAgainOutputDelay; g_cfgParameter.firstStageProtectionCurr = temp_configInfo.firstStageProtectionCurr; g_cfgParameter.firstStageProtectionDelay = temp_configInfo.firstStageProtectionDelay; g_cfgParameter.secondStageProtectionCurr = temp_configInfo.secondStageProtectionCurr; g_cfgParameter.secondStageProtectionDelay = temp_configInfo.secondStageProtectionDelay; g_cfgParameter.thirdStageProtectionCurr = temp_configInfo.thirdStageProtectionCurr; g_cfgParameter.thirdStageProtectionDelay = temp_configInfo.thirdStageProtectionDelay; g_cfgParameter.inputPowerLowDetectionDelay = temp_configInfo.inputPowerLowDetectionDelay; g_cfgParameter.inputPowerLowDetectionVolt = temp_configInfo.inputPowerLowDetectionVolt; g_cfgParameter.maxOpenSolarOutputCircuitV = temp_configInfo.maxOpenSolarOutputCircuitV; g_cfgParameter.maxChargCurr = temp_configInfo.maxChargCurr; g_cfgParameter.minCheckLoopImpedanceChargCurr = temp_configInfo.minCheckLoopImpedanceChargCurr; g_cfgParameter.stopPowerOutputTemperature = temp_configInfo.stopPowerOutputTemperature; g_cfgParameter.reducePowerOutputTemperature = temp_configInfo.reducePowerOutputTemperature; g_cfgParameter.fullPowerOutputTemperature = temp_configInfo.fullPowerOutputTemperature; g_cfgParameter.constantVoltageChargeV = temp_configInfo.constantVoltageChargeV; g_cfgParameter.FloatChargeV = temp_configInfo.FloatChargeV; g_cfgParameter.collectOpenCircuitVoltageTime= temp_configInfo.collectOpenCircuitVoltageTime; /* 读取的回路阻抗无效则回路阻抗设置为0 */ if (readLoopImpedance() == FALSE) { setLoopImpedance(0); saveLoopImpedance(); } float fTemp; readtotalElectricityConsumption(&fTemp); totalElectricityConsumptionInt(fTemp); readtotalChargCapacity(&fTemp); totalChargCapacityInt(fTemp); timeInfo time; readTime(&time); setLastTime(time); } /** * @brief 保存回路阻抗在flash中 * @param */ void saveLoopImpedance(void) { float loopImpedance; loopImpedance = getLoopImpedance(); write_Flash((uint8_t *)&loopImpedance, LoopImpedance_SAVE_addr, sizeof(float)); } /** * @brief 读取flash中的回路阻抗 * @param */ BOOL readLoopImpedance(void) { float loopImpedance; read_Flash((uint8_t *)&loopImpedance, LoopImpedance_SAVE_addr, sizeof(float)); return setLoopImpedance(loopImpedance); } /** * @brief 保存放电量在flash中 * @param */ void savetotalElectricityConsumption(float *totalElectricityConsumption) { write_Flash((uint8_t *)totalElectricityConsumption, totalElectricityConsumption_SAVE_addr, sizeof(float)); } /** * @brief 读取flash中的放电量 * @param */ void readtotalElectricityConsumption(float *totalElectricityConsumption) { read_Flash((uint8_t *)totalElectricityConsumption, totalElectricityConsumption_SAVE_addr, sizeof(float)); } /** * @brief 保存充电量在flash中 * @param */ void savetotalChargCapacity(float *totalChargCapacity) { write_Flash((uint8_t *)totalChargCapacity, totalChargCapacity_SAVE_addr, sizeof(float)); } /** * @brief 读取flash中的充电量 * @param */ void readtotalChargCapacity(float *totalChargCapacity) { read_Flash((uint8_t *)totalChargCapacity, totalChargCapacity_SAVE_addr, sizeof(float)); } /** * @brief 读取flash中的时间,这个时间是上次读取充放电量的时间 * @param */ void saveTime(timeInfo *time) { write_Flash((uint8_t *)time, time_SAVE_addr, sizeof(timeInfo)); } /** * @brief 读取flash中的时间 * @param */ void readTime(timeInfo *time) { read_Flash((uint8_t *)time, time_SAVE_addr, sizeof(timeInfo)); } // void saveOtherInfo(other_info *otherInfo) // { // write_Flash((uint8_t *)otherInfo, LoopImpedance_SAVE_addr, sizeof(OTHER_INFO_SIZE)); // } // void readOtherInfo(other_info *otherInfo) // { // read_Flash((uint8_t *)otherInfo, LoopImpedance_SAVE_addr, sizeof(OTHER_INFO_SIZE)); // }