tasks.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876
  1. #include "tasks.h"
  2. #include "usart.h"
  3. #include "key_drivers.h"
  4. #include "tim.h"
  5. #include "var.h"
  6. /************************è???±?á?************************/
  7. uint8_t PowerOn_flag=0;
  8. uint16_t MC_error_cnt=0;
  9. uint16_t BMS_Charging_count=0;
  10. uint16_t TE_Sync_Clock_Freq=1000, MCU_FreqResult=0;
  11. /************************全局变量End*********************/
  12. /************************局部函数定义********************/
  13. static void PowerKey_Process(void)
  14. {
  15. Key_Check(&Key_On_Off, 10);
  16. //Key_On_Off按键处理
  17. if( Key_On_Off.KeyStatus != Key_Status_NoPress )
  18. {
  19. if(Key_On_Off.KeyStatus == Key_Status_ShortPress)//短按
  20. {
  21. Key_On_Off.KeyStatus = Key_Status_NoPress;
  22. //按键测试模式,按键置位
  23. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  24. {
  25. PBU_Test_Process.KeyTest_Status.Status_Bit.Power = 1;
  26. }
  27. }
  28. else if(Key_On_Off.KeyStatus == Key_Status_LongPress)//长按
  29. {
  30. Key_On_Off.KeyStatus = Key_Status_NoPress;
  31. //任意模式下,关机处理
  32. //按键测试模式,按键置位
  33. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  34. {
  35. PBU_Test_Process.KeyTest_Status.Status_Bit.Power = 1;
  36. }
  37. else
  38. {
  39. if(PBU_PowerOn_Process.PowerKeyStatus == 2)
  40. {
  41. //系统关机处理,广播发送ShudDown指令,收到所有设备的Ready信号或超时关机
  42. LED_Blink_Enable = 0x00;
  43. PBU_RunMode = PBU_RunMode_PowerOff;
  44. PBU_PowerOff_Process.DelayTimeCnt = SysTime_5ms;
  45. PBU_PowerOff_Process.SendCodeTimeCnt = 0;
  46. }
  47. }
  48. }
  49. }
  50. }
  51. static void LightKey_Process(void)
  52. {
  53. Key_Check(&Key_Light,120);
  54. //Key_Light按键处理
  55. if(Key_Light.KeyStatus != Key_Status_NoPress )
  56. {
  57. if(Key_Light.KeyStatus == Key_Status_ShortPress)//短按
  58. {
  59. Key_Light.KeyStatus = Key_Status_NoPress;
  60. //按键测试模式,按键置位
  61. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  62. {
  63. PBU_Test_Process.KeyTest_Status.Status_Bit.Light = 1;
  64. }
  65. //助力控制模式,调节灯光
  66. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  67. {
  68. if(ControlCode.LightSwitch == 0xF1)
  69. {
  70. ControlCode.LightSwitch = 0xF0;
  71. }
  72. else
  73. {
  74. ControlCode.LightSwitch = 0xF1;
  75. }
  76. }
  77. else if(PBU_HMI_Menu_Process.HMI_ACK_Flag == TRUE)
  78. {
  79. if(ControlCode.LightSwitch == 0xF1)
  80. {
  81. ControlCode.LightSwitch = 0xF0;
  82. }
  83. else
  84. {
  85. ControlCode.LightSwitch = 0xF1;
  86. }
  87. PBU_HMI_Menu_Process.KeyTrig_Flag = 1;
  88. PBU_HMI_Menu_Process.PBU_HMI_KeyStatus.Key_Light = Key_Status_ShortPress;
  89. }
  90. }
  91. else if(Key_Light.KeyStatus == Key_Status_LongPress)//长按
  92. {
  93. Key_Light.KeyStatus = Key_Status_NoPress;
  94. }
  95. }
  96. }
  97. static void _Task_KeyScan(void)
  98. {
  99. //按键判断
  100. Key_Check(&Key_Walk,120);
  101. Key_Check(&Key_Down,120);
  102. Key_Check(&Key_Up,120);
  103. if((ADC_Result[4]+ADC_Result[2]+ADC_Result[5])<5000)
  104. {
  105. KeyParamInit_no_cont(&Key_Walk);
  106. KeyParamInit_no_cont(&Key_Down);
  107. KeyParamInit_no_cont(&Key_Up);
  108. }
  109. if( (PBU_ErrorCode.Code!=0)||(MC_ErrorCode.Code!=0))
  110. {
  111. Error_Init();
  112. KeyParamInit(&Key_Walk);
  113. KeyParamInit(&Key_Down);
  114. KeyParamInit(&Key_Up);
  115. }
  116. else if(BMS_ChargingFlag == TRUE)//电池充电
  117. {
  118. Error_Init();
  119. KeyParamInit(&Key_Walk);
  120. KeyParamInit(&Key_Down);
  121. KeyParamInit(&Key_Up);
  122. }
  123. else
  124. {
  125. //Key_Walk按键处理
  126. if( Key_Walk.KeyStatus != Key_Status_NoPress )
  127. {
  128. if(Key_Walk.KeyStatus == Key_Status_ShortPress)//短按
  129. {
  130. Key_Walk.KeyStatus = Key_Status_NoPress;
  131. //按键测试模式,按键置位
  132. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  133. {
  134. PBU_Test_Process.KeyTest_Status.Status_Bit.Walk = 1;
  135. }
  136. //助力控制模式,进入推行助力等待
  137. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  138. {
  139. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_WalkSby)//推行等待模式下,退出到进入前档位
  140. {
  141. if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
  142. {
  143. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  144. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  145. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  146. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  147. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  148. }
  149. else
  150. {
  151. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  152. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  153. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  154. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  155. }
  156. }
  157. else//进入推行等待
  158. {
  159. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Smart)
  160. {
  161. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = TRUE;
  162. }
  163. else
  164. {
  165. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  166. }
  167. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_WalkSby;
  168. PBU_AssitMode_Status.GearStBak_Walk = ControlCode.GearSt;
  169. PBU_AssitMode_Status.WalkDelayTimeCnt = SysTime_5ms;
  170. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  171. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  172. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  173. }
  174. }
  175. }
  176. else if(Key_Walk.KeyStatus == Key_Status_LongPress)//长按
  177. {
  178. Key_Walk.KeyStatus = Key_Status_NoPress;
  179. }
  180. }
  181. //Key_Down按键处理
  182. if(Key_Down.KeyStatus != Key_Status_NoPress )
  183. {
  184. if(Key_Down.KeyStatus == Key_Status_ShortPress)//短按
  185. {
  186. Key_Down.KeyStatus = Key_Status_NoPress;
  187. //按键测试模式,按键置位
  188. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  189. {
  190. PBU_Test_Process.KeyTest_Status.Status_Bit.Dec = 1;
  191. }
  192. //助力控制模式,调节档位、退出Smart模式、退出推行模式
  193. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  194. {
  195. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  196. {
  197. if(ControlCode.GearSt > 0)
  198. {
  199. ControlCode.GearSt--;
  200. PBU_AssitMode_Status.GearStBak_Smart--;
  201. PBU_AssitMode_Status.GearStBak_Walk--;
  202. }
  203. }
  204. else if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
  205. {
  206. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  207. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  208. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  209. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  210. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  211. }
  212. else
  213. {
  214. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  215. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  216. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  217. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  218. }
  219. }
  220. }
  221. else if(Key_Down.KeyStatus == Key_Status_LongPress)//长按
  222. {
  223. Key_Down.KeyStatus = Key_Status_NoPress;
  224. //助力控制模式,调节档位、退出Smart模式、退出推行模式
  225. if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  226. {
  227. if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
  228. {
  229. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  230. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  231. }
  232. else
  233. {
  234. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  235. }
  236. }
  237. }
  238. }
  239. //Key_Up按键处理
  240. if(Key_Up.KeyStatus != Key_Status_NoPress )
  241. {
  242. if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
  243. {
  244. Key_Up.KeyStatus = Key_Status_NoPress;
  245. //按键测试模式,按键置位
  246. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  247. {
  248. PBU_Test_Process.KeyTest_Status.Status_Bit.Add = 1;
  249. }
  250. //助力控制模式,调节档位
  251. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  252. {
  253. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  254. {
  255. if(ControlCode.GearSt < PBU_ConfigParam.GearsNum)
  256. {
  257. ControlCode.GearSt++;
  258. PBU_AssitMode_Status.GearStBak_Smart++;
  259. PBU_AssitMode_Status.GearStBak_Walk++;
  260. }
  261. }
  262. else if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Smart)
  263. {
  264. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  265. }
  266. }
  267. }
  268. else if(Key_Up.KeyStatus == Key_Status_LongPress)//长按
  269. {
  270. Key_Up.KeyStatus = Key_Status_NoPress;
  271. //助力控制模式,进入i-Sport
  272. if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  273. {
  274. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  275. {
  276. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  277. PBU_AssitMode_Status.GearStBak_Smart = ControlCode.GearSt;
  278. }
  279. else if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Smart)
  280. {
  281. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  282. }
  283. }
  284. }
  285. }
  286. }
  287. }
  288. //计算MCU同步时钟频率
  289. void Cal_SyncClockFreq(uint16_t* Result)
  290. {
  291. uint16_t Count = 0;
  292. Count = __HAL_TIM_GET_COUNTER(&htim2);
  293. *Result = Count * 20 / 1000;//50ms内计数值,单位转换为KHz
  294. __HAL_TIM_SET_COUNTER(&htim2, 0);
  295. }
  296. //比较MCU和TE采集的时钟频率
  297. void SyncClockFreq_Judge(uint16_t FreqResult, uint16_t Sync_Clock_Freq)
  298. {
  299. static uint32_t SyncClockErrorCnt = 0;
  300. if( ( FreqResult < (Sync_Clock_Freq - 200) ) || ( FreqResult > (Sync_Clock_Freq + 200) ) )
  301. {
  302. SyncClockErrorCnt++;
  303. if( SyncClockErrorCnt > 100 )
  304. {
  305. SyncClockErrorCnt = 0;
  306. PBU_TE_ErrorCode.ERROR_Bit.MCU_Fault = 1;
  307. }
  308. }
  309. else
  310. {
  311. SyncClockErrorCnt = 0;
  312. }
  313. }
  314. //static void _Task_ADC_Update(void)
  315. //{
  316. // int32_t Temp_int32 = 0;
  317. //更新Vref电压
  318. // MCU_VDDA = 3300 * (*VREFINT_CAL) / ADC_Value_Vin.ADC_Result[ADC_RANK_VREF];
  319. // ADC_Value_Vin.Voltage[ADC_RANK_VREF] = ADC_Value_Vin.ADC_Result[ADC_RANK_VREF] * MCU_VDDA / 4095;
  320. //
  321. // //更新母线电压值结果
  322. // ADC_Value_Vin.Voltage[ADC_RANK_VIN] = ADC_Value_Vin.ADC_Result[ADC_RANK_VIN] * MCU_VDDA / 4095;
  323. // Voltage_Vin = ADC_Value_Vin.Voltage[ADC_RANK_VIN] * 16;//300K 20K
  324. //
  325. // //更新MCU内部温度
  326. // #if 1
  327. // ADC_Value_Vin.Voltage[ADC_RANK_TEMP] = ADC_Value_Vin.ADC_Result[ADC_RANK_TEMP] * MCU_VDDA / 4095;
  328. // Temp_int32 = (int16_t)(1430 - ADC_Value_Vin.Voltage[ADC_RANK_TEMP]);
  329. // MCU_Temperature = Temp_int32 * 100 / 430 + 25;
  330. // #elif 1
  331. // Temp_int32 = (int32_t)ADC_Value_Vin.ADC_Result[ADC_RANK_TEMP];
  332. // Temp_int32 = (int32_t)(Temp_int32 * MCU_VDDA * 10 / 33) / 1000;
  333. // Temp_int32 = Temp_int32 - (int32_t)(*TEMP30_CAL_ADDR);
  334. // Temp_int32 = Temp_int32 * (int32_t)(110 - 30);
  335. // Temp_int32 = Temp_int32 / ((int32_t)(*TEMP110_CAL_ADDR) - (int32_t)(*TEMP30_CAL_ADDR));
  336. // MCU_Temperature = Temp_int32 + 30;
  337. // #endif
  338. //}
  339. /**************************局部函数定义结束*****************/
  340. /**************************全局函数定义*********************/
  341. //超时计数
  342. uint32_t TimeCntDiff_5ms(uint32_t v)
  343. {
  344. int32_t lDiff;
  345. lDiff = (int32_t)(SysTime_5ms - v);
  346. if(lDiff < 0)
  347. {
  348. lDiff += ((int32_t)TCNT_1HOUR);
  349. }
  350. return (uint32_t)lDiff;
  351. }
  352. //1ms任务处理函数
  353. void HAL_SYSTICK_Callback(void)
  354. {
  355. static uint16_t TimeCnt_5ms = 0;
  356. static uint16_t TimeCnt_10ms = 0;
  357. static uint16_t TimeCnt_50ms = 0;
  358. // static uint16_t TimeCnt_100ms = 0;
  359. static uint16_t TimeCnt_1000ms = 0;
  360. Scan_Key_ADC_Error();
  361. // Vin_test_Check();
  362. //5ms任务
  363. TimeCnt_5ms++;
  364. if(TimeCnt_5ms >= 5)
  365. {
  366. TimeCnt_5ms = 0;
  367. SysTime_5ms++;
  368. }
  369. if(SysTime_5ms > TCNT_1HOUR)
  370. {
  371. SysTime_5ms = 0;
  372. }
  373. //10ms任务
  374. TimeCnt_10ms++;
  375. if(TimeCnt_10ms >= 10)
  376. {
  377. TimeCnt_10ms = 0;
  378. //按键扫描
  379. PowerKey_Process();
  380. if(PBU_ErrorCode.ERROR_Bit.Key_Light == 0) LightKey_Process();
  381. if(PowerOn_flag==1)
  382. _Task_KeyScan();
  383. }
  384. //50ms任务
  385. if(PBU_TE_FaultDetectFlag == TRUE)
  386. {
  387. TimeCnt_50ms++;
  388. if(TimeCnt_50ms >= 50)
  389. {
  390. TimeCnt_50ms = 0;
  391. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
  392. Scan_Key_Start=0x01;
  393. Cal_SyncClockFreq(&MCU_FreqResult);
  394. SyncClockFreq_Judge(MCU_FreqResult, TE_Sync_Clock_Freq);
  395. }
  396. }
  397. //1000ms任务
  398. if(LED_Blink_Enable == 0x01)
  399. {
  400. TimeCnt_1000ms++;
  401. if(TimeCnt_1000ms >= 1000)
  402. {
  403. TimeCnt_1000ms = 0;
  404. //更新ADC转换结果
  405. // _Task_ADC_Update();
  406. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
  407. }
  408. }
  409. else
  410. {
  411. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET);
  412. }
  413. MC_error_cnt++;
  414. if(MC_error_cnt >= 3000)
  415. {
  416. MC_error_cnt=0;
  417. MC_ErrorCode.Code = 0;
  418. }
  419. }
  420. //PBU运行模式处理函数
  421. void PBU_RunMode_Process(PBU_RunMode_t RunMode)
  422. {
  423. switch(RunMode)
  424. {
  425. case PBU_RunMode_MC_AssisitCtrl:
  426. {
  427. //助力模式控制
  428. switch(PBU_AssitMode_Status.PBU_AssistMode_Flag)
  429. {
  430. case PBU_AssistMode_Flag_WalkSby://预推行模式
  431. {
  432. if((*(Key_Up.ADC_result)<1000)&&(*(Key_Walk.ADC_result)>3000)&&(*(Key_Down.ADC_result)>3000))
  433. {
  434. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Walk;
  435. ControlCode.GearSt = 0x22;
  436. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = TRUE;
  437. }
  438. else
  439. {
  440. // ControlCode.GearSt = 0x00;
  441. if(TimeCntDiff_5ms(PBU_AssitMode_Status.WalkDelayTimeCnt) > 600)//³¬Ê±600 * 5 = 3s£¬»Ö¸´ÖúÁ¦µµÎ»
  442. {
  443. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Walk;
  444. if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
  445. {
  446. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  447. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  448. }
  449. else
  450. {
  451. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  452. }
  453. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  454. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  455. }
  456. }
  457. break;
  458. }
  459. case PBU_AssistMode_Flag_Gear://助力模式
  460. {
  461. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Smart;
  462. break;
  463. }
  464. case PBU_AssistMode_Flag_Walk://推行模式
  465. {
  466. if((*(Key_Up.ADC_result)>3000)||((ADC_Result[4]+ADC_Result[2]+ADC_Result[5])<5000))//zsm 防止推行过程中,有两个键同时按下,还继续推行
  467. {
  468. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Walk;
  469. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_WalkSby;
  470. PBU_AssitMode_Status.WalkDelayTimeCnt = SysTime_5ms;
  471. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  472. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  473. }
  474. break;
  475. }
  476. case PBU_AssistMode_Flag_Smart://智能模式
  477. {
  478. ControlCode.GearSt = 0x33;
  479. break;
  480. }
  481. default:break;
  482. }
  483. //发送预推行模式指令
  484. if(PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag == FALSE)
  485. {
  486. if(TimeCntDiff_5ms(PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby) > 40) // 超时40 * 5 = 200ms
  487. {
  488. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_WalkSby)
  489. {
  490. SendData(ID_PBU_TO_HMI, MODE_WRITE, 0x7304, (uint8_t*)"STAR");
  491. }
  492. else
  493. {
  494. SendData(ID_PBU_TO_HMI, MODE_WRITE, 0x7304, (uint8_t*)"STOP");
  495. }
  496. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = SysTime_5ms;
  497. }
  498. if(TimeCntDiff_5ms(PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt) > 400)//超时400 * 5 = 2s
  499. {
  500. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  501. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = TRUE;
  502. }
  503. }
  504. else
  505. {
  506. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = SysTime_5ms;
  507. }
  508. //发送控制指令
  509. if(MC_ErrorCode.Code != (uint32_t)0)//存在故障码时,关闭助力
  510. {
  511. ControlCode.GearSt = 0;
  512. PBU_AssitMode_Status.GearStBak_Smart = 0;
  513. }
  514. if(TimeCntDiff_5ms(PBU_AssitMode_Status.SendCodeTimeCnt_Ctl) >= 10)//超时10 * 5 = 50ms
  515. {
  516. static uint8_t i = 0;
  517. if(i == 0)
  518. {
  519. i = 1;
  520. if(PBU_AssitMode_Status.PBU_AssistMode_Flag==PBU_AssistMode_Flag_WalkSby)
  521. {
  522. ControlCode_MC_WalkSby.GearSt=0;
  523. ControlCode_MC_WalkSby.LightSwitch=ControlCode.LightSwitch;
  524. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  525. }
  526. else
  527. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode.GearSt)));
  528. }
  529. else if(i == 1)
  530. {
  531. i = 2;
  532. SendData(ID_PBU_TO_BMS, 0x11, 0x5000,(uint8_t*)NULL);
  533. }
  534. else if(i == 2)
  535. {
  536. i = 0;
  537. SendData(ID_PBU_TO_HMI, 0x0C, 0x7402,(uint8_t*)(&(ControlCode.GearSt)));
  538. }
  539. PBU_AssitMode_Status.SendCodeTimeCnt_Ctl = SysTime_5ms;
  540. }
  541. if((PowerOn_flag==1)&&(PBU_AssitMode_Status.PBU_AssistMode_Flag!=PBU_AssistMode_Flag_WalkSby))
  542. {
  543. if(TimeCntDiff_5ms(MC_Online_TimeCnt) >=400)
  544. {
  545. MC_Online_Flag = 0;
  546. PBU_commErrorCode.ERROR_Bit.Communication_MC_Fault =1;
  547. }
  548. if(MC_Online_Flag == 1)
  549. {
  550. PBU_commErrorCode.ERROR_Bit.Communication_MC_Fault = 0;
  551. }
  552. }
  553. if(PowerOn_flag==1)
  554. {
  555. if(TimeCntDiff_5ms(BMS_Online_TimeCnt) >=400)
  556. {
  557. BMS_Online_Flag = 0;
  558. // PBU_commErrorCode.ERROR_Bit.Communication_Fault =1;
  559. }
  560. }
  561. break;
  562. }
  563. case PBU_RunMode_CDL_KeyTest:
  564. {
  565. static uint8_t SendCnt = 0;
  566. //退出按键测试模式前,100ms发送一次按键状态
  567. if( (PBU_Test_Process.KeyTest_Status.Status&0x3F) != 0x00)
  568. {
  569. if(TimeCntDiff_5ms(PBU_Test_Process.SendCodeTimeCnt) >= 40)//超时40 * 5 = 200ms
  570. {
  571. SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9101, &(PBU_Test_Process.KeyTest_Status.Status));
  572. SendCnt++;
  573. if(SendCnt >= 5)
  574. {
  575. SendCnt = 0;
  576. PBU_Test_Process.KeyTest_Status.Status = 0x00;
  577. }
  578. PBU_Test_Process.SendCodeTimeCnt = SysTime_5ms;
  579. }
  580. }
  581. else
  582. {
  583. PBU_Test_Process.SendCodeTimeCnt = SysTime_5ms;
  584. }
  585. MC_Online_TimeCnt=SysTime_5ms;
  586. BMS_Online_TimeCnt=SysTime_5ms;
  587. break;
  588. }
  589. case PBU_RunMode_PowerOff:
  590. {
  591. /* Send shutdown command to AUX_MCU */
  592. // Shutdown_AUX();
  593. LED_INIT();
  594. //关机前,发送指令关灯,避免下次开机时灯会闪亮一下
  595. ControlCode_MC_WalkSby.GearSt = 0;
  596. ControlCode_MC_WalkSby.LightSwitch = 0xF0;
  597. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  598. HAL_Delay(50);
  599. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  600. PowerOn_flag=0;
  601. //关机前发送SHUTDOWN指令,收到所有设备关机就绪信号,或超时2s关机
  602. if((PBU_PowerOff_Process.Ready_Status.Status & 0x01) != 0x01)//未收到所有设备的关机就绪信号
  603. {
  604. if(TimeCntDiff_5ms(PBU_PowerOff_Process.SendCodeTimeCnt) >= 20)//超时20 * 5ms = 100ms
  605. {
  606. SendData(ID_PBU_BC, MODE_REPORT, 0x1008, (uint8_t*)"SHUTDOWN");
  607. PBU_PowerOff_Process.SendCodeTimeCnt = SysTime_5ms;
  608. }
  609. }
  610. else
  611. {
  612. //关机前处理
  613. //...
  614. SYS_POWER_OFF();
  615. SendMotorDisableToTE();
  616. LED_INIT_ALL();
  617. do
  618. {
  619. HAL_IWDG_Refresh(&hiwdg1);
  620. }while(*(Key_On_Off.ADC_result)<3000);
  621. __set_FAULTMASK(1);//关闭所有中断
  622. HAL_NVIC_SystemReset();
  623. }
  624. //超时判断
  625. if(TimeCntDiff_5ms(PBU_PowerOff_Process.DelayTimeCnt) >= 200)//超200 * 5ms = 1s
  626. {
  627. //关机前处理
  628. //...
  629. SYS_POWER_OFF();
  630. SendMotorDisableToTE();
  631. LED_INIT_ALL();
  632. do
  633. {
  634. HAL_IWDG_Refresh(&hiwdg1);
  635. }while(*(Key_On_Off.ADC_result)<3000);
  636. __set_FAULTMASK(1);//关闭所有中断
  637. HAL_NVIC_SystemReset();
  638. }
  639. MC_Online_TimeCnt=SysTime_5ms;
  640. BMS_Online_TimeCnt=SysTime_5ms;
  641. break;
  642. }
  643. case PBU_RunMode_Updating:
  644. {
  645. MC_Online_TimeCnt=SysTime_5ms;
  646. BMS_Online_TimeCnt=SysTime_5ms;
  647. ControlCode.GearSt = 0;
  648. PBU_AssitMode_Status.GearStBak_Smart = 0;
  649. PBU_AssitMode_Status.GearStBak_Walk = 0;
  650. break;
  651. }
  652. default:break;
  653. }
  654. }
  655. //CAN数据解析函数
  656. void CanRx_Process(void)
  657. {
  658. CAN_RxData_Process(&CAN_RxBuf_Struct_MC, 500);
  659. CAN_RxData_Process_Temp(&CAN_RxBuf_Struct_BMS, 500);
  660. CAN_RxData_Process(&CAN_RxBuf_Struct_HMI, 500);
  661. CAN_RxData_Process(&CAN_RxBuf_Struct_CDL, 500);
  662. }
  663. //PBU开机判断,开关机按键弹起或超时5s后,再次检测开关机按键状态
  664. void PBU_PowerOn_Judge(void)
  665. {
  666. KeyScanCode_Struct_t KeyState;
  667. switch(PBU_PowerOn_Process.PowerKeyStatus)
  668. {
  669. //初始状态
  670. case 0:
  671. {
  672. KeyState = KeyScan();
  673. if((KeyState.Code & 0x3F) == 0x01)
  674. {
  675. PBU_PowerOn_Process.PowerOnOKCnt++;
  676. if( PBU_PowerOn_Process.PowerOnOKCnt >= 10 )
  677. {
  678. LED_Blink_Enable = 0x01;
  679. SYS_POWER_ON();
  680. SendMotorEnableToTE();
  681. HAL_Delay(50);
  682. SendMotorEnableToTE();
  683. HAL_Delay(50);
  684. SendMotorEnableToTE();
  685. HAL_Delay(50);
  686. SendMotorEnableToTE();
  687. PBU_PowerOn_Process.PowerKeyStatus = 1;
  688. }
  689. }
  690. else
  691. {
  692. PBU_PowerOn_Process.PowerOnOKCnt=0;
  693. }
  694. break;
  695. }
  696. //按下中
  697. case 1:
  698. {
  699. if(*(Key_On_Off.ADC_result)>3000)
  700. {
  701. PBU_PowerOn_Process.PowerKeyStatus = 2;
  702. }
  703. break;
  704. }
  705. //弹起
  706. case 2:
  707. {
  708. break;
  709. }
  710. default:break;
  711. }
  712. }
  713. //发送配置参数给到MC
  714. void SendCfgToMC(void)
  715. {
  716. uint8_t SendBuf[8] = {0};
  717. //复制参数
  718. SendBuf[0] = PBU_ConfigParam.GearsNum;
  719. SendBuf[1] = PBU_ConfigParam.NoHMI_Flag;
  720. //开始发送数据,收到ACK前,100ms发送一次,超时2s
  721. PBU_MC_Cfg.DelayTimeCnt = SysTime_5ms;
  722. PBU_MC_Cfg.SendCodeTimeCnt = SysTime_5ms;
  723. do
  724. {
  725. if(TimeCntDiff_5ms(PBU_MC_Cfg.SendCodeTimeCnt) > 20) // 超时20 * 5 = 100ms
  726. {
  727. SendData(ID_PBU_TO_MC, MODE_WRITE, 0x3208, SendBuf);
  728. PBU_MC_Cfg.SendCodeTimeCnt = SysTime_5ms;
  729. }
  730. CAN_RxData_Process(&CAN_RxBuf_Struct_MC, 500);
  731. }while((PBU_MC_Cfg.MC_ACK_Flag == FALSE) && (TimeCntDiff_5ms(PBU_MC_Cfg.DelayTimeCnt) <= 400));//超时2s
  732. PBU_MC_Cfg.MC_ACK_Flag = TRUE;
  733. }
  734. //发送故障码
  735. void PBU_Error_Process(void)
  736. {
  737. static uint32_t SendCodeTimeCnt = 0;
  738. if(PBU_RunMode != PBU_RunMode_Updating)
  739. {
  740. PBU_ErrorCode.Code=(PBU_ErrorCode.Code|PBU_hardwareErrorCode.Code|PBU_commErrorCode.Code|PBU_TE_ErrorCode.Code);
  741. PBU_Error_senddata=PBU_ErrorCode.Code;
  742. if(PBU_Error_senddata != 0)
  743. {
  744. if(PBU_ErrorFlag == FALSE)
  745. {
  746. SendCodeTimeCnt = SysTime_5ms;
  747. PBU_ErrorFlag = TRUE;
  748. }
  749. if(TimeCntDiff_5ms(SendCodeTimeCnt) > 100) // 超时100 * 5 = 500ms
  750. {
  751. SendData(ID_PBU_BC, MODE_REPORT, 0x1504, (uint8_t*)&PBU_Error_senddata);
  752. SendCodeTimeCnt = SysTime_5ms;
  753. PBU_Error_senddata = 0;
  754. }
  755. }
  756. else
  757. {
  758. PBU_ErrorFlag = FALSE;
  759. }
  760. }
  761. }
  762. //自动关机处理
  763. void AutoPowerOff_Process(void)
  764. {
  765. static uint32_t DelayTimeCnt = 0;
  766. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  767. static KeyScanCode_Struct_t KeySate;
  768. KeyScanCode_Struct_t KeySate_Temp;
  769. if(IsFirstEnterFlag == TRUE)
  770. {
  771. DelayTimeCnt = SysTime_5ms;
  772. KeySate = KeyScan();
  773. IsFirstEnterFlag = FALSE;
  774. }
  775. KeySate_Temp = KeyScan();
  776. if((MC_RunInfo.BikeSpeed != 0) || //无车速
  777. (MC_RunInfo.Cadence != 0) || //无踏频
  778. (MC_RunInfo.MotorSpeed != 0)|| //电机无转速
  779. (MC_RunInfo.Torque > 5) || //无力矩
  780. (KeySate.Code != KeySate_Temp.Code) ||
  781. (PBU_RunMode == PBU_RunMode_CDL_KeyTest) ) //无按键触发
  782. {
  783. DelayTimeCnt = SysTime_5ms;
  784. }
  785. else
  786. {
  787. if((TimeCntDiff_5ms(DelayTimeCnt) > 60000)) // 超时60000 * 5ms = 300s
  788. {
  789. PBU_RunMode = PBU_RunMode_PowerOff;
  790. }
  791. }
  792. KeySate = KeySate_Temp;
  793. }
  794. /* Functional safety key processing */
  795. void FSK_Process(void)
  796. {
  797. static uint8_t TE_Online_DetectIniFlag=0;
  798. if(HAL_GetTick() < 5000) //前5s屏蔽与TE检测有关的错误,5s后TE稳定后开始检测故障
  799. {
  800. PBU_TE_ErrorCode.Code=0;
  801. TE_Online_DetectIniFlag = 0;
  802. }
  803. else //开始TE故障检测
  804. {
  805. if(PBU_TE_Status == UPDATE_ING)
  806. {
  807. PBU_TE_FaultDetectFlag= FALSE;
  808. TE_Online_DetectIniFlag = 0;
  809. }
  810. else
  811. {
  812. PBU_TE_FaultDetectFlag= TRUE;
  813. Scan_Key();
  814. if( TE_Online_DetectIniFlag == 0 )
  815. {
  816. TE_Online_DetectIniFlag = 1;
  817. TE_Online_TimeCnt = SysTime_5ms;
  818. }
  819. if(TimeCntDiff_5ms(TE_Online_TimeCnt) >=800)
  820. {
  821. TE_Online_Flag = 0;
  822. PBU_TE_ErrorCode.ERROR_Bit.Hardware_Fault =1;
  823. }
  824. }
  825. }
  826. Error_Key_Process(); //检测按键粘连10s
  827. }
  828. /**************************全局函数定义结束*****************/