| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- #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;
- }
|