nv_storage.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. #include "app/nv_storage.h"
  2. #include "bsp/fmc_flash.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. static motor_params_t m_params;
  8. static foc_params_t foc_params;
  9. static mc_gear_config_t gear_config;
  10. static mc_limit_t limiter;
  11. static int _write_position = 0;
  12. #define NV_MAGIC 0x5AA5
  13. motor_params_t *nv_get_motor_params(void) {
  14. return &m_params;
  15. }
  16. foc_params_t *nv_get_foc_params(void) {
  17. return &foc_params;
  18. }
  19. mc_gear_config_t *nv_get_gear_configs(void) {
  20. return &gear_config;
  21. }
  22. mc_limit_t *nv_get_limter(void) {
  23. return &limiter;
  24. }
  25. void nv_save_hall_table(s32 *hall_table) {
  26. memcpy((char *)m_params.hall_table, (char *)hall_table, sizeof(m_params.hall_table));
  27. nv_save_motor_params();
  28. }
  29. void nv_save_angle_offset(float offset) {
  30. m_params.offset = offset;
  31. nv_save_motor_params();
  32. }
  33. static void nv_default_motor_params(void) {
  34. m_params.mot_nr = MOTOR_NR;
  35. m_params.poles = MOTOR_POLES;
  36. m_params.r = MOTOR_R;
  37. m_params.ld = MOTOR_Ld;
  38. m_params.lq = MOTOR_Lq;
  39. m_params.offset = MOTOR_ENC_OFFSET;//180;//(69.0f);
  40. m_params.est_pll_band = 100;
  41. m_params.pos_lock_pll_band = 500;
  42. m_params.flux_linkage = 0.0f;
  43. }
  44. static void nv_default_limter(void) {
  45. limiter.motor[0].enter_pointer = 120;
  46. limiter.motor[0].exit_pointer = 110;
  47. limiter.motor[0].limit_value = 0;
  48. limiter.motor[1].enter_pointer = 107;
  49. limiter.motor[1].exit_pointer = 97;
  50. limiter.motor[1].limit_value = CONFIG_MAX_MOTOR_TORQUE/3;
  51. limiter.motor[2].enter_pointer = 94;
  52. limiter.motor[2].exit_pointer = 85;
  53. limiter.motor[2].limit_value = CONFIG_MAX_MOTOR_TORQUE*2/3;
  54. limiter.mos[0].enter_pointer = 110;
  55. limiter.mos[0].exit_pointer = 100;
  56. limiter.mos[0].limit_value = 0;
  57. limiter.mos[1].enter_pointer = 97;
  58. limiter.mos[1].exit_pointer = 87;
  59. limiter.mos[1].limit_value = CONFIG_MAX_MOTOR_TORQUE/3;
  60. limiter.mos[2].enter_pointer = 84;
  61. limiter.mos[2].exit_pointer = 78;
  62. limiter.mos[2].limit_value = CONFIG_MAX_MOTOR_TORQUE*2/3;
  63. limiter.vbus.enter_pointer = 76;
  64. limiter.vbus.exit_pointer = 80;
  65. limiter.vbus.limit_value = 20;
  66. }
  67. static void nv_default_foc_params(void) {
  68. foc_params.s_maxDCVol = CONFIG_MAX_DC_VOL;
  69. foc_params.s_minDCVol = CONFIG_MIN_DC_VOL;
  70. foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM;
  71. foc_params.s_maxRPM = CONFIG_DEFAULT_RPM_LIM;
  72. foc_params.s_maxEpmRPM = CONFIG_DEFAULT_EPM_RPM;
  73. foc_params.s_maxEpmTorqueLim = CONFIG_DEFAULT_EPM_PHASE_CURR;
  74. foc_params.s_maxTorque = CONFIG_MAX_MOTOR_TORQUE;
  75. foc_params.s_TorqueBrkLim = CONFIG_DEFAULT_EBRK_TORQUE;
  76. foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
  77. foc_params.n_brkShutPower = CONFIG_BRK_SHUT_POWER_ENABLE;
  78. foc_params.s_LimitiDC = CONFIG_DEFAULT_IDC_LIM;
  79. foc_params.s_iDCeBrkLim = CONFIG_DEFAULT_EBRK_IDC_LIM;
  80. foc_params.n_startThroVol = CONFIG_THROTTLE_START_VALUE;
  81. foc_params.n_endThroVol = CONFIG_THROTTLE_END_VALUE;
  82. foc_params.n_autoHold = CONFIG_AUTOHOLD_ENABLE;
  83. foc_params.n_acc_time = CONFIG_ACC_TIME;
  84. foc_params.n_dec_time = CONFIG_DEC_TIME;
  85. foc_params.n_ebrk_time = CONFIG_EBRK_RAMP_TIME;
  86. foc_params.n_FwEnable = CONFIG_DEFAULT_FW_ENABLE;
  87. foc_params.f_minThroVol = CONFIG_THROTTLE_MIN_VALUE;
  88. foc_params.f_maxThroVol = CONFIG_THROTTLE_MAX_VALUE;
  89. foc_params.pid_conf[PID_D_id].kp = (foc_params.n_currentBand * MOTOR_Ld);
  90. foc_params.pid_conf[PID_D_id].ki = (MOTOR_R/MOTOR_Ld);
  91. foc_params.pid_conf[PID_D_id].kd = 0;
  92. foc_params.pid_conf[PID_Q_id].kp = (foc_params.n_currentBand * MOTOR_Lq);
  93. foc_params.pid_conf[PID_Q_id].ki = (MOTOR_R/MOTOR_Lq);
  94. foc_params.pid_conf[PID_Q_id].kd = 0;
  95. foc_params.pid_conf[PID_TRQ_id].kp = TRQ_PI_KP;
  96. foc_params.pid_conf[PID_TRQ_id].ki = TRQ_PI_KI;
  97. foc_params.pid_conf[PID_TRQ_id].kd = TRO_PI_KD;
  98. foc_params.pid_conf[PID_Spd_id].kp = 0.13f;
  99. foc_params.pid_conf[PID_Spd_id].ki = 0.08f;
  100. foc_params.pid_conf[PID_Spd_id].kd = 0.0f;
  101. foc_params.pid_conf[PID_Pow_id].kp = 5.0f;
  102. foc_params.pid_conf[PID_Pow_id].ki = 15.0f;
  103. foc_params.pid_conf[PID_Pow_id].kd = 0;
  104. foc_params.pid_conf[PID_Lock_id].kp = (0.01f);
  105. foc_params.pid_conf[PID_Lock_id].ki = (0.20f);
  106. foc_params.pid_conf[PID_Lock_id].kd = 0;
  107. foc_params.pid_conf[PID_FW_id].kp = 0;
  108. foc_params.pid_conf[PID_FW_id].ki = 0.01f;
  109. foc_params.pid_conf[PID_FW_id].kd = 0;
  110. }
  111. static void nv_default_gear_config(void) {
  112. /* 48v 模式 */
  113. gear_config.gears_48[0].u_maxRPM = 1430;
  114. gear_config.gears_48[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
  115. gear_config.gears_48[0].u_maxIdc = 25;
  116. gear_config.gears_48[0].u_accTime = 50;
  117. gear_config.gears_48[1].u_maxRPM = 2100;
  118. gear_config.gears_48[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
  119. gear_config.gears_48[1].u_maxIdc = 30;
  120. gear_config.gears_48[1].u_accTime = 80;
  121. gear_config.gears_48[2].u_maxRPM = 2850;
  122. gear_config.gears_48[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  123. gear_config.gears_48[2].u_maxIdc = 40;
  124. gear_config.gears_48[2].u_accTime = 80;
  125. gear_config.gears_48[3].u_maxRPM = 2850;
  126. gear_config.gears_48[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  127. gear_config.gears_48[3].u_maxIdc = 40;
  128. gear_config.gears_48[3].u_accTime = 80;
  129. gear_config.gears_48[4].u_maxRPM = 2850;
  130. gear_config.gears_48[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  131. gear_config.gears_48[4].u_maxIdc = 40;
  132. gear_config.gears_48[4].u_accTime = 80;
  133. /* 96v 模式 */
  134. gear_config.gears_96[0].u_maxRPM = 2850;
  135. gear_config.gears_96[0].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.5f;
  136. gear_config.gears_96[0].u_maxIdc = 25;
  137. gear_config.gears_96[0].u_accTime = 50;
  138. gear_config.gears_96[1].u_maxRPM = 4300;
  139. gear_config.gears_96[1].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM * 0.8f;
  140. gear_config.gears_96[1].u_maxIdc = 30;
  141. gear_config.gears_96[1].u_accTime = 80;
  142. gear_config.gears_96[2].u_maxRPM = 5500;
  143. gear_config.gears_96[2].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  144. gear_config.gears_96[2].u_maxIdc = 35;
  145. gear_config.gears_96[2].u_accTime = 100;
  146. gear_config.gears_96[3].u_maxRPM = 5500;
  147. gear_config.gears_96[3].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  148. gear_config.gears_96[3].u_maxIdc = 45;
  149. gear_config.gears_96[3].u_accTime = 100;
  150. gear_config.gears_96[4].u_maxRPM = 5500;
  151. gear_config.gears_96[4].u_maxTorque = CONFIG_DEFAULT_PHASE_CURR_LIM;
  152. gear_config.gears_96[4].u_maxIdc = 45;
  153. gear_config.gears_96[4].u_accTime = 100;
  154. }
  155. void nv_save_motor_params(void) {
  156. u16 crc = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  157. m_params.crc16 = crc;
  158. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  159. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  160. }
  161. void nv_read_motor_params(void) {
  162. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  163. u16 crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  164. if (crc0 != m_params.crc16) {
  165. sys_debug("mp 0 error\n");
  166. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  167. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  168. if (crc0 != m_params.crc16) {
  169. nv_default_motor_params();
  170. nv_save_motor_params();
  171. return;
  172. }
  173. fmc_write_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  174. }else {
  175. fmc_read_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  176. crc0 = crc16_get((u8 *)&m_params, sizeof(m_params) - 2);
  177. if (crc0 != m_params.crc16) {
  178. sys_debug("mp 1 error\n");
  179. fmc_read_data(motorParam_idx_0, (u8 *)&m_params, sizeof(m_params));
  180. fmc_write_data(motorParam_idx_1, (u8 *)&m_params, sizeof(m_params));
  181. }
  182. }
  183. }
  184. void nv_save_limit_config(void) {
  185. u16 crc = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  186. limiter.magic = NV_MAGIC;
  187. limiter.crc16 = crc;
  188. fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  189. fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  190. }
  191. void nv_read_limit_config(void) {
  192. fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  193. u16 crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  194. if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
  195. sys_debug("lim 0 error\n");
  196. fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  197. crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  198. if (limiter.magic == NV_MAGIC && limiter.crc16 == crc16) {
  199. fmc_write_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  200. return;
  201. }else {
  202. sys_debug("lim 1 error\n");
  203. nv_default_limter();
  204. nv_save_limit_config();
  205. }
  206. }else {
  207. fmc_read_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  208. crc16 = crc16_get((u8 *)&limiter, sizeof(limiter) - 2);
  209. if (limiter.magic != NV_MAGIC || limiter.crc16 != crc16) {
  210. sys_debug("lim 1 error\n");
  211. fmc_read_data(limiter_cfg_idx_0, (u8 *)&limiter, sizeof(limiter));
  212. fmc_write_data(limiter_cfg_idx_1, (u8 *)&limiter, sizeof(limiter));
  213. }
  214. }
  215. }
  216. void nv_save_foc_params(void) {
  217. u16 crc = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  218. foc_params.crc16 = crc;
  219. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  220. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  221. }
  222. void nv_read_foc_params(void) {
  223. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  224. u16 crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  225. if (crc0 != foc_params.crc16) {
  226. sys_debug("fp 0 error\n");
  227. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  228. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  229. if (crc0 != foc_params.crc16) {
  230. nv_default_foc_params();
  231. nv_save_foc_params();
  232. return;
  233. }
  234. fmc_write_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  235. }else {
  236. fmc_read_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  237. crc0 = crc16_get((u8 *)&foc_params, sizeof(foc_params) - 2);
  238. if (crc0 != foc_params.crc16) {
  239. sys_debug("fp 1 error\n");
  240. fmc_read_data(focParam_idx_0, (u8 *)&foc_params, sizeof(foc_params));
  241. fmc_write_data(focParam_idx_1, (u8 *)&foc_params, sizeof(foc_params));
  242. }
  243. }
  244. sys_debug("maxTorque=%f\n", foc_params.s_maxTorque);
  245. }
  246. void nv_save_gear_configs(void) {
  247. u16 crc = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  248. gear_config.crc16 = crc;
  249. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  250. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  251. }
  252. void nv_read_gear_configs(void) {
  253. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  254. u16 crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  255. if (crc0 != gear_config.crc16) {
  256. sys_debug("gear 0 error\n");
  257. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  258. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  259. if (crc0 != gear_config.crc16) {
  260. nv_default_gear_config();
  261. nv_save_gear_configs();
  262. return;
  263. }
  264. fmc_write_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  265. }else {
  266. fmc_read_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  267. crc0 = crc16_get((u8 *)&gear_config, sizeof(gear_config) - 2);
  268. if (crc0 != gear_config.crc16) {
  269. sys_debug("gear 1 error\n");
  270. fmc_read_data(gear_config_idx_0, (u8 *)&gear_config, sizeof(gear_config));
  271. fmc_write_data(gear_config_idx_1, (u8 *)&gear_config, sizeof(gear_config));
  272. }
  273. }
  274. }
  275. bool nv_set_gear_config(u8 mode4896, u8 gear, u16 rpm, u16 torque, u16 idc, u16 acc) {
  276. mc_gear_t *gear_cfg;
  277. if (gear >= CONFIG_MAX_GEAR_NUM) {
  278. return false;
  279. }
  280. if (mode4896 == 0) { //48vmode
  281. gear_cfg = &gear_config.gears_48[gear];
  282. }else {
  283. gear_cfg = &gear_config.gears_96[gear];
  284. }
  285. gear_cfg->u_maxRPM = rpm;
  286. gear_cfg->u_maxTorque = torque;
  287. gear_cfg->u_maxIdc = idc;
  288. gear_cfg->u_accTime = acc;
  289. nv_save_gear_configs();
  290. return true;
  291. }
  292. bool nv_get_gear_config(u8 mode4896, u8 gear, u16 *rpm, u16 *torque, u16 *idc, u16 *acc) {
  293. mc_gear_t *gear_cfg;
  294. if (gear >= CONFIG_MAX_GEAR_NUM) {
  295. return false;
  296. }
  297. if (mode4896 == 0) { //48vmode
  298. gear_cfg = &gear_config.gears_48[gear];
  299. }else {
  300. gear_cfg = &gear_config.gears_96[gear];
  301. }
  302. *rpm = gear_cfg->u_maxRPM;
  303. *torque = gear_cfg->u_maxTorque;
  304. *idc = gear_cfg->u_maxIdc;
  305. *acc = gear_cfg->u_accTime;
  306. return true;
  307. }
  308. void nv_set_pid(u8 id, pid_conf_t *pid) {
  309. foc_params.pid_conf[id] = *pid;
  310. nv_save_foc_params();
  311. }
  312. void nv_get_pid(u8 id, pid_conf_t *pid) {
  313. *pid = foc_params.pid_conf[id];
  314. }
  315. void nv_set_hwbrake_mode(u8 mode) {
  316. foc_params.n_brkShutPower = mode;
  317. }
  318. void nv_set_throttle_vol(float min, float max) {
  319. foc_params.n_startThroVol = min;
  320. foc_params.n_endThroVol = max;
  321. }
  322. trq2dq_table_t *_trq2dq_table(int idx) {
  323. trq2dq_table_t *tbl = (trq2dq_table_t *)fmc_get_addr(idx);
  324. if (tbl->magic != NV_MAGIC) {
  325. sys_error("trq tlb %d magic error, 0x%x\n", idx, tbl->magic);
  326. return NULL;
  327. }
  328. u16 crc = crc16_get((u8 *)tbl, sizeof(trq2dq_table_t) - 4);
  329. if (crc != tbl->crc16) {
  330. sys_error("trq tlb %d crc16 error\n", idx);
  331. return NULL;
  332. }
  333. return tbl;
  334. }
  335. trq2dq_table_t *nv_get_trq2dq_table(void) {
  336. trq2dq_table_t *tbl = _trq2dq_table(trq_Tbl_idx0);
  337. if (tbl == NULL) {
  338. tbl = _trq2dq_table(trq_Tbl_idx1);
  339. }
  340. return tbl;
  341. }
  342. void nv_write_trq_table_begin(int index) {
  343. fmc_write_trq_table_begin(fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1));
  344. _write_position = 0;
  345. }
  346. int nv_write_trq_table_continue(uint8_t *data, int len){
  347. int w_pos = decode_u24(data);
  348. if ((_write_position + len - 3) > one_page_size * trq_Tbl_size) {
  349. return -1;
  350. }
  351. if (w_pos == _write_position && len > 3) {
  352. fmc_write_trq_table_continue(data + 3, len - 3);
  353. _write_position += len - 3;
  354. }
  355. return _write_position;
  356. }
  357. static int nv_write_trq_table1(void) {
  358. u8 cache[16];
  359. int remain = sizeof(trq2dq_table_t);
  360. u32 faddr = fmc_get_addr(trq_Tbl_idx0);
  361. fmc_write_trq_table_begin(fmc_get_addr(trq_Tbl_idx1));
  362. while(remain > 0) {
  363. int len = min(16, sizeof(trq2dq_table_t));
  364. memcpy(cache, (void *)faddr, len);
  365. fmc_write_trq_table_continue(cache, len);
  366. remain -= len;
  367. faddr += len;
  368. }
  369. fmc_write_trq_table_end();
  370. return _trq2dq_table(trq_Tbl_idx1) == NULL ? 1: 0;
  371. }
  372. int nv_write_trq_table_check(u8 *data, int len, int index) {
  373. uint32_t size, checksum;
  374. size = decode_u24(data);
  375. checksum = decode_u32(data + 3);
  376. u16 magic = NV_MAGIC;
  377. fmc_write_trq_table_continue((u8 *)&magic, sizeof(magic));
  378. fmc_write_trq_table_continue((u8 *)&checksum, sizeof(checksum));
  379. fmc_write_trq_table_end();
  380. u16 fmc_checksum = crc16_get((const u8 *)fmc_get_addr(index==0?trq_Tbl_idx0:trq_Tbl_idx1), size);
  381. if ((checksum == fmc_checksum) && (NULL != _trq2dq_table(index==0?trq_Tbl_idx0:trq_Tbl_idx1))) {
  382. if (nv_write_trq_table1()) { //write back error
  383. return 1;
  384. }
  385. return 0;
  386. }
  387. return 1;
  388. }
  389. int nv_write_sn(u8 *data, int len) {
  390. mc_sn_t sn;
  391. memset(&sn, 0, sizeof(sn));
  392. len = min(32, len);
  393. memcpy(sn.sn, data, len);
  394. sn.len = len;
  395. sn.crc = crc16_get(data, len);
  396. fmc_write_data(sn_page_index, (u8 *)&sn, sizeof(sn));
  397. fmc_write_data(sn_idx_back, (u8 *)&sn, sizeof(sn));
  398. return len;
  399. }
  400. int nv_read_sn(u8 *data, int len) {
  401. mc_sn_t *sn;
  402. memset(&sn, 0, sizeof(sn));
  403. len = min(ARRAY_SIZE(sn->sn), len);
  404. sn = (mc_sn_t *)fmc_get_addr(sn_page_index);
  405. u16 crc16 = crc16_get(sn->sn, min(32, sn->len));
  406. if (crc16 == sn->crc) {
  407. memcpy(data, sn->sn, len);
  408. return len;
  409. }
  410. sn = (mc_sn_t *)fmc_get_addr(sn_idx_back);
  411. crc16 = crc16_get(sn->sn, min(32, sn->len));
  412. if (crc16 == sn->crc) {
  413. memcpy(data, sn->sn, len);
  414. return len;
  415. }
  416. return 0;
  417. }
  418. void nv_storage_init(void) {
  419. nv_read_motor_params();
  420. nv_read_foc_params();
  421. nv_read_gear_configs();
  422. nv_read_limit_config();
  423. sys_debug("encoder_off = %f\n", m_params.offset);
  424. if (m_params.mot_nr != MOTOR_NR) {
  425. nv_default_motor_params();
  426. nv_default_foc_params();
  427. nv_save_foc_params();
  428. nv_save_motor_params();
  429. sys_debug("change motor %x\n", m_params.mot_nr);
  430. }
  431. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_NEW1
  432. m_params.offset = 0.0f; //编码器做了零位置校准
  433. #endif
  434. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_ZD_100
  435. m_params.offset = 0.0f; //编码器做了零位置校准
  436. #endif
  437. #if CONFIG_MOT_TYPE==MOTOR_BLUESHARK_A1
  438. m_params.offset = 0.0f; //编码器做了零位置校准
  439. foc_params.n_currentBand = CONFIG_CURRENT_BANDWITH;
  440. if (CONFIG_DEFAULT_PHASE_CURR_LIM != foc_params.s_PhaseCurrLim) {
  441. foc_params.s_PhaseCurrLim = CONFIG_DEFAULT_PHASE_CURR_LIM;
  442. }
  443. #endif
  444. foc_params.s_maxDCVol = CONFIG_MAX_DC_VOL;
  445. foc_params.s_minDCVol = CONFIG_MIN_DC_VOL;
  446. sys_debug("%d -- %d\n", sizeof(mc_limit_t), sizeof(foc_params_t));
  447. }