nv_storage.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. #include "app/nv_storage.h"
  2. #include "bsp/bsp_driver.h"
  3. #include "libs/crc16.h"
  4. #include "libs/logger.h"
  5. #include "foc/motor/motor_param.h"
  6. #include "foc/foc_config.h"
  7. #define mc_config_idx_0 (sn_page_index + 1)
  8. #define mc_config_idx_1 (mc_config_idx_0 + 1)
  9. #define sn_idx_back (mc_config_idx_1 + 1)
  10. #define mc_runtime_red_idx (sn_idx_back + 1)
  11. #define mc_crit_err_idx (mc_runtime_red_idx + 1)
  12. void nv_write_crit_errblock(u8 *data, int len) {
  13. fmc_write_data(mc_crit_err_idx, data, len);
  14. }
  15. void nv_read_crit_errblock(u8 *data, int len) {
  16. fmc_read_data(mc_crit_err_idx, data, len);
  17. }
  18. void nv_write_runtime_block(u8 *data, int len) {
  19. fmc_write_data(mc_runtime_red_idx, data, len);
  20. }
  21. void nv_read_runtime_block(u8 *data, int len) {
  22. fmc_read_data(mc_runtime_red_idx, data, len);
  23. }
  24. void nv_write_config_block(u8 idx, u8 *data, int len) {
  25. fmc_write_data(idx==0?mc_config_idx_0:mc_config_idx_1, data, len);
  26. }
  27. void nv_read_config_block(u8 idx, u8 *data, int len) {
  28. fmc_read_data(idx==0?mc_config_idx_0:mc_config_idx_1, data, len);
  29. }
  30. int nv_write_sn(u8 *data, int len) {
  31. mc_sn_t sn;
  32. memset(&sn, 0, sizeof(sn));
  33. len = min(32, len);
  34. memcpy(sn.sn, data, len);
  35. sn.len = len;
  36. sn.crc = crc16_get(data, len);
  37. fmc_write_data(sn_page_index, (u8 *)&sn, sizeof(sn));
  38. fmc_write_data(sn_idx_back, (u8 *)&sn, sizeof(sn));
  39. return len;
  40. }
  41. int nv_read_sn(u8 *data, int len) {
  42. mc_sn_t *sn;
  43. memset(&sn, 0, sizeof(sn));
  44. len = min(ARRAY_SIZE(sn->sn), len);
  45. sn = (mc_sn_t *)fmc_get_addr(sn_page_index);
  46. u16 crc16 = crc16_get(sn->sn, min(32, sn->len));
  47. if (crc16 == sn->crc) {
  48. memcpy(data, sn->sn, len);
  49. return len;
  50. }
  51. sn = (mc_sn_t *)fmc_get_addr(sn_idx_back);
  52. crc16 = crc16_get(sn->sn, min(32, sn->len));
  53. if (crc16 == sn->crc) {
  54. memcpy(data, sn->sn, len);
  55. return len;
  56. }
  57. return 0;
  58. }
  59. void nv_storage_init(void) {
  60. }