fmc.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "fmc.h"
  2. #include "gd32e23x.h"
  3. #include "util.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. void fmc_erase_page(uint8_t page)
  7. {
  8. uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
  9. fmc_unlock();
  10. /* clear all pending flags */
  11. fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
  12. /* erase the flash pages */
  13. fmc_page_erase(p_start_addr);
  14. fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
  15. fmc_lock();
  16. }
  17. void fmc_program(uint8_t page, uint32_t *data, uint32_t data_len)
  18. {
  19. uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
  20. fmc_unlock();
  21. uint32_t address = p_start_addr;
  22. while (address < p_start_addr + FMC_PAGE_SIZE)
  23. {
  24. if (data_len <= 0)
  25. break;
  26. fmc_word_program(address, *data);
  27. address += 4U;
  28. data++;
  29. fmc_flag_clear(FMC_FLAG_END | FMC_FLAG_WPERR | FMC_FLAG_PGERR);
  30. data_len -= 4;
  31. }
  32. fmc_lock();
  33. }
  34. int8_t fmc_load(uint8_t page, uint8_t *data, uint32_t len)
  35. {
  36. uint32_t p_start_addr = FMC_WRITE_LAST_START_ADDR - page * FMC_PAGE_SIZE;
  37. unsigned char *ptr = (unsigned char *)p_start_addr; // 将指针指向存储区首地址
  38. if (*ptr == FMC_DATA_VAILD_FLAG)
  39. {
  40. // 从Flash中读取到有效的配置数据
  41. memcpy(data, ptr, len);
  42. return 0;
  43. }
  44. return -1;
  45. }
  46. int8_t fmc_check(fmc_data_t *d, uint32_t len)
  47. {
  48. if (d->data_valid_flag == FMC_DATA_VAILD_FLAG)
  49. {
  50. return fmc_check_cdata((uint8_t *)d, len);
  51. }
  52. else
  53. {
  54. return -1;
  55. }
  56. }
  57. uint8_t fmc_gen_cdata(uint8_t *d, uint32_t len)
  58. {
  59. return 0;
  60. }
  61. int8_t fmc_check_cdata(uint8_t *d, uint32_t len)
  62. {
  63. return 0;
  64. }