onchip_flash.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #include "onechip_include_header.h"
  2. // 用户数据存储地址——选择Flash末尾区域,避免覆盖程序代码
  3. // STM32F103RE Flash: 0x08000000 ~ 0x0807FFFF (512KB)
  4. #define CFG_PARAM_START_ADDR 0x0807F800 // 最后1页(2KB)起始地址
  5. #define onechip_name "Onechip602"
  6. #define onechip_pswd "onechip1003"
  7. #define default_SN "2603001"
  8. /**
  9. * @brief 从指定Flash地址读取32位数据
  10. */
  11. uint32_t Flash_ReadWord(uint32_t address)
  12. {
  13. return *(__IO uint32_t*)address;
  14. }
  15. /**
  16. * @brief 从指定Flash地址读取16位数据
  17. */
  18. uint16_t Flash_ReadHalfWord(uint32_t address)
  19. {
  20. return *(__IO uint16_t*)address;
  21. }
  22. /**
  23. * @brief 向Flash写入16位数据(半字)
  24. * @param address 目标地址(必须为偶数,2字节对齐)
  25. * @param data 要写入的数据(16位)
  26. * @retval HAL_OK 成功,否则失败
  27. */
  28. HAL_StatusTypeDef Flash_WriteHalfWord(uint32_t address, uint16_t data)
  29. {
  30. HAL_StatusTypeDef status = HAL_ERROR;
  31. // 1. 解锁Flash
  32. HAL_FLASH_Unlock();
  33. // 2. 写入半字数据
  34. status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, data);
  35. // 3. 锁定Flash
  36. HAL_FLASH_Lock();
  37. return status;
  38. }
  39. /**
  40. * @brief 向Flash写入32位数据(字)
  41. * @param address 目标地址(必须为4字节对齐)
  42. * @param data 要写入的数据(32位)
  43. */
  44. HAL_StatusTypeDef Flash_WriteWord(uint32_t address, uint32_t data)
  45. {
  46. HAL_StatusTypeDef status = HAL_ERROR;
  47. HAL_FLASH_Unlock();
  48. status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, data);
  49. HAL_FLASH_Lock();
  50. return status;
  51. }
  52. /**
  53. * @brief 擦除指定Flash页
  54. * @param page_address 页起始地址(必须是页边界对齐)
  55. */
  56. HAL_StatusTypeDef Flash_ErasePage(uint32_t page_address)
  57. {
  58. HAL_StatusTypeDef status = HAL_ERROR;
  59. FLASH_EraseInitTypeDef EraseInitStruct;
  60. uint32_t PageError = 0;
  61. // 计算页号
  62. // uint32_t page_num = (page_address - FLASH_BASE) / FLASH_PAGE_SIZE;
  63. HAL_FLASH_Unlock();
  64. EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;
  65. EraseInitStruct.PageAddress = page_address;
  66. EraseInitStruct.NbPages = 1;
  67. status = HAL_FLASHEx_Erase(&EraseInitStruct, &PageError);
  68. HAL_FLASH_Lock();
  69. return status;
  70. }
  71. /**
  72. * @brief 向Flash写入多个半字数据(自动处理擦除)
  73. * @param start_addr 起始地址
  74. * @param pBuffer 数据缓冲区
  75. * @param NumToWrite 要写入的半字数量
  76. */
  77. void Flash_WriteBuffer(uint32_t start_addr, uint8_t *pBuffer, uint32_t NumToWrite)
  78. {
  79. // 1. 擦除目标页
  80. uint32_t page_start = start_addr - (start_addr % FLASH_PAGE_SIZE);
  81. Flash_ErasePage(page_start);
  82. // 2. 依次写入每个半字
  83. for (uint32_t i = 0; i < NumToWrite; i=i+4) {
  84. Flash_WriteWord(start_addr + i * 4, pBuffer[i]);
  85. }
  86. }
  87. /********************************************************************
  88. * checksum_calc()
  89. *
  90. *描述:接收数据checksum计算
  91. *参数:pdata:要计算的数据
  92. * len:要计算的数据长度
  93. *返回:checksum值
  94. *其他:无
  95. *--------------------------------------------------------------------
  96. *记录:
  97. ********************************************************************/
  98. uint32_t checksum_calc(uint8_t *pdata, uint8_t len)
  99. {
  100. uint8_t *tmp = pdata;
  101. uint8_t checksum = 0;
  102. for(uint8_t i = 0; i < len; i++)
  103. {
  104. checksum += tmp[i];
  105. }
  106. return checksum;
  107. }
  108. /********************************************************************
  109. * checksum_calc()
  110. *
  111. *描述:接收数据checksum计算
  112. *参数:pdata:要计算的数据
  113. * len:要计算的数据长度
  114. *返回:checksum值
  115. *其他:无
  116. *--------------------------------------------------------------------
  117. *记录:
  118. ********************************************************************/
  119. uint32_t checksum_calc1(uint8_t *wdata, int len)
  120. {
  121. uint32_t checksum = 0;
  122. for(int i = 0; i < len; i++)
  123. {
  124. checksum += wdata[i];
  125. }
  126. return checksum;
  127. }
  128. /********************************************************************
  129. * cfg_load_default_param()
  130. *
  131. *描述:加载默认参数
  132. *参数:无
  133. *返回:无
  134. *其他:无
  135. *--------------------------------------------------------------------
  136. *记录:
  137. ********************************************************************/
  138. void cfg_load_default_param(void)
  139. {
  140. sysinf.presetTempVal = 72;
  141. sysinf.presetTempTime = 5;
  142. sysinf.setTempVal = 68;
  143. sysinf.holdTemp = 65.5;
  144. sysinf.tempOffset = 2.5f;
  145. sysinf.preHeatTime = 1;
  146. sysinf.readyTemp = 65.5;
  147. sysinf.adjtemp = -0.5;
  148. sysinf.log_level = 0;
  149. sysinf.skip_CheckOrRun = 0;
  150. sysinf.timeinner = 6000;
  151. sysinf.swingtime = 100;
  152. sysinf.swingspeed = 60;
  153. sysinf.swingtimeRight = 40;
  154. sysinf.swingtimePause = 100;
  155. sysinf.runLoopTime = 600;
  156. sysinf.runLoopSpeed = 80;
  157. strcpy(sysinf.wifiname, onechip_name);
  158. strcpy(sysinf.password, onechip_pswd);
  159. memset(sysinf.SN, 0 ,sizeof(sysinf.SN));
  160. strcpy(sysinf.SN, default_SN);
  161. }
  162. /********************************************************************
  163. * cfg_param_verify()
  164. *
  165. *描述:配置参数校验
  166. *参数:无
  167. *返回:0/1:校验不通过/通过
  168. *其他:无
  169. *--------------------------------------------------------------------
  170. *记录:
  171. ********************************************************************/
  172. uint8_t cfg_param_verify(void)
  173. {
  174. unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset);
  175. if((uint32_t)checksum_calc((uint8_t *)CFG_PARAM_START_ADDR, (pramlen-4)) != *(uint32_t *)(CFG_PARAM_START_ADDR + (pramlen-4)))
  176. {
  177. return 0;
  178. }
  179. else
  180. {
  181. if(memcmp((uint8_t *)&sysinf.lysis_offset, (uint8_t *)CFG_PARAM_START_ADDR, pramlen) == 0)
  182. {
  183. return 1;
  184. }
  185. else
  186. {
  187. return 0;
  188. }
  189. }
  190. }
  191. /********************************************************************
  192. * cfg_save_cfg_param()
  193. *
  194. *描述:保存配置参数
  195. *参数:无
  196. *返回:0/1:保存失败/成功
  197. *其他:无
  198. *--------------------------------------------------------------------
  199. *记录:
  200. ********************************************************************/
  201. uint8_t cfg_save_cfg_param(void)
  202. {
  203. unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset);
  204. sysinf.checksum = (uint32_t)checksum_calc((uint8_t *)&sysinf.lysis_offset, (pramlen-4));
  205. Flash_WriteBuffer(CFG_PARAM_START_ADDR, (uint8_t *)&sysinf.lysis_offset, pramlen);
  206. return cfg_param_verify();
  207. }
  208. /********************************************************************
  209. * cfg_param_init()
  210. *
  211. *描述:配置参数初始化
  212. *参数:无
  213. *返回:0/1:初始化失败/成功
  214. *其他:无
  215. *--------------------------------------------------------------------
  216. *记录:
  217. ********************************************************************/
  218. uint8_t cfg_param_init(void)
  219. {
  220. uint8_t rlt = 0;
  221. unsigned char pramlen = sizeof(oneChipSysdef) - offsetof(oneChipSysdef, lysis_offset);
  222. if((uint32_t)checksum_calc((uint8_t *)CFG_PARAM_START_ADDR, (pramlen-4)) != *(uint32_t *)(CFG_PARAM_START_ADDR + (pramlen-4)))
  223. {
  224. return 0;
  225. }
  226. else
  227. {
  228. cfg_load_default_param();
  229. rlt = cfg_save_cfg_param();
  230. Van_Device_Printf(VAN_LOG_CRITICAL, "读取参数出错,加载默认参数\r\n");
  231. }
  232. return rlt;
  233. }