main.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include <common.h>
  2. #include "drv_io.h"
  3. #include "drv_can.h"
  4. #include "drv_watch_dog.h"
  5. #include "app.h"
  6. #include "app_rs485_1.h"
  7. #include "app_rs485_2.h"
  8. #include "app_can.h"
  9. #include "measure_temprature.h"
  10. #include "measure_vol.h"
  11. #include "app_bms_1.h"
  12. #include "app_bms_2.h"
  13. #include "app_end_ctr.h"
  14. #include "app_adas.h"
  15. #include "hardware_test.h"
  16. #include "low_power.h"
  17. #include "sw_build_info.h"
  18. #ifdef CONFIG_CAN_IAP
  19. extern void qws_iap_write_magic(uint32_t magic);
  20. const uint8_t iap_board_name[] __attribute__((at(0x8002800))) = "PS100";
  21. const uint8_t soft_version[] __attribute__((at(0x8002A00))) = CONFIG_VERSION;
  22. const uint8_t iap_volume[] __attribute__((at(0x8002C00))) = "App";
  23. #else
  24. const uint8_t soft_version[] = CONFIG_VERSION;
  25. #endif
  26. uint8_t sn[PS100_SERIAL_NUM_SIZE];
  27. uint32_t g_event = NO_EVENT;
  28. void Flash_flag_clear(void)
  29. {
  30. fmc_flag_clear(FMC_FLAG_BANK0_PGERR | FMC_FLAG_BANK0_WPERR | FMC_FLAG_BANK0_END);
  31. }
  32. void Check_SN(void)
  33. {
  34. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  35. uint32_t address = 0x08000000 + (capacity - SN_FLASH_ADDRESS);
  36. uint8_t i = 0;
  37. uint16_t df_value = 0x3030;
  38. if (REG32(address) < 0xFFFFFFFF)
  39. {
  40. memcpy(sn,(uint8_t*)address,sizeof(sn));
  41. return;
  42. }
  43. fmc_unlock();
  44. Flash_flag_clear();
  45. fmc_page_erase(address);
  46. i = 0;
  47. while(i<PS100_SERIAL_NUM_SIZE)
  48. {
  49. Flash_flag_clear();
  50. fmc_halfword_program(address + i, df_value);
  51. i+= 2;
  52. }
  53. fmc_lock();
  54. address = 0x08000000 + (capacity - SN_FLASH_ADDRESS);
  55. memcpy(sn,(uint8_t*)address,sizeof(sn));
  56. }
  57. void Writer_SN(uint8_t *data)
  58. {
  59. uint32_t capacity = (REG32(0x1FFFF7E0) & 0xFFFF) << 10;
  60. uint32_t address = 0x08000000 + (capacity - SN_FLASH_ADDRESS);
  61. uint8_t i = 0;
  62. uint16_t df_value = 0xFFFF;
  63. fmc_unlock();
  64. Flash_flag_clear();
  65. fmc_page_erase(address);
  66. i = 0;
  67. while(i<PS100_SERIAL_NUM_SIZE)
  68. {
  69. Flash_flag_clear();
  70. df_value = data[i+1];
  71. df_value <<= 8;
  72. df_value |= data[i];
  73. fmc_halfword_program(address + i,df_value);
  74. i+= 2;
  75. }
  76. fmc_lock();
  77. address = 0x08000000 + (capacity - SN_FLASH_ADDRESS);
  78. memcpy(sn,(uint8_t*)address,sizeof(sn));
  79. }
  80. void init_NVIC(uint32_t NVoffset)
  81. {
  82. //ÉèÖÃÖжÏ
  83. nvic_vector_table_set(NVIC_VECTTAB_FLASH,NVoffset);
  84. //nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  85. nvic_priority_group_set(NVIC_PRIGROUP_PRE4_SUB0);
  86. }
  87. void test_Initial(void)
  88. {
  89. rcu_periph_clock_enable(RCU_GPIOB);
  90. rcu_periph_clock_enable(RCU_GPIOD);
  91. gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_14);
  92. gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_14);
  93. rcu_periph_clock_enable(RCU_AF);
  94. nvic_irq_enable(EXTI10_15_IRQn,1,0);
  95. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_14);
  96. exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  97. exti_interrupt_flag_clear(EXTI_14);
  98. #if 1
  99. gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOD, GPIO_PIN_SOURCE_14);
  100. exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  101. exti_interrupt_flag_clear(EXTI_14);
  102. #endif
  103. }
  104. int main(void)
  105. {
  106. #ifdef CONFIG_CAN_IAP
  107. #else
  108. init_NVIC(NVIC_OFFSET);
  109. #endif
  110. systick_config();
  111. Misc_Initial();
  112. Sub_BMS_1_Initial();
  113. Sub_BMS_2_Initial();
  114. Can_Com_Initial();
  115. Measure_Temprature_Initial();
  116. Measure_Vol_Initial();
  117. CB_Operate_Initial();
  118. End_Ctr_Initial();
  119. ADAS_Initial();
  120. HT_Main();
  121. App_Initial();
  122. //printf("PS100 Initial!\r\n");
  123. Check_SN();
  124. Low_Power_Initial();
  125. #if DEBUG_MODE == 0
  126. Watch_Dog_Initial();
  127. #endif
  128. #ifdef CONFIG_CAN_IAP
  129. qws_iap_write_magic(0x11223344);
  130. #endif
  131. /*extern void test_io(void);
  132. for(;;)
  133. {
  134. test_io();
  135. }*/
  136. for(;;)
  137. {
  138. #if DEBUG_MODE == 0
  139. Feed_Watch_Dog();
  140. #endif
  141. Check_Can_Poll();
  142. Check_CB_Operate_State();
  143. Intelligent_Management_Battery();
  144. //Check_Battery_Small_Current();
  145. Check_Charge_In();
  146. Sub_BMS_1_lt_State();
  147. Sub_BMS_2_lt_State();
  148. Check_Sub_BMS_1();
  149. Check_Sub_BMS_2();
  150. Check_End_Ctr_Status();
  151. Check_Can_Self_Send_Status();
  152. Cal_Sheng_Yu_Li_Cheng();
  153. Check_S11_May_Operate();
  154. if(g_event & SUB_BMS_1_SEND_CMD_EVENT)
  155. {
  156. if(update_bat.ub_bat != UPDATE_BAT_1)
  157. Send_Sub_BMS_1_CMD();
  158. g_event &= ~SUB_BMS_1_SEND_CMD_EVENT;
  159. }
  160. if(g_event & SUB_BMS_2_SEND_CMD_EVENT)
  161. {
  162. if(update_bat.ub_bat != UPDATE_BAT_2)
  163. Send_Sub_BMS_2_CMD();
  164. g_event &= ~SUB_BMS_2_SEND_CMD_EVENT;
  165. }
  166. if(g_event & BMS_1_RESEND_CMD_EVENT)
  167. {
  168. if(Resend_can_bms_1_frame())
  169. {
  170. g_event &= ~BMS_1_RESEND_CMD_EVENT;
  171. }
  172. }
  173. if(g_event & BMS_2_RESEND_CMD_EVENT)
  174. {
  175. if(Resend_can_bms_2_frame())
  176. {
  177. g_event &= ~BMS_2_RESEND_CMD_EVENT;
  178. }
  179. }
  180. if(g_event & END_CTR_RESEND_CMD_EVENT)
  181. {
  182. if(Resend_can_ctr_frame())
  183. {
  184. g_event &= ~END_CTR_RESEND_CMD_EVENT;
  185. }
  186. }
  187. if(g_event & ADAS_RESEND_CMD_EVENT)
  188. {
  189. if(Resend_can_adas_frame())
  190. {
  191. g_event &= ~ADAS_RESEND_CMD_EVENT;
  192. }
  193. }
  194. //if(g_event & EVENT_CAN_RECEIVE_FINISH)
  195. {
  196. if(Handle_Can_Data() == 1)
  197. {
  198. // output fail
  199. ;
  200. }
  201. //g_event &= ~EVENT_CAN_RECEIVE_FINISH;
  202. }
  203. if(g_event & MEASURE_TEMPERATURE_EVENT)
  204. {
  205. getTemperature();
  206. g_event &= ~MEASURE_TEMPERATURE_EVENT;
  207. }
  208. if(g_event & SUB_BMS_1_RS485_DISC_EVENT)
  209. {
  210. RS485_Communication_Time_Out_1();
  211. g_event &= ~SUB_BMS_1_RS485_DISC_EVENT;
  212. }
  213. if(g_event & SUB_BMS_2_RS485_DISC_EVENT)
  214. {
  215. RS485_Communication_Time_Out_2();
  216. g_event &= ~SUB_BMS_2_RS485_DISC_EVENT;
  217. }
  218. if(g_event & RS485_RECEIVE_END_EVENT)
  219. {
  220. if(Handle_RS485_1_Data() == 1)
  221. {
  222. // output fail
  223. ;
  224. }
  225. g_event &= ~RS485_RECEIVE_END_EVENT;
  226. }
  227. if(g_event & RS485_2_RECEIVE_END_EVENT)
  228. {
  229. if(Handle_RS485_2_Data() == 1)
  230. {
  231. // output fail
  232. ;
  233. }
  234. g_event &= ~RS485_2_RECEIVE_END_EVENT;
  235. }
  236. if(g_event & BMS_1_SELF_TIMEOUT_EVENT)
  237. {
  238. Timeout_Resend_can_bms_1_frame();
  239. g_event &= ~BMS_1_SELF_TIMEOUT_EVENT;
  240. }
  241. if(g_event & BMS_2_SELF_TIMEOUT_EVENT)
  242. {
  243. Timeout_Resend_can_bms_2_frame();
  244. g_event &= ~BMS_2_SELF_TIMEOUT_EVENT;
  245. }
  246. if(g_event & END_CTR_SELF_TIMEOUT_EVENT)
  247. {
  248. Timeout_Resend_can_ctr_frame();
  249. g_event &= ~END_CTR_SELF_TIMEOUT_EVENT;
  250. }
  251. if(g_event & ADAS_SELF_TIMEOUT_EVENT)
  252. {
  253. Timeout_Resend_can_adas_frame();
  254. g_event &= ~ADAS_SELF_TIMEOUT_EVENT;
  255. }
  256. if(g_event & ADAS_PWM_1_TIMEOUT_EVENT)
  257. {
  258. ADAS_PWM_1_Enable();
  259. g_event &= ~ADAS_PWM_1_TIMEOUT_EVENT;
  260. }
  261. if(g_event & ADAS_PWM_2_TIMEOUT_EVENT)
  262. {
  263. ADAS_PWM_2_Enable();
  264. g_event &= ~ADAS_PWM_2_TIMEOUT_EVENT;
  265. }
  266. if(g_event & ADAS_MEAS_1_FINISH_EVENT)
  267. {
  268. ADAS_Measure_Finish_Ju_Li_1();
  269. ADAS_Self_Send_Up();
  270. g_event &= ~ADAS_MEAS_1_FINISH_EVENT;
  271. }
  272. if(g_event & ADAS_MEAS_2_FINISH_EVENT)
  273. {
  274. ADAS_Measure_Finish_Ju_Li_2();
  275. g_event &= ~ADAS_MEAS_2_FINISH_EVENT;
  276. }
  277. if(g_event & ENTER_SLEEP_EVENT)
  278. {
  279. Enter_Sleep();
  280. g_event &= ~ENTER_SLEEP_EVENT;
  281. }
  282. if(g_event & RE_INITIAL_CAN_EVENT)
  283. {
  284. //Can_Com_Initial();
  285. g_event &= ~RE_INITIAL_CAN_EVENT;
  286. }
  287. if(g_event & DEVICE_REBOOT_EVENT)
  288. {
  289. g_event &= ~DEVICE_REBOOT_EVENT;
  290. __set_FAULTMASK(1);
  291. NVIC_SystemReset();
  292. }
  293. if(g_event & SAVE_PARAM_EVENT)
  294. {
  295. g_event &= ~SAVE_PARAM_EVENT;
  296. Save_Param();
  297. }
  298. }
  299. //return (1);
  300. }
  301. #ifdef USE_FULL_ASSERT
  302. /**
  303. * @brief Reports the name of the source file and the source line number
  304. * where the assert_param error has occurred.
  305. * @param file: pointer to the source file name
  306. * @param line: assert_param error line source number
  307. * @retval None
  308. */
  309. void assert_failed(u8_t* file, uint32_t line)
  310. {
  311. /* User can add his own implementation to report the file name and line number,
  312. ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  313. /* Infinite loop */
  314. while (1)
  315. {
  316. }
  317. }
  318. #endif
  319. /*********************************************************************************************************
  320. END FILE
  321. *********************************************************************************************************/