tasks.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932
  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 0 //长按进入SMART,短按退出
  243. if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
  244. {
  245. Key_Up.KeyStatus = Key_Status_NoPress;
  246. //按键测试模式,按键置位
  247. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  248. {
  249. PBU_Test_Process.KeyTest_Status.Status_Bit.Add = 1;
  250. }
  251. //助力控制模式,调节档位
  252. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  253. {
  254. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  255. {
  256. if(ControlCode.GearSt < PBU_ConfigParam.GearsNum)
  257. {
  258. ControlCode.GearSt++;
  259. PBU_AssitMode_Status.GearStBak_Smart++;
  260. PBU_AssitMode_Status.GearStBak_Walk++;
  261. }
  262. }
  263. else if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Smart)
  264. {
  265. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  266. }
  267. }
  268. }
  269. else if(Key_Up.KeyStatus == Key_Status_LongPress)//长按
  270. {
  271. Key_Up.KeyStatus = Key_Status_NoPress;
  272. //助力控制模式,进入i-Sport
  273. if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  274. {
  275. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  276. {
  277. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  278. PBU_AssitMode_Status.GearStBak_Smart = ControlCode.GearSt;
  279. }
  280. else if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Smart)
  281. {
  282. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  283. }
  284. }
  285. }
  286. #else //短按进入SMART
  287. if(Key_Up.KeyStatus == Key_Status_ShortPress)//短按
  288. {
  289. Key_Up.KeyStatus = Key_Status_NoPress;
  290. //按键测试模式,按键置位
  291. if(PBU_RunMode == PBU_RunMode_CDL_KeyTest)
  292. {
  293. PBU_Test_Process.KeyTest_Status.Status_Bit.Add = 1;
  294. }
  295. //助力控制模式,调节档位
  296. else if(PBU_RunMode == PBU_RunMode_MC_AssisitCtrl)
  297. {
  298. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_Gear)
  299. {
  300. if(ControlCode.GearSt < PBU_ConfigParam.GearsNum) //0~4档
  301. {
  302. ControlCode.GearSt++;
  303. PBU_AssitMode_Status.GearStBak_Smart++;
  304. PBU_AssitMode_Status.GearStBak_Walk++;
  305. }
  306. else //到达4档后再次按下,会一直停留在SMART
  307. {
  308. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  309. PBU_AssitMode_Status.GearStBak_Smart = ControlCode.GearSt;
  310. }
  311. }
  312. }
  313. }
  314. else if(Key_Up.KeyStatus == Key_Status_LongPress)//长按
  315. {
  316. Key_Up.KeyStatus = Key_Status_NoPress;
  317. //...
  318. }
  319. #endif
  320. }
  321. }
  322. }
  323. //计算MCU同步时钟频率
  324. void Cal_SyncClockFreq(uint16_t* Result)
  325. {
  326. uint16_t Count = 0;
  327. Count = __HAL_TIM_GET_COUNTER(&htim2);
  328. *Result = Count * 20 / 1000;//50ms内计数值,单位转换为KHz
  329. __HAL_TIM_SET_COUNTER(&htim2, 0);
  330. }
  331. //比较MCU和TE采集的时钟频率
  332. void SyncClockFreq_Judge(uint16_t FreqResult, uint16_t Sync_Clock_Freq)
  333. {
  334. static uint32_t SyncClockErrorCnt = 0;
  335. if( ( FreqResult < (Sync_Clock_Freq - 200) ) || ( FreqResult > (Sync_Clock_Freq + 200) ) )
  336. {
  337. SyncClockErrorCnt++;
  338. if( SyncClockErrorCnt > 100 )
  339. {
  340. SyncClockErrorCnt = 0;
  341. PBU_TE_ErrorCode.ERROR_Bit.MCU_Fault = 1;
  342. }
  343. }
  344. else
  345. {
  346. SyncClockErrorCnt = 0;
  347. }
  348. }
  349. //static void _Task_ADC_Update(void)
  350. //{
  351. // int32_t Temp_int32 = 0;
  352. //更新Vref电压
  353. // MCU_VDDA = 3300 * (*VREFINT_CAL) / ADC_Value_Vin.ADC_Result[ADC_RANK_VREF];
  354. // ADC_Value_Vin.Voltage[ADC_RANK_VREF] = ADC_Value_Vin.ADC_Result[ADC_RANK_VREF] * MCU_VDDA / 4095;
  355. //
  356. // //更新母线电压值结果
  357. // ADC_Value_Vin.Voltage[ADC_RANK_VIN] = ADC_Value_Vin.ADC_Result[ADC_RANK_VIN] * MCU_VDDA / 4095;
  358. // Voltage_Vin = ADC_Value_Vin.Voltage[ADC_RANK_VIN] * 16;//300K 20K
  359. //
  360. // //更新MCU内部温度
  361. // #if 1
  362. // ADC_Value_Vin.Voltage[ADC_RANK_TEMP] = ADC_Value_Vin.ADC_Result[ADC_RANK_TEMP] * MCU_VDDA / 4095;
  363. // Temp_int32 = (int16_t)(1430 - ADC_Value_Vin.Voltage[ADC_RANK_TEMP]);
  364. // MCU_Temperature = Temp_int32 * 100 / 430 + 25;
  365. // #elif 1
  366. // Temp_int32 = (int32_t)ADC_Value_Vin.ADC_Result[ADC_RANK_TEMP];
  367. // Temp_int32 = (int32_t)(Temp_int32 * MCU_VDDA * 10 / 33) / 1000;
  368. // Temp_int32 = Temp_int32 - (int32_t)(*TEMP30_CAL_ADDR);
  369. // Temp_int32 = Temp_int32 * (int32_t)(110 - 30);
  370. // Temp_int32 = Temp_int32 / ((int32_t)(*TEMP110_CAL_ADDR) - (int32_t)(*TEMP30_CAL_ADDR));
  371. // MCU_Temperature = Temp_int32 + 30;
  372. // #endif
  373. //}
  374. /**************************局部函数定义结束*****************/
  375. /**************************全局函数定义*********************/
  376. //超时计数
  377. uint32_t TimeCntDiff_5ms(uint32_t v)
  378. {
  379. int32_t lDiff;
  380. lDiff = (int32_t)(SysTime_5ms - v);
  381. if(lDiff < 0)
  382. {
  383. lDiff += ((int32_t)TCNT_1HOUR);
  384. }
  385. return (uint32_t)lDiff;
  386. }
  387. //1ms任务处理函数
  388. void HAL_SYSTICK_Callback(void)
  389. {
  390. static uint16_t TimeCnt_5ms = 0;
  391. static uint16_t TimeCnt_10ms = 0;
  392. static uint16_t TimeCnt_50ms = 0;
  393. // static uint16_t TimeCnt_100ms = 0;
  394. static uint16_t TimeCnt_1000ms = 0;
  395. static uint16_t TimeCnt_60000ms = 0;
  396. Scan_Key_ADC_Error();
  397. // Vin_test_Check();
  398. //5ms任务
  399. TimeCnt_5ms++;
  400. if(TimeCnt_5ms >= 5)
  401. {
  402. TimeCnt_5ms = 0;
  403. SysTime_5ms++;
  404. }
  405. if(SysTime_5ms > TCNT_1HOUR)
  406. {
  407. SysTime_5ms = 0;
  408. }
  409. //10ms任务
  410. TimeCnt_10ms++;
  411. if(TimeCnt_10ms >= 10)
  412. {
  413. TimeCnt_10ms = 0;
  414. //按键扫描
  415. PowerKey_Process();
  416. if(PBU_ErrorCode.ERROR_Bit.Key_Light == 0) LightKey_Process();
  417. if(PowerOn_flag==1)
  418. _Task_KeyScan();
  419. }
  420. //50ms任务
  421. if(PBU_TE_FaultDetectFlag == TRUE)
  422. {
  423. TimeCnt_50ms++;
  424. if(TimeCnt_50ms >= 50)
  425. {
  426. TimeCnt_50ms = 0;
  427. HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_4);
  428. Scan_Key_Start=0x01;
  429. Cal_SyncClockFreq(&MCU_FreqResult);
  430. SyncClockFreq_Judge(MCU_FreqResult, TE_Sync_Clock_Freq);
  431. }
  432. }
  433. //1000ms任务
  434. if(LED_Blink_Enable == 0x01)
  435. {
  436. TimeCnt_1000ms++;
  437. if(TimeCnt_1000ms >= 1000)
  438. {
  439. TimeCnt_1000ms = 0;
  440. //更新ADC转换结果
  441. // _Task_ADC_Update();
  442. HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);
  443. }
  444. }
  445. else
  446. {
  447. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9,GPIO_PIN_SET);
  448. }
  449. //60s任务
  450. TimeCnt_60000ms++;
  451. if(TimeCnt_60000ms >= 60000)
  452. {
  453. TimeCnt_60000ms = 0;
  454. //运行时间记录
  455. PBU_RunLog.RunTime++;
  456. }
  457. MC_error_cnt++;
  458. if(MC_error_cnt >= 3000)
  459. {
  460. MC_error_cnt=0;
  461. MC_ErrorCode.Code = 0;
  462. }
  463. }
  464. //PBU运行模式处理函数
  465. void PBU_RunMode_Process(PBU_RunMode_t RunMode)
  466. {
  467. switch(RunMode)
  468. {
  469. case PBU_RunMode_MC_AssisitCtrl:
  470. {
  471. //助力模式控制
  472. switch(PBU_AssitMode_Status.PBU_AssistMode_Flag)
  473. {
  474. case PBU_AssistMode_Flag_WalkSby://预推行模式
  475. {
  476. if((*(Key_Up.ADC_result)<1000)&&(*(Key_Walk.ADC_result)>3000)&&(*(Key_Down.ADC_result)>3000))
  477. {
  478. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Walk;
  479. ControlCode.GearSt = 0x22;
  480. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = TRUE;
  481. }
  482. else
  483. {
  484. // ControlCode.GearSt = 0x00;
  485. if(TimeCntDiff_5ms(PBU_AssitMode_Status.WalkDelayTimeCnt) > 2000) //超时2000 * 500 = 10s自动退出Walk等待
  486. {
  487. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Walk;
  488. if(PBU_AssitMode_Status.IsSmartEtrWalk_Flag == TRUE)
  489. {
  490. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Smart;
  491. PBU_AssitMode_Status.IsSmartEtrWalk_Flag = FALSE;
  492. }
  493. else
  494. {
  495. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_Gear;
  496. }
  497. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  498. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  499. }
  500. }
  501. break;
  502. }
  503. case PBU_AssistMode_Flag_Gear://助力模式
  504. {
  505. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Smart;
  506. break;
  507. }
  508. case PBU_AssistMode_Flag_Walk://推行模式
  509. {
  510. if((*(Key_Up.ADC_result)>3000)||((ADC_Result[4]+ADC_Result[2]+ADC_Result[5])<5000))//zsm 防止推行过程中,有两个键同时按下,还继续推行
  511. {
  512. ControlCode.GearSt = PBU_AssitMode_Status.GearStBak_Walk;
  513. PBU_AssitMode_Status.PBU_AssistMode_Flag = PBU_AssistMode_Flag_WalkSby;
  514. PBU_AssitMode_Status.WalkDelayTimeCnt = SysTime_5ms;
  515. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = FALSE;
  516. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = 0;
  517. }
  518. break;
  519. }
  520. case PBU_AssistMode_Flag_Smart://智能模式
  521. {
  522. ControlCode.GearSt = 0x33;
  523. break;
  524. }
  525. default:break;
  526. }
  527. //发送预推行模式指令
  528. if(PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag == FALSE)
  529. {
  530. if(TimeCntDiff_5ms(PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby) > 40) // 超时40 * 5 = 200ms
  531. {
  532. if(PBU_AssitMode_Status.PBU_AssistMode_Flag == PBU_AssistMode_Flag_WalkSby)
  533. {
  534. SendData(ID_PBU_TO_HMI, MODE_WRITE, 0x7304, (uint8_t*)"STAR");
  535. }
  536. else
  537. {
  538. SendData(ID_PBU_TO_HMI, MODE_WRITE, 0x7304, (uint8_t*)"STOP");
  539. }
  540. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = SysTime_5ms;
  541. }
  542. if(TimeCntDiff_5ms(PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt) > 400)//超时400 * 5 = 2s
  543. {
  544. PBU_AssitMode_Status.PBU_WalkSbyProcess.DelayTimeCnt = SysTime_5ms;
  545. PBU_AssitMode_Status.PBU_WalkSbyProcess.HMI_ACK_Flag = TRUE;
  546. }
  547. }
  548. else
  549. {
  550. PBU_AssitMode_Status.PBU_WalkSbyProcess.SendCodeTimeCnt_WalkSby = SysTime_5ms;
  551. }
  552. //发送控制指令
  553. if(MC_ErrorCode.Code != (uint32_t)0)//存在故障码时,关闭助力
  554. {
  555. ControlCode.GearSt = 0;
  556. PBU_AssitMode_Status.GearStBak_Smart = 0;
  557. }
  558. if(TimeCntDiff_5ms(PBU_AssitMode_Status.SendCodeTimeCnt_Ctl) >= 10)//超时10 * 5 = 50ms
  559. {
  560. static uint8_t i = 0;
  561. if(i == 0)
  562. {
  563. i = 1;
  564. if(PBU_AssitMode_Status.PBU_AssistMode_Flag==PBU_AssistMode_Flag_WalkSby)
  565. {
  566. ControlCode_MC_WalkSby.GearSt=0;
  567. ControlCode_MC_WalkSby.LightSwitch=ControlCode.LightSwitch;
  568. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  569. }
  570. else
  571. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode.GearSt)));
  572. }
  573. else if(i == 1)
  574. {
  575. i = 2;
  576. SendData(ID_PBU_TO_BMS, 0x11, 0x5000,(uint8_t*)NULL);
  577. }
  578. else if(i == 2)
  579. {
  580. i = 0;
  581. SendData(ID_PBU_TO_HMI, 0x0C, 0x7402,(uint8_t*)(&(ControlCode.GearSt)));
  582. }
  583. PBU_AssitMode_Status.SendCodeTimeCnt_Ctl = SysTime_5ms;
  584. }
  585. if((PowerOn_flag==1)&&(PBU_AssitMode_Status.PBU_AssistMode_Flag!=PBU_AssistMode_Flag_WalkSby))
  586. {
  587. if(TimeCntDiff_5ms(MC_Online_TimeCnt) >=1000)
  588. {
  589. MC_Online_Flag = 0;
  590. PBU_commErrorCode.ERROR_Bit.Communication_MC_Fault =1;
  591. }
  592. if(MC_Online_Flag == 1)
  593. {
  594. PBU_commErrorCode.ERROR_Bit.Communication_MC_Fault = 0;
  595. PBU_ErrorCode.ERROR_Bit.Communication_MC_Fault = 0;
  596. }
  597. }
  598. if(PowerOn_flag==1)
  599. {
  600. if(TimeCntDiff_5ms(BMS_Online_TimeCnt) >=1000)
  601. {
  602. BMS_Online_Flag = 0;
  603. // PBU_commErrorCode.ERROR_Bit.Communication_Fault =1;
  604. }
  605. }
  606. break;
  607. }
  608. case PBU_RunMode_CDL_KeyTest:
  609. {
  610. static uint8_t SendCnt = 0;
  611. //退出按键测试模式前,100ms发送一次按键状态
  612. if( (PBU_Test_Process.KeyTest_Status.Status&0x3F) != 0x00)
  613. {
  614. if(TimeCntDiff_5ms(PBU_Test_Process.SendCodeTimeCnt) >= 40)//超时40 * 5 = 200ms
  615. {
  616. SendData(ID_PBU_TO_CDL, MODE_REPORT, 0x9101, &(PBU_Test_Process.KeyTest_Status.Status));
  617. SendCnt++;
  618. if(SendCnt >= 5)
  619. {
  620. SendCnt = 0;
  621. PBU_Test_Process.KeyTest_Status.Status = 0x00;
  622. }
  623. PBU_Test_Process.SendCodeTimeCnt = SysTime_5ms;
  624. }
  625. }
  626. else
  627. {
  628. PBU_Test_Process.SendCodeTimeCnt = SysTime_5ms;
  629. }
  630. MC_Online_TimeCnt=SysTime_5ms;
  631. BMS_Online_TimeCnt=SysTime_5ms;
  632. break;
  633. }
  634. case PBU_RunMode_PowerOff:
  635. {
  636. /* Send shutdown command to AUX_MCU */
  637. // Shutdown_AUX();
  638. LED_INIT();
  639. //关机前,发送指令关灯,避免下次开机时灯会闪亮一下
  640. static uint8_t LightOffCommandCount=0;
  641. if(LightOffCommandCount==0)
  642. {
  643. LightOffCommandCount=1;
  644. ControlCode_MC_WalkSby.GearSt = 0;
  645. ControlCode_MC_WalkSby.LightSwitch = 0xF0;
  646. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  647. HAL_Delay(20);
  648. SendData(ID_PBU_TO_MC, 0x0C, 0x3002, (uint8_t*)(&(ControlCode_MC_WalkSby.GearSt)));
  649. HAL_Delay(20);
  650. }
  651. PowerOn_flag=0;
  652. //关机前发送SHUTDOWN指令,收到所有设备关机就绪信号,或超时2s关机
  653. if((PBU_PowerOff_Process.Ready_Status.Status & 0x01) != 0x01)//未收到所有设备的关机就绪信号
  654. {
  655. if(TimeCntDiff_5ms(PBU_PowerOff_Process.SendCodeTimeCnt) >= 20)//超时20 * 5ms = 100ms
  656. {
  657. SendData(ID_PBU_BC, MODE_REPORT, 0x1008, (uint8_t*)"SHUTDOWN");
  658. PBU_PowerOff_Process.SendCodeTimeCnt = SysTime_5ms;
  659. }
  660. }
  661. else
  662. {
  663. //关机前处理
  664. //...
  665. SYS_POWER_OFF();
  666. SendMotorDisableToTE();
  667. LED_INIT_ALL();
  668. do
  669. {
  670. HAL_IWDG_Refresh(&hiwdg1);
  671. }while(*(Key_On_Off.ADC_result)<3000);
  672. __set_FAULTMASK(1);//关闭所有中断
  673. HAL_Delay(200);
  674. HAL_NVIC_SystemReset();
  675. }
  676. //超时判断
  677. if(TimeCntDiff_5ms(PBU_PowerOff_Process.DelayTimeCnt) >= 200)//超200 * 5ms = 1s
  678. {
  679. //关机前处理
  680. //...
  681. SYS_POWER_OFF();
  682. SendMotorDisableToTE();
  683. LED_INIT_ALL();
  684. do
  685. {
  686. HAL_IWDG_Refresh(&hiwdg1);
  687. }while(*(Key_On_Off.ADC_result)<3000);
  688. __set_FAULTMASK(1);//关闭所有中断
  689. HAL_Delay(200);
  690. HAL_NVIC_SystemReset();
  691. }
  692. MC_Online_TimeCnt=SysTime_5ms;
  693. BMS_Online_TimeCnt=SysTime_5ms;
  694. break;
  695. }
  696. case PBU_RunMode_Updating:
  697. {
  698. MC_Online_TimeCnt=SysTime_5ms;
  699. BMS_Online_TimeCnt=SysTime_5ms;
  700. ControlCode.GearSt = 0;
  701. PBU_AssitMode_Status.GearStBak_Smart = 0;
  702. PBU_AssitMode_Status.GearStBak_Walk = 0;
  703. break;
  704. }
  705. default:break;
  706. }
  707. }
  708. //CAN数据解析函数
  709. void CanRx_Process(void)
  710. {
  711. CAN_RxData_Process(&CAN_RxBuf_Struct_MC, 500);
  712. CAN_RxData_Process_Temp(&CAN_RxBuf_Struct_BMS, 500);
  713. CAN_RxData_Process(&CAN_RxBuf_Struct_HMI, 500);
  714. CAN_RxData_Process(&CAN_RxBuf_Struct_CDL, 500);
  715. }
  716. //PBU开机判断,开关机按键弹起或超时5s后,再次检测开关机按键状态
  717. void PBU_PowerOn_Judge(void)
  718. {
  719. KeyScanCode_Struct_t KeyState;
  720. switch(PBU_PowerOn_Process.PowerKeyStatus)
  721. {
  722. //初始状态
  723. case 0:
  724. {
  725. KeyState = KeyScan();
  726. if((KeyState.Code & 0x3F) == 0x01)
  727. {
  728. PBU_PowerOn_Process.PowerOnOKCnt++;
  729. if( PBU_PowerOn_Process.PowerOnOKCnt >= 10 )
  730. {
  731. LED_Blink_Enable = 0x01;
  732. SYS_POWER_ON();
  733. SendMotorEnableToTE();
  734. HAL_Delay(50);
  735. SendMotorEnableToTE();
  736. HAL_Delay(50);
  737. SendMotorEnableToTE();
  738. HAL_Delay(50);
  739. SendMotorEnableToTE();
  740. PBU_PowerOn_Process.PowerKeyStatus = 1;
  741. }
  742. }
  743. else
  744. {
  745. PBU_PowerOn_Process.PowerOnOKCnt=0;
  746. }
  747. break;
  748. }
  749. //按下中
  750. case 1:
  751. {
  752. if(*(Key_On_Off.ADC_result)>3000)
  753. {
  754. PBU_PowerOn_Process.PowerKeyStatus = 2;
  755. }
  756. break;
  757. }
  758. //弹起
  759. case 2:
  760. {
  761. break;
  762. }
  763. default:break;
  764. }
  765. }
  766. //发送配置参数给到MC
  767. void SendCfgToMC(void)
  768. {
  769. uint8_t SendBuf[8] = {0};
  770. //复制参数
  771. SendBuf[0] = PBU_ConfigParam.GearsNum;
  772. SendBuf[1] = PBU_ConfigParam.NoHMI_Flag;
  773. //开始发送数据,收到ACK前,100ms发送一次,超时2s
  774. PBU_MC_Cfg.DelayTimeCnt = SysTime_5ms;
  775. PBU_MC_Cfg.SendCodeTimeCnt = SysTime_5ms;
  776. do
  777. {
  778. if(TimeCntDiff_5ms(PBU_MC_Cfg.SendCodeTimeCnt) > 20) // 超时20 * 5 = 100ms
  779. {
  780. SendData(ID_PBU_TO_MC, MODE_WRITE, 0x3208, SendBuf);
  781. PBU_MC_Cfg.SendCodeTimeCnt = SysTime_5ms;
  782. }
  783. CAN_RxData_Process(&CAN_RxBuf_Struct_MC, 500);
  784. }while((PBU_MC_Cfg.MC_ACK_Flag == FALSE) && (TimeCntDiff_5ms(PBU_MC_Cfg.DelayTimeCnt) <= 400));//超时2s
  785. PBU_MC_Cfg.MC_ACK_Flag = TRUE;
  786. }
  787. //发送故障码
  788. void PBU_Error_Process(void)
  789. {
  790. static uint32_t SendCodeTimeCnt = 0;
  791. if(PBU_RunMode != PBU_RunMode_Updating)
  792. {
  793. PBU_ErrorCode.Code = PBU_hardwareErrorCode.Code | PBU_commErrorCode.Code;
  794. PBU_Error_senddata=PBU_ErrorCode.Code;
  795. if(PBU_Error_senddata != 0)
  796. {
  797. if(PBU_ErrorFlag == FALSE)
  798. {
  799. SendCodeTimeCnt = SysTime_5ms;
  800. PBU_ErrorFlag = TRUE;
  801. }
  802. if(TimeCntDiff_5ms(SendCodeTimeCnt) > 100) // 超时100 * 5 = 500ms
  803. {
  804. SendData(ID_PBU_BC, MODE_REPORT, 0x1504, (uint8_t*)&PBU_Error_senddata);
  805. SendCodeTimeCnt = SysTime_5ms;
  806. PBU_Error_senddata = 0;
  807. }
  808. }
  809. else
  810. {
  811. PBU_ErrorFlag = FALSE;
  812. }
  813. }
  814. }
  815. //自动关机处理
  816. void AutoPowerOff_Process(void)
  817. {
  818. static uint32_t DelayTimeCnt = 0;
  819. static TrueOrFalse_Flag_Struct_t IsFirstEnterFlag = TRUE;
  820. static KeyScanCode_Struct_t KeySate;
  821. KeyScanCode_Struct_t KeySate_Temp;
  822. if(IsFirstEnterFlag == TRUE)
  823. {
  824. DelayTimeCnt = SysTime_5ms;
  825. KeySate = KeyScan();
  826. IsFirstEnterFlag = FALSE;
  827. }
  828. KeySate_Temp = KeyScan();
  829. if((MC_RunInfo.BikeSpeed != 0) || //无车速
  830. (MC_RunInfo.Cadence != 0) || //无踏频
  831. (MC_RunInfo.MotorSpeed != 0)|| //电机无转速
  832. (MC_RunInfo.Torque > 5) || //无力矩
  833. (KeySate.Code != KeySate_Temp.Code) ||
  834. (PBU_RunMode == PBU_RunMode_CDL_KeyTest) ) //无按键触发
  835. {
  836. DelayTimeCnt = SysTime_5ms;
  837. }
  838. else
  839. {
  840. if((TimeCntDiff_5ms(DelayTimeCnt) > 60000)) // 超时60000 * 5ms = 300s
  841. {
  842. DelayTimeCnt = SysTime_5ms;
  843. PBU_RunMode = PBU_RunMode_PowerOff;
  844. PBU_PowerOff_Process.DelayTimeCnt = SysTime_5ms;
  845. PBU_PowerOff_Process.SendCodeTimeCnt = 0;
  846. }
  847. }
  848. KeySate = KeySate_Temp;
  849. }
  850. /* Functional safety key processing */
  851. void FSK_Process(void)
  852. {
  853. static uint8_t TE_Online_DetectIniFlag=0;
  854. if(HAL_GetTick() < 5000) //前5s屏蔽与TE检测有关的错误,5s后TE稳定后开始检测故障
  855. {
  856. PBU_TE_ErrorCode.Code=0;
  857. TE_Online_DetectIniFlag = 0;
  858. }
  859. else //开始TE故障检测
  860. {
  861. if(PBU_TE_Status == UPDATE_ING)
  862. {
  863. PBU_TE_FaultDetectFlag= FALSE;
  864. TE_Online_DetectIniFlag = 0;
  865. }
  866. else
  867. {
  868. PBU_TE_FaultDetectFlag= TRUE;
  869. Scan_Key();
  870. if( TE_Online_DetectIniFlag == 0 )
  871. {
  872. TE_Online_DetectIniFlag = 1;
  873. TE_Online_TimeCnt = SysTime_5ms;
  874. }
  875. if(TimeCntDiff_5ms(TE_Online_TimeCnt) >=800)
  876. {
  877. TE_Online_Flag = 0;
  878. PBU_TE_ErrorCode.ERROR_Bit.Hardware_Fault =1;
  879. }
  880. }
  881. }
  882. Error_Key_Process(); //检测按键粘连10s
  883. }
  884. /**************************全局函数定义结束*****************/