soft_flash.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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_vol_information = false;
  9. bool read_vol_information = false;
  10. bool write_serial_information = false;
  11. bool read_serial_information = false;
  12. bool write_uav_information = false;
  13. bool read_uav_information = false;
  14. bool write_aboutage_information = false;
  15. bool read_aboutage_information = false;
  16. short set_cali_voltage = 0;
  17. uint32_t set_pmu_serail = 0;
  18. /**
  19. * @file ReadFlashNBtye
  20. * @brief 读flash
  21. * @param none
  22. * @details
  23. * @author Zhang Sir
  24. **/
  25. void ReadFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size)
  26. {
  27. if(addr + size >= FLSH_MAX_SIZE)
  28. {
  29. return;
  30. }
  31. for (size_t i = 0; i < size; i++)
  32. {
  33. *(pdata + i) = *((__IO uint8_t *)addr + i);
  34. }
  35. }
  36. /**
  37. * @file WriteFlashNBtye
  38. * @brief 写flash
  39. * @param none
  40. * @details
  41. * @author Zhang Sir
  42. **/
  43. HAL_StatusTypeDef WriteFlashNBtye(uint32_t addr, uint8_t *pdata, uint16_t size)
  44. {
  45. HAL_StatusTypeDef write_status = HAL_OK;
  46. __disable_irq();
  47. HAL_FLASH_Unlock();
  48. //擦1页flash 103c8t6 1页1kb 1024字节
  49. FLASH_EraseInitTypeDef f;
  50. f.TypeErase = FLASH_TYPEERASE_PAGES;
  51. f.PageAddress = addr;
  52. f.NbPages = 1;
  53. uint32_t PageError = 0;
  54. HAL_FLASHEx_Erase(&f, &PageError);
  55. //写flash 每次写2字节
  56. uint16_t TempBuf = 0;
  57. for(uint16_t i = 0; i < (size % 2 == 0? size/2 : size/2 +1); i++ )
  58. {
  59. TempBuf = *(pdata + 2 * i) + (*(pdata + 2 * i + 1) << 8);
  60. write_status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i * 2, TempBuf);
  61. }
  62. HAL_FLASH_Lock();
  63. __enable_irq();
  64. return write_status;
  65. }
  66. /**
  67. * @file check_flash_par_normal
  68. * @brief 检查flash参数是否合法
  69. * @param none
  70. * @details
  71. * @author Zhang Sir
  72. **/
  73. short check_flash_par_normal(short par, short min_par, short max_par ,uint8_t par_or_zero)
  74. {
  75. if(par >= max_par)
  76. {
  77. if(par_or_zero == 1)
  78. {
  79. return max_par;
  80. }
  81. else
  82. {
  83. return 0;
  84. }
  85. }
  86. else if(par <= min_par)
  87. {
  88. if(par_or_zero == 1)
  89. {
  90. return min_par;
  91. }
  92. else
  93. {
  94. return 0;
  95. }
  96. }
  97. else
  98. {
  99. return par;
  100. }
  101. }
  102. /**
  103. * @file flash_read_vol_funcktion
  104. * @brief 从flash中读取电压校准的系数
  105. * @param none
  106. * @details 125kb地址0x801F800
  107. * @author Zhang Sir
  108. **/
  109. struct date_vol volinf;
  110. struct uav_type uavinf;
  111. struct pmu_serial serial;
  112. short reset_reason_temp = 0;
  113. void flash_read_funcktion( void )
  114. {
  115. GPIO_InitTypeDef GPIO_InitStruct = {0};
  116. ReadFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
  117. if(serial._flag != ( int16_t )0xA48A)
  118. {
  119. serial._flag = ( int16_t )0xA48A;
  120. serial.num = PMU_SERIAL;
  121. WriteFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
  122. }
  123. ReadFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
  124. if ( volinf._vol_flag != ( int16_t )0xA48A )
  125. {
  126. volinf._vol_flag = ( int16_t )0xA48A;
  127. volinf.cal_vol = 0;
  128. WriteFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
  129. }
  130. ReadFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
  131. if ( uavinf._uavtype_flag != ( int16_t )0xA48A )
  132. {
  133. uavinf._uavtype_flag = ( int16_t )0xA48A;
  134. uavinf.uavtype = 0;
  135. uavinf.abnormal_outage_flag = 0;
  136. uavinf.reset_reason = 0;
  137. WriteFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
  138. }
  139. reset_reason_temp = uavinf.reset_reason;
  140. if(uavinf.uavtype == VK_ALL_IN_ONE)
  141. {
  142. init_pwmout(VK_ALL_IN_ONE);
  143. init_gpio(VK_ALL_IN_ONE);
  144. }
  145. else
  146. {
  147. //先执行上电离心喷头会转
  148. GPIO_InitStruct.Pin = EXIT_1T_Pin|EXIT_2T_Pin;
  149. GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;//GPIO_MODE_IT_RISING;
  150. GPIO_InitStruct.Pull = GPIO_PULLUP;
  151. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  152. GPIO_InitStruct.Pin = EXIT_3T_Pin|EXIT_4T_Pin;
  153. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  154. GPIO_InitStruct.Pull = GPIO_PULLUP;
  155. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  156. /* EXTI interrupt init*/
  157. HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
  158. HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
  159. }
  160. HAL_TIM_Base_Start_IT(&htim4);
  161. HAL_TIM_Base_Start(&htim4);
  162. }
  163. /**
  164. * @file read_flash_function
  165. * @brief 读flash功能
  166. * @param none
  167. * @details
  168. * @author Zhang Sir
  169. **/
  170. int write_flash_time = 0;
  171. void read_flash_function(void)
  172. {
  173. if(HAL_GetTick() - write_flash_time < 500)
  174. {
  175. return;
  176. }
  177. if(read_serial_information == true)
  178. {
  179. ReadFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) );
  180. Int2String(serial.num,dev_pmu.sn,9);
  181. read_serial_information = false;
  182. }
  183. if(read_vol_information == true)
  184. {
  185. ReadFlashNBtye( FLASH_VOL_IFO, ( uint8_t * )&volinf, sizeof( volinf ) );
  186. read_vol_information = false;
  187. }
  188. if(read_uav_information == true)
  189. {
  190. ReadFlashNBtye( FLASH_UAV_IFO, ( uint8_t * )&uavinf, sizeof( uavinf ) );
  191. read_uav_information = false;
  192. }
  193. }
  194. /**
  195. * @file write_flash_function
  196. * @brief 把参数写入内存
  197. * @param none
  198. * @details
  199. * @author Zhang Sir
  200. **/
  201. void write_flash_function(void)
  202. {
  203. if(write_serial_information == true)
  204. {
  205. serial.num = set_pmu_serail;
  206. if(HAL_OK == WriteFlashNBtye( FLASH_SERIAL_IFO, ( uint8_t * )&serial, sizeof( serial ) ))
  207. {
  208. write_flash_time = HAL_GetTick();
  209. read_serial_information = true;
  210. write_serial_information = false;
  211. }
  212. }
  213. if(write_vol_information == true)
  214. {
  215. volinf.cal_vol = check_flash_par_normal(set_cali_voltage,-50,50,0);
  216. if(HAL_OK == WriteFlashNBtye(FLASH_VOL_IFO, (uint8_t *)&volinf, sizeof(volinf)))
  217. {
  218. write_flash_time = HAL_GetTick();
  219. read_vol_information = true;
  220. write_vol_information = false;
  221. }
  222. }
  223. if(write_uav_information == true)
  224. {
  225. if(planep.UAV_type != uavinf.uavtype || uavinf.abnormal_outage_flag != 0 || uavinf.reset_reason != reset_reason_temp)
  226. {
  227. uavinf.uavtype = check_flash_par_normal(planep.UAV_type,0,50,0);
  228. reset_reason_temp = uavinf.reset_reason;
  229. if(HAL_OK == WriteFlashNBtye(FLASH_UAV_IFO, (uint8_t *)&uavinf, sizeof(uavinf)))
  230. {
  231. write_flash_time = HAL_GetTick();
  232. read_uav_information = true;
  233. write_uav_information = false;
  234. }
  235. }
  236. }
  237. }