soft_flash.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "soft_flash.h"
  2. #include <string.h>
  3. #include "main.h"
  4. #include "soft_flow.h"
  5. #include "soft_p_2_c.h"
  6. #include "config.h"
  7. #include "soft_version.h"
  8. bool write_aboutage_information = false;
  9. bool read_aboutage_information = false;
  10. short set_cali_voltage = 0;
  11. uint32_t set_pmu_serail = 0;
  12. _F_PMU_PAR flash_pmu_par;
  13. _C_PMU_PAR current_pmu_par;
  14. bool write_flash_flag = false;
  15. /**
  16. * @file ReadFlashNBtye
  17. * @brief 读flash
  18. * @param none
  19. * @details
  20. * @author Zhang Sir
  21. **/
  22. void ReadFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size)
  23. {
  24. for (size_t i = 0; i < size; i++)
  25. {
  26. *(pdata + i) = *((__IO uint8_t *)addr + i);
  27. }
  28. }
  29. /**
  30. * @file WriteFlashNBtye
  31. * @brief 写flash
  32. * @param none
  33. * @details
  34. * @author Zhang Sir
  35. **/
  36. HAL_StatusTypeDef WriteFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size)
  37. {
  38. HAL_StatusTypeDef write_status = HAL_OK;
  39. __disable_irq();
  40. HAL_FLASH_Unlock();
  41. //擦1页flash 1页2kb
  42. FLASH_EraseInitTypeDef f;
  43. f.TypeErase = FLASH_TYPEERASE_PAGES;
  44. f.PageAddress = addr;
  45. f.NbPages = 1;
  46. uint32_t PageError = 0;
  47. HAL_FLASHEx_Erase(&f, &PageError);
  48. //写flash 每次写2字节
  49. uint16_t TempBuf = 0;
  50. for(uint16_t i = 0; i < (size % 2 == 0? size/2 : size/2 +1); i++ )
  51. {
  52. TempBuf = *(pdata + 2 * i) + (*(pdata + 2 * i + 1) << 8);
  53. write_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i * 2, TempBuf);
  54. }
  55. HAL_FLASH_Lock();
  56. __enable_irq();
  57. return write_status;
  58. }
  59. /**
  60. * @file check_flash_par_normal
  61. * @brief 检查flash参数是否合法
  62. * @param none
  63. * @details
  64. * @author Zhang Sir
  65. **/
  66. short check_flash_par_normal(short par, short min_par, short max_par ,uint8_t par_or_zero)
  67. {
  68. if(par >= max_par)
  69. {
  70. if(par_or_zero == 1)
  71. {
  72. return max_par;
  73. }
  74. else
  75. {
  76. return 0;
  77. }
  78. }
  79. else if(par <= min_par)
  80. {
  81. if(par_or_zero == 1)
  82. {
  83. return min_par;
  84. }
  85. else
  86. {
  87. return 0;
  88. }
  89. }
  90. else
  91. {
  92. return par;
  93. }
  94. }
  95. /**
  96. * @file flash_read_vol_funcktion
  97. * @brief 从flash中读取电压校准的系数
  98. * @param none
  99. * @details 125kb地址0x801F800
  100. * @author Zhang Sir
  101. **/
  102. short reset_reason_temp = 0;
  103. void flash_read_funcktion( void )
  104. {
  105. GPIO_InitTypeDef GPIO_InitStruct = {0};
  106. ReadFlashNBtye( FLASH_PAR_INFO, ( uint8_t * )&flash_pmu_par, sizeof( _F_PMU_PAR ) );
  107. if(flash_pmu_par.flag != 0xAA)
  108. parameter_assignment_default();
  109. parameter_copy();
  110. if(current_pmu_par.uavtype == VK_ALL_IN_ONE)
  111. {
  112. init_pwmout(VK_ALL_IN_ONE);
  113. init_gpio(VK_ALL_IN_ONE);
  114. }
  115. else
  116. {
  117. //先执行上电离心喷头会转
  118. GPIO_InitStruct.Pin = EXIT_1T_Pin|EXIT_2T_Pin;
  119. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;//GPIO_MODE_IT_RISING;
  120. GPIO_InitStruct.Pull = GPIO_PULLUP;
  121. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  122. GPIO_InitStruct.Pin = EXIT_3T_Pin|EXIT_4T_Pin;
  123. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  124. GPIO_InitStruct.Pull = GPIO_PULLUP;
  125. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  126. /* EXTI interrupt init*/
  127. HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  128. HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
  129. }
  130. HAL_TIM_Base_Start_IT(&htim4);
  131. HAL_TIM_Base_Start(&htim4);
  132. }
  133. /**
  134. * @file parameter_assignment_default
  135. * @brief 设置默认参数
  136. * @param none
  137. * @details
  138. * @author Zhang Sir
  139. **/
  140. void parameter_assignment_default(void)
  141. {
  142. flash_pmu_par.flag = 0xAA;
  143. flash_pmu_par._cal_vol = 0;
  144. flash_pmu_par._uavtype = 0;
  145. flash_pmu_par._abnormal_outage_flag = false;
  146. flash_pmu_par._reset_reason = 0;
  147. flash_pmu_par._SN_L = PMU_SERIAL & 0xffff;
  148. flash_pmu_par._SN_H = (PMU_SERIAL >> 16) & 0xffff;
  149. flash_pmu_par._hardVersion_L = PMU_HARDVERSION & 0xffff;
  150. flash_pmu_par._hardVersion_H = (PMU_HARDVERSION >> 16) & 0xffff;
  151. WriteFlashNBtye(FLASH_PAR_INFO,(uint8_t *)&flash_pmu_par,sizeof(_F_PMU_PAR));
  152. }
  153. /**
  154. * @file parameter_copy
  155. * @brief 参数赋值
  156. * @param none
  157. * @details
  158. * @author Zhang Sir
  159. **/
  160. void parameter_copy(void)
  161. {
  162. current_pmu_par.cal_vol = check_flash_par_normal(flash_pmu_par._cal_vol,-50,50,0);
  163. current_pmu_par.uavtype = flash_pmu_par._uavtype;
  164. current_pmu_par.abnormal_outage_flag = flash_pmu_par._abnormal_outage_flag;
  165. current_pmu_par.reset_reason = flash_pmu_par._reset_reason;
  166. current_pmu_par.SN = flash_pmu_par._SN_L + (flash_pmu_par._SN_H << 16);
  167. current_pmu_par.hardVersion = flash_pmu_par._hardVersion_L + (flash_pmu_par._hardVersion_H << 16);
  168. }
  169. /**
  170. * @file flash_write_pmu_par
  171. * @brief 写flash
  172. * @param none
  173. * @details
  174. * @author Zhang Sir
  175. **/
  176. void flash_write_pmu_par(void)
  177. {
  178. if(write_flash_flag == true)
  179. {
  180. if(HAL_OK == WriteFlashNBtye(FLASH_PAR_INFO,(uint8_t *)&flash_pmu_par,sizeof(_F_PMU_PAR)))
  181. {
  182. write_flash_flag = false;
  183. parameter_copy();
  184. }
  185. }
  186. }