nv_storage.c 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #include "app/nv_storage.h"
  2. #include "bsp/fmc_flash.h"
  3. #include "libs/crc16.h"
  4. static motor_params_t m_params;
  5. static foc_params_t foc_params;
  6. motor_params_t *nv_get_motor_params(void) {
  7. return &m_params;
  8. }
  9. foc_params_t *nv_get_foc_params(void) {
  10. return &foc_params;
  11. }
  12. void nv_save_hall_table(s32 *hall_table) {
  13. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  14. nv_save_motor_params();
  15. }
  16. void nv_save_hall_offset(s16 offset) {
  17. m_params.hall_offset = offset;
  18. nv_save_motor_params();
  19. }
  20. void nv_save_motor_params(void) {
  21. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  22. m_params.crc16 = crc;
  23. fmc_write_data(0, (u8 *)&m_params, sizeof(m_params));
  24. fmc_write_data(1, (u8 *)&m_params, sizeof(m_params));
  25. m_params.valid = true;
  26. }
  27. void nv_read_motor_params(void) {
  28. fmc_read_data(0, (u8 *)&m_params, sizeof(m_params));
  29. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  30. if (crc0 != m_params.crc16) {
  31. fmc_read_data(1, (u8 *)&m_params, sizeof(m_params));
  32. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  33. if (crc0 != m_params.crc16) {
  34. m_params.valid = false;
  35. return;
  36. }
  37. fmc_write_data(0, (u8 *)&m_params, sizeof(m_params));
  38. }else {
  39. fmc_write_data(1, (u8 *)&m_params, sizeof(m_params));
  40. }
  41. m_params.valid = true;
  42. }
  43. void nv_save_foc_params(void) {
  44. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  45. foc_params.crc16 = crc;
  46. fmc_write_data(0, (u8 *)&foc_params, sizeof(foc_params));
  47. fmc_write_data(1, (u8 *)&foc_params, sizeof(foc_params));
  48. foc_params.valid = true;
  49. }
  50. void nv_read_foc_params(void) {
  51. fmc_read_data(0, (u8 *)&foc_params, sizeof(foc_params));
  52. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  53. if (crc0 != foc_params.crc16) {
  54. fmc_read_data(1, (u8 *)&foc_params, sizeof(foc_params));
  55. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  56. if (crc0 != foc_params.crc16) {
  57. foc_params.valid = false;
  58. return;
  59. }
  60. fmc_write_data(0, (u8 *)&foc_params, sizeof(foc_params));
  61. }else {
  62. fmc_write_data(1, (u8 *)&foc_params, sizeof(foc_params));
  63. }
  64. foc_params.valid = true;
  65. }