soft_flash.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. #include "main.h"
  2. #include "soft_flash.h"
  3. #include <string.h>
  4. #include "soft_crc.h"
  5. #include "stm32f3xx_hal.h"
  6. extern UART_HandleTypeDef huart2;
  7. //FLASH 擦除
  8. void flash_erase(uint32_t addr)
  9. {
  10. HAL_StatusTypeDef erase_status;
  11. FLASH_EraseInitTypeDef f;
  12. f.TypeErase = FLASH_TYPEERASE_PAGES;
  13. f.PageAddress = addr;
  14. f.NbPages = 1;
  15. uint32_t PageError = 0;
  16. erase_status = HAL_FLASHEx_Erase(&f, &PageError);
  17. if (erase_status != HAL_OK)
  18. {
  19. }
  20. }
  21. //FLASH写
  22. uint32_t Flash_WriteData(uint32_t addr, uint16_t *data, uint16_t Size)
  23. {
  24. static uint32_t flash_count = 0;
  25. __disable_irq();
  26. HAL_FLASH_Unlock();
  27. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);//清除一些错误标志
  28. //一页2kb
  29. if(flash_count == 0 || flash_count == 17)
  30. {
  31. flash_erase(addr);//擦除指定的闪存扇区(0~11)
  32. flash_count = 1;
  33. }
  34. uint16_t TempBuf = 0;
  35. for (uint16_t i = 0; i < Size; i++)
  36. {
  37. TempBuf = *(data + i);
  38. HAL_StatusTypeDef a = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, addr + i * 2, TempBuf);
  39. if (a != HAL_OK)
  40. {
  41. HAL_FLASH_Lock();
  42. __enable_irq();
  43. return WRITE_FAIL;
  44. }
  45. }
  46. HAL_FLASH_Lock();
  47. __enable_irq();
  48. flash_count++;
  49. return WRITE_SUCCESS;
  50. }
  51. bool wirte_update_flag()
  52. {
  53. HAL_StatusTypeDef status;
  54. __disable_irq();
  55. HAL_FLASH_Unlock();
  56. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_PGERR);
  57. flash_erase(FLASH_UPDATE_ADDR);
  58. status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, FLASH_UPDATE_ADDR, 0XF);
  59. HAL_FLASH_Lock();
  60. __enable_irq();
  61. if(status == HAL_OK)
  62. return true;
  63. else
  64. return false;
  65. }
  66. //FLASH读地址
  67. uint16_t ReadFlashNBtye(uint32_t ReadAddress, uint16_t *ReadBuf, int32_t ReadNum)
  68. {
  69. int DataNum = 0;
  70. uint16_t up_flag = 0;
  71. *ReadBuf = *(__IO uint16_t *)ReadAddress;
  72. up_flag = *ReadBuf;
  73. DataNum++;
  74. return up_flag;
  75. }
  76. //读取标志位
  77. uint32_t flash_read_updata_flag(void)
  78. {
  79. uint16_t temp_buff = 0;
  80. uint32_t Address = 0;
  81. temp_buff = ReadFlashNBtye(FLASH_UPDATE_ADDR, (uint16_t *)&Address, 1);
  82. return temp_buff;
  83. }
  84. int pmu_sn = 0;
  85. int pmu_hardversion = 0;
  86. void flash_ready_SN_and_VERSION(void)
  87. {
  88. uint16_t temp_buff = 0,temp_buff2 = 0;
  89. uint32_t Address = 0;
  90. temp_buff = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 10, (uint16_t *)&Address, 1);
  91. temp_buff2 = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 12, (uint16_t *)&Address, 1);
  92. pmu_sn = temp_buff + (temp_buff2 << 16);
  93. temp_buff = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 14, (uint16_t *)&Address, 1);
  94. temp_buff2 = ReadFlashNBtye(FLASH_APP_PAR_ADDR + 16, (uint16_t *)&Address, 1);
  95. pmu_hardversion = temp_buff + (temp_buff2 << 16);
  96. }