#include "onechip_include_header.h" // 用户数据存储地址——选择Flash末尾区域,避免覆盖程序代码 // STM32F103RE Flash: 0x08000000 ~ 0x0807FFFF (512KB) #define CFG_PARAM_START_ADDR 0x0807F800 // 最后1页(2KB)起始地址 #define onechip_name "Onechip602" #define onechip_pswd "onechip1003" #define onechip_IP "192.168.1.10" #define onechip_PORT "8003" #define default_SN "2603001" /** * @brief 从指定Flash地址读取32位数据 */ uint32_t Flash_ReadWord(uint32_t address) { return *(__IO uint32_t*)address; } /** * @brief 从指定Flash地址读取16位数据 */ uint16_t Flash_ReadHalfWord(uint32_t address) { return *(__IO uint16_t*)address; } /** * @brief 向Flash写入16位数据(半字) * @param address 目标地址(必须为偶数,2字节对齐) * @param data 要写入的数据(16位) * @retval HAL_OK 成功,否则失败 */ HAL_StatusTypeDef Flash_WriteHalfWord(uint32_t address, uint16_t data) { HAL_StatusTypeDef status = HAL_ERROR; // 1. 解锁Flash HAL_FLASH_Unlock(); // 2. 写入半字数据 status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data); // 3. 锁定Flash HAL_FLASH_Lock(); return status; } /** * @brief 向Flash写入32位数据(字) * @param address 目标地址(必须为4字节对齐) * @param data 要写入的数据(32位) */ HAL_StatusTypeDef Flash_WriteWord(uint32_t address, uint32_t data) { HAL_StatusTypeDef status = HAL_ERROR; HAL_FLASH_Unlock(); status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data); HAL_FLASH_Lock(); return status; } /** * @brief 擦除指定Flash页 * @param page_address 页起始地址(必须是页边界对齐) */ HAL_StatusTypeDef Flash_ErasePage(uint32_t page_address) { HAL_StatusTypeDef status = HAL_ERROR; FLASH_EraseInitTypeDef EraseInitStruct; uint32_t PageError = 0; // 计算页号 // uint32_t page_num = (page_address - FLASH_BASE) / FLASH_PAGE_SIZE; HAL_FLASH_Unlock(); EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES; EraseInitStruct.PageAddress = page_address; EraseInitStruct.NbPages = 1; status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError); HAL_FLASH_Lock(); return status; } /** * @brief 向Flash写入多个半字数据(自动处理擦除) * @param start_addr 起始地址 * @param pBuffer 数据缓冲区 * @param NumToWrite 要写入的半字数量 */ void Flash_WriteBuffer(uint32_t start_addr, uint8_t *pBuffer, uint32_t NumToWrite) { // 1. 擦除目标页 uint32_t page_start = start_addr - (start_addr % FLASH_PAGE_SIZE); Flash_ErasePage(page_start); // 2. 依次写入每个半字 for (uint32_t i = 0; i < NumToWrite; i=i+4) { Flash_WriteWord(start_addr + i, *(uint32_t *)(pBuffer+i)); } } /** * @brief 向Flash写入多个半字数据(自动处理擦除) * @param start_addr 起始地址 * @param pBuffer 数据缓冲区 * @param NumToWrite 要写入的半字数量 */ void Flash_ReadBuffer(uint32_t start_addr, uint8_t *pBuffer, uint32_t NumToWrite){ for (uint32_t i = 0; i < NumToWrite; i=i+4) { *(uint32_t *)(pBuffer+i) = *(__IO uint32_t*)(start_addr + i); } } /******************************************************************** * checksum_calc() * *描述:接收数据checksum计算 *参数:pdata:要计算的数据 * len:要计算的数据长度 *返回:checksum值 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ uint32_t checksum_calc(uint8_t *pdata, uint8_t len) { uint8_t *tmp = pdata; uint32_t checksum = 0; for(uint8_t i = 0; i < len; i++) { checksum += tmp[i]; } return checksum; } /******************************************************************** * checksum_calc() * *描述:接收数据checksum计算 *参数:pdata:要计算的数据 * len:要计算的数据长度 *返回:checksum值 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ uint32_t checksum_calc1(uint8_t *wdata, int len) { uint32_t checksum = 0; for(int i = 0; i < len; i++) { checksum += wdata[i]; } return checksum; } /******************************************************************** * cfg_load_default_param() * *描述:加载默认参数 *参数:无 *返回:无 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ void cfg_load_default_param(void) { sysinf.lysis_offset = 0; sysinf.lysis_overHeat = 3; sysinf.lysis_overHeatTime = 10; sysinf.lysis_Kp = 5; sysinf.lysis_Ki = 0.01; sysinf.lysis_Kd = 0; sysinf.amplif_Kp = 20; sysinf.amplif_Ki = 0.05; sysinf.amplif_Kd = 0; sysinf.PresetTempVal = 72; sysinf.PresetTempTime = 5; sysinf.SetTempVal = 68; sysinf.holdTemp = 63.5; sysinf.PreHeatTime = 1; sysinf.readyTemp = 65.5; sysinf.adjtemp = -0.5; sysinf.log_level = 0; sysinf.skip_CheckOrRun = 0; sysinf.timeinner = 6000; sysinf.swingtime = 100; sysinf.swingspeed = 60; sysinf.swingtimeRight = 40; sysinf.swingtimePause = 100; sysinf.runLoopTime = 600; sysinf.runLoopSpeed = 80; strcpy(sysinf.wifiname, onechip_name); strcpy(sysinf.password, onechip_pswd); strcpy(sysinf.TCP_IP_Addr, onechip_IP); strcpy(sysinf.TCP_IP_PORT, onechip_PORT); memset(sysinf.SN, 0 ,sizeof(sysinf.SN)); strcpy(sysinf.SN, default_SN); } /******************************************************************** * cfg_param_verify() * *描述:配置参数校验 *参数:无 *返回:0/1:校验不通过/通过 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ uint8_t cfg_param_verify(void) { unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset); uint32_t saveCrc = *(uint32_t *)(CFG_PARAM_START_ADDR + (pramlen-4)); uint32_t calCrc = checksum_calc((uint8_t *)CFG_PARAM_START_ADDR, (pramlen-4)); if((saveCrc == calCrc) && (saveCrc != 0xffffffff)) { Flash_ReadBuffer(CFG_PARAM_START_ADDR,(uint8_t *)&sysinf.lysis_offset, pramlen); } } /******************************************************************** * cfg_save_cfg_param() * *描述:保存配置参数 *参数:无 *返回:0/1:保存失败/成功 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ uint8_t cfg_save_cfg_param(void) { unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset); sysinf.checksum = (uint32_t)checksum_calc((uint8_t *)&sysinf.lysis_offset, (pramlen-4)); Flash_WriteBuffer(CFG_PARAM_START_ADDR, (uint8_t *)&sysinf.lysis_offset, pramlen); return cfg_param_verify(); } /******************************************************************** * cfg_param_init() * *描述:配置参数初始化 *参数:无 *返回:0/1:初始化失败/成功 *其他:无 *-------------------------------------------------------------------- *记录: ********************************************************************/ uint8_t cfg_param_init(void) { uint8_t rlt = 0; unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset); uint32_t saveCrc = *(uint32_t *)(CFG_PARAM_START_ADDR + (pramlen-4)); uint32_t calCrc = checksum_calc((uint8_t *)CFG_PARAM_START_ADDR, (pramlen-4)); if((saveCrc == calCrc) && (saveCrc != 0xffffffff)) { Flash_ReadBuffer(CFG_PARAM_START_ADDR,(uint8_t *)&sysinf.lysis_offset, pramlen); return 0; } else { cfg_load_default_param(); rlt = cfg_save_cfg_param(); Van_Device_Printf(VAN_LOG_ERROR, "load parm err,please checking....\r\n"); } return rlt; }