#include "app/nv_storage.h" #include "bsp/fmc_flash.h" #include "libs/crc16.h" static void mc_config_default(void); static mc_config_t g_config; void config_set_hall_offset(s16 offset) { g_config.hall_offset = offset; } mc_config_t *mc_config_get(void) { return &g_config; } void store_hall_table(u16 *hall_table) { memcpy((char *)g_config.hall_table, (char *)hall_table, sizeof(g_config.hall_table)); store_config(); } void store_hall_offset(s16 offset) { g_config.hall_offset = offset; store_config(); } void store_config(void) { u16 crc = crc16_get((u8 *)&g_config, sizeof(g_config) - 2); g_config.crc16 = crc; fmc_write_data(0, (u8 *)&g_config, sizeof(g_config)); fmc_write_data(1, (u8 *)&g_config, sizeof(g_config)); } void restore_config(void) { fmc_read_data(0, (u8 *)&g_config, sizeof(g_config)); u16 crc0 = crc16_get((u8 *)&g_config, sizeof(g_config) - 2); if (crc0 != g_config.crc16) { fmc_read_data(1, (u8 *)&g_config, sizeof(g_config)); crc0 = crc16_get((u8 *)&g_config, sizeof(g_config) - 2); if (crc0 != g_config.crc16) { mc_config_default(); return; } fmc_write_data(0, (u8 *)&g_config, sizeof(g_config)); }else { fmc_write_data(1, (u8 *)&g_config, sizeof(g_config)); } } static void mc_config_default(void) { g_config.hall_offset = 0; for (int i = 0; i < 3; i++) { g_config.phase_op[i].op_i_k = 1; g_config.phase_op[i].op_i_offset = 0;; } }