spdctrFSM.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: sysfsm.c
  4. Partner Filename: sysfsm.h
  5. Description: System finite state machine
  6. Complier: IAR Embedded Workbench for ARM 7.80.4
  7. CPU TYPE : GD32F3x0
  8. *************************************************************************
  9. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. ************************************************************************/
  19. #ifndef _STARTFSM_C_
  20. #define _STARTFSM_C_
  21. #endif
  22. /************************************************************************
  23. Include File
  24. ************************************************************************/
  25. #include "syspar.h"
  26. #include "user.h"
  27. #include "FSM_1st.h"
  28. #include "FSM_2nd.h"
  29. #include "spdctrFSM.h"
  30. #include "switchhall.h"
  31. #include "spi_master.h"
  32. #include "cmdgennew.h"
  33. #include "power.h"
  34. /************************************************************************
  35. Constant Table:
  36. ************************************************************************/
  37. /************************************************************************
  38. Exported Functions:
  39. ************************************************************************/
  40. void InitPosDet_TbcupHook(void)
  41. {
  42. scm_ulStatCt++;
  43. align_stIn.ulStatCt = scm_ulStatCt;
  44. align_voInitPos(&align_stIn, &align_stCoef, &align_stOut);
  45. scm_slIdRefPu = align_stOut.slIdRefPu; // Q29
  46. scm_swIdRefPu = align_stOut.swIdRefPu; // Q14
  47. scm_swIqRefPu = align_stOut.swIqRefPu; // Q14
  48. scm_uwAngRefPu = align_stOut.uwAngRefPu; // Q15
  49. }
  50. void ParDet_TbcupHook(void)
  51. {}
  52. void StartUp_TbcupHook(void)
  53. {
  54. flx_stCtrlOut.swIqLimPu = (SWORD)cof_uwCurMaxPu;
  55. scm_ulStatCt++;
  56. align_stIn.ulStatCt = scm_ulStatCt;
  57. align_stIn.swRotateDir = scm_swRotateDir;
  58. align_voStartUp(&align_stIn, &align_stCoef, &align_stOut);
  59. scm_slDragSpdRefPu = align_stOut.slDragSpdRefPu;
  60. scm_slDragSpdPu = align_stOut.slDragSpdPu;
  61. scm_swIdRefPu = align_stOut.swIdRefPu;
  62. scm_swIqRefPu = align_stOut.swIqRefPu;
  63. scm_slAngManuPu = align_stOut.slAngManuPu;
  64. scm_uwAngRefPu = align_stOut.uwAngRefPu;
  65. scm_StartUpOvrFlg = align_stOut.blStartUpOvrFlg;
  66. }
  67. void Open2Clz_TbcupHook(void)
  68. {
  69. flx_stCtrlOut.swIqLimPu = (SWORD)cof_uwCurMaxPu;
  70. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  71. {
  72. align_stIn.uwObsElecThetaPu = obs_stObsOutPu.uwElecThetaPu;
  73. }
  74. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  75. {
  76. align_stIn.uwObsElecThetaPu = spi_stResolverOut.uwSpiThetaPu;
  77. }
  78. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  79. {
  80. align_stIn.uwObsElecThetaPu = switchhall_stOut.uwLowThetaPu;
  81. }
  82. else
  83. {
  84. //do noting
  85. }
  86. align_stIn.swCurRefrompu = swCurRefrompu; // swCurRefrompu;
  87. align_voOpen2Clz(&align_stIn, &align_stCoef, &align_stOut);
  88. scm_swIdRefPu = align_stOut.swIdRefPu;
  89. scm_swIqRefPu = align_stOut.swIqRefPu;
  90. scm_blCurSwitchOvrFlg = align_stOut.blCurSwitchOvrFlg;
  91. scm_blAngSwitchOvrFlg = align_stOut.blAngSwitchOvrFlg;
  92. scm_slAngManuPu = align_stOut.slAngManuPu;
  93. scm_uwAngManuPu = align_stOut.uwAngManuPu;
  94. scm_uwAngRefPu = align_stOut.uwAngRefPu;
  95. }
  96. void ClzLoop_TbcupHook(void)
  97. {
  98. /*=======================================================================
  99. Flux weakening
  100. =======================================================================*/
  101. flx_stCtrlIn.swUalphaPu = crd_stVltIParkOut.swAlphaPu; // Q14
  102. flx_stCtrlIn.swUbetaPu = crd_stVltIParkOut.swBetaPu; // Q14
  103. flx_stCtrlIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu; // Q14
  104. flx_stCtrlIn.swIqRefPu = swCurRefrompu; // Q14
  105. flx_stCtrlIn.swUqRefPu = scm_swUqRefPu; // Q14
  106. flx_voCtrl(&flx_stCtrlIn, &flx_stCtrlCoef, &flx_stCtrlOut);
  107. /*=======================================================================
  108. Power Limit
  109. =======================================================================*/
  110. // Q15
  111. pwr_stPwrLimIn.swMotorPwrPu = scm_stMotoPwrInLpf.slY.sw.hi; // Q15
  112. pwr_stPwrLimIn.swIqrefPu = swCurRefrompu; // asr_stSpdPIOut.swIqRefPu;
  113. pwr_stPwrLimIn.PCBTemp = adc_stUpOut.PCBTemp;
  114. pwr_voPwrLim2(&pwr_stPwrLimIn, &pwr_stPwrLimCof, &pwr_stPwrLimOut2); // Q14
  115. scm_swIqRefPu = swCurRefrompu;
  116. scm_swIdRefPu = 0; //flx_stCtrlOut.swIdRefPu;
  117. }
  118. void Stop_TbcupHook(void)
  119. {}
  120. void InitPosDet_TbcdownHook(void)
  121. {
  122. /* Get angle for park transformation */
  123. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  124. scm_uwAngIParkPu = scm_uwAngParkPu;
  125. /*=======================================================================
  126. Current decoupling
  127. =======================================================================*/
  128. acr_stUdqDcpOut.swUdPu = 0;
  129. acr_stUdqDcpOut.swUqPu = 0;
  130. }
  131. void ParDet_TbcdownHook(void)
  132. {
  133. /* Get angle for park transformation */
  134. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  135. scm_uwAngIParkPu = scm_uwAngParkPu;
  136. /*=======================================================================
  137. Current decoupling
  138. =======================================================================*/
  139. acr_stUdqDcpOut.swUdPu = 0;
  140. acr_stUdqDcpOut.swUqPu = 0;
  141. }
  142. void StartUp_TbcdownHook(void)
  143. {
  144. /* Speed feedback LPF */
  145. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  146. {
  147. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  148. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  149. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  150. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  151. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  152. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  153. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  154. }
  155. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  156. {
  157. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  158. }
  159. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  160. {
  161. scm_stSpdFbkLpf.slY.sw.hi = switchhall_stOut.swLowSpdLpfPu;
  162. }
  163. else
  164. {
  165. //do nothing
  166. }
  167. /* Speed feedback Absolute */
  168. scm_uwSpdFbkLpfAbsPu = (UWORD)abs(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  169. /* Get angle for park transformation */
  170. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  171. scm_uwAngIParkPu = scm_uwAngParkPu;
  172. /*=======================================================================
  173. Current decoupling
  174. =======================================================================*/
  175. acr_stUdqDcpOut.swUdPu = 0;
  176. acr_stUdqDcpOut.swUqPu = 0;
  177. }
  178. void Open2Clz_TbcdownHook(void)
  179. {
  180. /* Speed feedback LPF */
  181. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  182. {
  183. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  184. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  185. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  186. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  187. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  188. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  189. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  190. }
  191. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  192. {
  193. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  194. }
  195. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  196. {
  197. scm_stSpdFbkLpf.slY.sw.hi = switchhall_stOut.swLowSpdLpfPu;
  198. }
  199. else
  200. {
  201. //do nothing
  202. }
  203. /* Speed feedback Absolute */
  204. scm_uwSpdFbkLpfAbsPu = (UWORD)abs(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  205. /* Get angle for park transformation */
  206. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  207. scm_uwAngIParkPu = scm_uwAngParkPu;
  208. /*=======================================================================
  209. Current decoupling
  210. =======================================================================*/
  211. acr_stUdqDcpOut.swUdPu = 0;
  212. acr_stUdqDcpOut.swUqPu = 0;
  213. }
  214. void ClzLoop_TbcdownHook(void)
  215. {
  216. ULONG ulTmp1;
  217. SWORD swAngCompPu = 0; // Q15
  218. /* Speed feedback LPF */
  219. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  220. {
  221. obs_stObsCalcIn.swUalphaPu = scm_swUalphaPu; // Q14
  222. obs_stObsCalcIn.swUbetaPu = scm_swUbetaPu; // Q14
  223. obs_stObsCalcIn.swIalphaPu = crd_stCurClarkOut.swAlphaPu; // Q14
  224. obs_stObsCalcIn.swIbetaPu = crd_stCurClarkOut.swBetaPu; // Q14
  225. obs_stObsCalcIn.uwVdcPu = adc_stUpOut.uwVdcLpfPu;
  226. obs_voObsCalc(&obs_stObsCalcIn, &obs_stObsCoefPu, &obs_stObsOutPu);
  227. mth_voLPFilter(obs_stObsOutPu.swElecFreqPu, &scm_stSpdFbkLpf);
  228. scm_uwAngRefPu = obs_stObsOutPu.uwElecThetaPu;
  229. }
  230. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  231. {
  232. mth_voLPFilter(spi_stResolverOut.swSpdFbkPu, &scm_stSpdFbkLpf);
  233. scm_uwAngRefPu = spi_stResolverOut.uwSpiThetaPu;
  234. }
  235. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  236. {
  237. mth_voLPFilter(switchhall_stOut.swLowSpdPu, &scm_stSpdFbkLpf);
  238. scm_uwAngRefPu = switchhall_stOut.uwLowThetaPu;
  239. }
  240. else
  241. {
  242. //do nothing
  243. }
  244. /* Speed feedback Absolute */
  245. scm_uwSpdFbkLpfAbsPu = (UWORD)abs(scm_stSpdFbkLpf.slY.sw.hi); // Q15
  246. /* Get angle for park transformation */
  247. scm_uwAngParkPu = scm_uwAngRefPu; // Q15
  248. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  249. {
  250. swAngCompPu = (SWORD)(((SLONG)obs_stObsOutPu.swElecFreqPu * TBC_TM) >> 10); // Q15
  251. }
  252. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  253. {
  254. swAngCompPu = (SWORD)(((SLONG)spi_stResolverOut.swSpdFbkPu * TBC_TM) >> 10); // Q15
  255. }
  256. else if(cp_stFlg.ThetaGetModelSelect == ANG_SWITCHHALL)
  257. {
  258. swAngCompPu = (SWORD)(((SLONG)switchhall_stOut.swLowSpdPu * TBC_TM) >> 10); // Q15
  259. }
  260. else
  261. {
  262. //do nothing
  263. }
  264. ulTmp1 = scm_uwAngParkPu + ((swAngCompPu * 3) >> 1) + cof_sl720DegreePu;
  265. scm_uwAngIParkPu = (UWORD)(ulTmp1 & 0x7FFF);
  266. /*=======================================================================
  267. Current decoupling
  268. =======================================================================*/
  269. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  270. {
  271. acr_stUdqDcpIn.swWsPu = scm_stSpdFbkLpf.slY.sw.hi; // Q15
  272. }
  273. else if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  274. {
  275. acr_stUdqDcpIn.swWsPu = spi_stResolverOut.swSpdFbkPu; // Q15
  276. }
  277. else
  278. {
  279. //do nothing
  280. }
  281. acr_stUdqDcpIn.swIdRefPu = scm_swIdFdbLpfPu;//scm_swIdRefPu scm_swIdFdbLpfPu // Q14
  282. acr_stUdqDcpIn.swIqRefPu = scm_swIqFdbLpfPu; //scm_swIqRefPu scm_swIqFdbLpfPu // Q14
  283. acr_stUdqDcpIn.swUdqLimPu = scm_swVsDcpLimPu; // Q14
  284. acr_voUdqDcp(&acr_stUdqDcpIn, &acr_stUdqDcpCoef, &acr_stUdqDcpOut);
  285. }
  286. void Stop_TbcdownHook(void)
  287. {
  288. scm_swIdRefPu = 0;
  289. scm_swIqRefPu = 0;
  290. hw_voPWMInit();
  291. cmfsm_stFlg.blMotorStopFlg = TRUE;
  292. }
  293. void InitPosDet_TbsHook(void)
  294. {}
  295. void ParDet_TbsHook(void)
  296. {}
  297. void StartUp_TbsHook(void)
  298. {
  299. /*=======================================================================
  300. Speed PI output limit in "OpenDrg"
  301. =======================================================================*/
  302. if ((curSpeed_state.state == StartUp) && (scm_uwStartMd == START_ALIGN))
  303. {
  304. if (scm_swRotateDir * asr_stSpdPIOut.slIqRefPu < 0)
  305. {
  306. asr_stSpdPIOut.slIqRefPu = 0; // Q30
  307. asr_stSpdPIOut.slIqSumPu = 0; // Q30
  308. asr_stSpdPIOut.slIqiPu = 0;
  309. }
  310. else
  311. {
  312. if (scm_swRotateDir * asr_stSpdPIOut.slIqRefPu > ((SLONG)mn_uwDragCurPu << 16)) // Q30
  313. {
  314. asr_stSpdPIOut.slIqRefPu = scm_swRotateDir * ((SLONG)mn_uwDragCurPu << 16); // Q30
  315. asr_stSpdPIOut.slIqiPu = scm_swRotateDir * ((SLONG)mn_uwDragCurPu << 16); // Q14+Q16=Q30
  316. }
  317. }
  318. }
  319. }
  320. void Open2Clz_TbsHook(void)
  321. {}
  322. void ClzLoop_TbsHook(void)
  323. {}
  324. void Stop_TbsHook(void)
  325. {}
  326. void scm_voSpdCtrMdFSM(void) /* parasoft-suppress METRICS-28 "本项目圈复杂度无法更改,后续避免" */
  327. {
  328. switch (curSpeed_state.state)
  329. {
  330. case Charge:
  331. break;
  332. case InitPosDet:
  333. /* Command run disable */
  334. /* Motor run flag set */
  335. cmfsm_stFlg.blMotorStopFlg = FALSE;
  336. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  337. {
  338. Switch_speed_FSM(&Stop_state);
  339. }
  340. if (scm_ulStatCt < mn_ulAlignRampTbcCt)
  341. {}
  342. else if (scm_ulStatCt >= (mn_ulAlignRampTbcCt + mn_ulAlignHoldTbcCt + 10))
  343. {
  344. if(cp_stFlg.SpiOffsetFirstSetFlg == 0)
  345. {
  346. cp_stFlg.SpiOffsetFirstSetFinishFlg = 1;
  347. }
  348. else
  349. {
  350. if(cp_stFlg.ThetaGetModelSelect == ANG_RESOLVER)
  351. {
  352. align_stCoef.uwSPIreadOnceCt = 0;
  353. }
  354. else
  355. {}
  356. if(cp_stFlg.RunModelSelect == InitPos)
  357. {
  358. }
  359. else if(cp_stFlg.RunModelSelect == ClZLOOP)
  360. {
  361. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  362. {
  363. Switch_speed_FSM(&StartUp_state);
  364. }
  365. else
  366. {
  367. Switch_speed_FSM(&ClzLoop_state);
  368. }
  369. }
  370. else
  371. {
  372. Switch_speed_FSM(&StartUp_state);
  373. }
  374. }
  375. }
  376. else
  377. {
  378. //do nothing
  379. }
  380. break;
  381. case StartUp:
  382. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  383. {
  384. Switch_speed_FSM(&Stop_state);
  385. }
  386. if (scm_StartUpOvrFlg == TRUE)
  387. {
  388. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  389. {
  390. if(cp_stFlg.RunModelSelect == ClZLOOP || cp_stFlg.RunModelSelect == CityBIKE || cp_stFlg.RunModelSelect == MountainBIKE)
  391. {
  392. if (FSM2nd_Run_state.state == Boost)
  393. {
  394. cmd_stCmdOut.slIntRefPu = ((SLONG)scm_stSpdFbkLpf.slY.sw.hi * 5) << 12; // Q29 5/4
  395. }
  396. else if (FSM2nd_Run_state.state == Assistance)
  397. {
  398. //do nothing
  399. }
  400. else
  401. {
  402. //do nothing
  403. }
  404. Switch_speed_FSM(&Open2Clz_state);
  405. }
  406. }
  407. else
  408. {
  409. }
  410. }
  411. /* Command run disable */
  412. break;
  413. case Open2Clz:
  414. /* Command run disable */
  415. if (!switch_flg.SysRun_Flag || switch_flg.SysFault_Flag || power_stPowStateOut.powerstate == POWER_OFF)
  416. {
  417. Switch_speed_FSM(&Stop_state);
  418. }
  419. /* Switch over */
  420. if (scm_blCurSwitchOvrFlg && scm_blAngSwitchOvrFlg)
  421. {
  422. Switch_speed_FSM(&ClzLoop_state);
  423. }
  424. break;
  425. case ClzLoop:
  426. /* Go to stop */
  427. cmfsm_stFlg.blMotorStopFlg = FALSE;
  428. if (switch_flg.SysFault_Flag == 1 || power_stPowStateOut.powerstate == POWER_OFF)
  429. {
  430. Switch_speed_FSM(&Stop_state);
  431. }
  432. if (!switch_flg.SysRun_Flag)
  433. {
  434. /* Go to stop */
  435. if ((abs(scm_swSpdRefPu) < mn_swStopSpdRefPu) && (scm_uwSpdFbkLpfAbsPu < mn_swStopSpdRefPu))
  436. {
  437. scm_swIdRefPu = 0;
  438. scm_swIqRefPu = 0;
  439. Switch_speed_FSM(&Stop_state);
  440. }
  441. }
  442. else
  443. {}
  444. break;
  445. case Stop:
  446. if (switch_flg.SysRun_Flag == TRUE && switch_flg.SysFault_Flag == FALSE) //&& power_stPowStateOut.powerstate == POWER_ON_END
  447. {
  448. scm_voSpdCtrMdInit();
  449. if(cp_stFlg.SpiOffsetFirstSetFlg == 0)
  450. {
  451. Switch_speed_FSM(&InitPosDet_state);
  452. }
  453. else
  454. {
  455. if(cp_stFlg.RunModelSelect == CityBIKE || cp_stFlg.RunModelSelect == MountainBIKE)
  456. {
  457. if(cp_stFlg.ThetaGetModelSelect == ANG_OBSERVER)
  458. {
  459. Switch_speed_FSM(&InitPosDet_state);
  460. }
  461. else
  462. {
  463. Switch_speed_FSM(&ClzLoop_state);
  464. }
  465. }
  466. else
  467. {
  468. Switch_speed_FSM(&InitPosDet_state);
  469. }
  470. }
  471. }
  472. break;
  473. default:
  474. break;
  475. }
  476. }
  477. void Switch_speed_FSM(const SPD_STATE_HOOK *in)
  478. {
  479. scm_ulStatCt = 0;
  480. curSpeed_state = *in;
  481. }
  482. void Switch_speed_FSMInit(void)
  483. {
  484. scm_ulStatCt = 0;
  485. curSpeed_state = Stop_state;
  486. }
  487. /************************************************************************
  488. Function: void RUN_FSM_Main(void)
  489. Description:
  490. Call by:
  491. Input Variables:
  492. Output/Return Variables:
  493. Subroutine Call:
  494. Reference:
  495. ************************************************************************/
  496. /************************************************************************
  497. Local Functions: N/A
  498. ************************************************************************/
  499. /************************************************************************
  500. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  501. All rights reserved.
  502. ************************************************************************/
  503. #ifdef _STARTFSM_C_
  504. #undef _STARTFSM_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  505. #endif
  506. /************************************************************************
  507. End of this File (EOF)!
  508. Do not put anything after this part!
  509. ************************************************************************/