You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

103 lines
2.9 KiB

2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
2 years ago
  1. #include "xs_flash.h"
  2. #include <stdbool.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "xs_log.h"
  6. static uint32_t* _rawstartadd;
  7. static uint32_t* _defaultdata;
  8. static uint32_t _rawsize;
  9. static bool _is_first_run = false;
  10. static bool _xs_check_raw_data() {
  11. uint32_t checksum = 0;
  12. ZLOGI("flash", "_rawstartadd[0] = %x", _rawstartadd[0]);
  13. if (_rawstartadd[0] != FLASH_MASK_VAL) {
  14. return false;
  15. }
  16. for (uint32_t i = 0; i < _rawsize - 1; i++) {
  17. checksum += _rawstartadd[i];
  18. }
  19. if (checksum != _rawstartadd[_rawsize - 1]) {
  20. return false;
  21. }
  22. return true;
  23. }
  24. static HAL_StatusTypeDef _flash_erase(void) {
  25. HAL_StatusTypeDef status;
  26. uint32_t sector_error_point;
  27. FLASH_EraseInitTypeDef flash_erase_structer = {
  28. //
  29. .TypeErase = FLASH_TYPEERASE_SECTORS, //
  30. .Sector = FLASH_EARSE_SECTOR, //
  31. .NbSectors = 1, //
  32. .VoltageRange = FLASH_VOLTAGE_RANGE_3 //
  33. };
  34. HAL_FLASH_Unlock(); // ����
  35. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR); // ����һЩ������־
  36. status = HAL_FLASHEx_Erase(&flash_erase_structer, &sector_error_point);
  37. if (status != HAL_OK) {
  38. ZLOGE("flash", "erase error");
  39. }
  40. HAL_FLASH_Lock(); // ����
  41. return status;
  42. }
  43. /*******************************************************************************
  44. * EXTERN *
  45. *******************************************************************************/
  46. void xs_flash_init(uint32_t* rawstartadd, uint32_t* defaultdata, uint32_t rawsize) {
  47. _rawstartadd = rawstartadd;
  48. _defaultdata = defaultdata;
  49. _rawsize = rawsize;
  50. // ��ȡflash����
  51. memcpy(_rawstartadd, (uint32_t*)(FLASH_START_ADD), _rawsize * 4);
  52. // ������
  53. if (_xs_check_raw_data()) {
  54. return;
  55. }
  56. _is_first_run = true;
  57. xs_flash_factory_reset();
  58. // ��ʼ��flash����
  59. }
  60. bool xs_flash_is_first_run(void) { return _is_first_run; }
  61. uint32_t xs_compute_checksum(uint32_t* data, uint32_t size) {
  62. uint32_t checksum = 0;
  63. for (uint32_t i = 0; i < size; i++) {
  64. checksum += data[i];
  65. }
  66. return checksum;
  67. }
  68. bool xs_flash_factory_reset(void) {
  69. memcpy(_rawstartadd, _defaultdata, _rawsize * 4);
  70. xs_flash_flush();
  71. return true;
  72. }
  73. bool xs_flash_flush(void) {
  74. #if PC_NVS_ENABLE
  75. _rawstartadd[0] = FLASH_MASK_VAL;
  76. _rawstartadd[_rawsize - 1] = xs_compute_checksum(_rawstartadd, _rawsize - 1);
  77. _flash_erase();
  78. HAL_FLASH_Unlock(); // ����
  79. HAL_StatusTypeDef status;
  80. for (uint32_t i = 0; i < _rawsize; i++) {
  81. status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_START_ADD + i * 4, _rawstartadd[i]);
  82. if (status != HAL_OK) {
  83. ZLOGE("flash", "write error");
  84. }
  85. }
  86. HAL_FLASH_Lock(); // ����
  87. #endif
  88. return true;
  89. }