gd32f30x_it.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  1. /*!
  2. \file gd32f3x0_it.c
  3. \brief interrupt service routines
  4. */
  5. /*
  6. Copyright (C) 2022 GigaDevice
  7. 2022-12-01, V1.0.0, firmware for GD32F3x0
  8. */
  9. /******************************
  10. * Include File
  11. ******************************/
  12. #include "gd32f30x_it.h"
  13. #include "user.h"
  14. #include "TimeTask_Event.h"
  15. #include "can.h"
  16. #include "FSM_1st.h"
  17. /******************************
  18. * Parameter
  19. ******************************/
  20. extern uint8_t data;
  21. /******************************
  22. * Function
  23. ******************************/
  24. /*!
  25. \brief this function handles NMI exception
  26. \param[in] none
  27. \param[out] none
  28. \retval none
  29. */
  30. void NMI_Handler(void)
  31. {
  32. }
  33. /*!
  34. \brief this function handles HardFault exception
  35. \param[in] none
  36. \param[out] none
  37. \retval none
  38. */
  39. void HardFault_Handler(void)
  40. {
  41. hw_blPWMOnFlg = TRUE;/* HardFault_Handler无法被屏蔽,hw_blPWMOnFlg可能被RAMtest修改 */
  42. hw_voPWMOff();
  43. /* if Hard Fault exception occurs, go to infinite loop */
  44. while (1)
  45. {
  46. //do nothing
  47. }
  48. }
  49. /*!
  50. \brief this function handles MemManage exception
  51. \param[in] none
  52. \param[out] none
  53. \retval none
  54. */
  55. void MemManage_Handler(void)
  56. {
  57. /* if Memory Manage exception occurs, go to infinite loop */
  58. while (1)
  59. {
  60. //do nothing
  61. }
  62. }
  63. /*!
  64. \brief this function handles BusFault exception
  65. \param[in] none
  66. \param[out] none
  67. \retval none
  68. */
  69. void BusFault_Handler(void)
  70. {
  71. /* if Bus Fault exception occurs, go to infinite loop */
  72. while (1)
  73. {
  74. //do nothing
  75. }
  76. }
  77. /*!
  78. \brief this function handles UsageFault exception
  79. \param[in] none
  80. \param[out] none
  81. \retval none
  82. */
  83. void UsageFault_Handler(void)
  84. {
  85. /* if Usage Fault exception occurs, go to infinite loop */
  86. while (1)
  87. {
  88. //do nothing
  89. }
  90. }
  91. /*!
  92. \brief this function handles SVC exception
  93. \param[in] none
  94. \param[out] none
  95. \retval none
  96. */
  97. void SVC_Handler(void)
  98. {
  99. }
  100. /*!
  101. \brief this function handles DebugMon exception
  102. \param[in] none
  103. \param[out] none
  104. \retval none
  105. */
  106. void DebugMon_Handler(void)
  107. {
  108. }
  109. /*!
  110. \brief this function handles PendSV exception
  111. \param[in] none
  112. \param[out] none
  113. \retval none
  114. */
  115. void PendSV_Handler(void)
  116. {
  117. }
  118. /*!
  119. \brief this function handles SysTick exception
  120. \param[in] none
  121. \param[out] none
  122. \retval none
  123. */
  124. void SysTick_Handler(void)
  125. {
  126. cp_ulSystickCnt ++;
  127. /* MCU Self Check*/
  128. clas_ubSystickFlg = 1;
  129. stl_voSystickProc();
  130. /* UART Timeout */
  131. UART_voApplTimer();
  132. /* TBT interrupt */
  133. //tbt_voIsr();
  134. }
  135. /*!
  136. \brief
  137. \param[in] none
  138. \param[out] none
  139. \retval none
  140. */
  141. void ADC0_1_IRQHandler(void)
  142. {
  143. /* MCU self check count */
  144. clasB_uwADCCnt++;
  145. if (cp_stFlg.CurrentSampleModelSelect == COMBINATION)
  146. {
  147. if (ADC_STAT(ADC0) & ADC_INT_FLAG_EOIC)
  148. {
  149. adc_uwRdsonUReg = ADC_IDATA0(ADC0);
  150. adc_uwRdsonVReg = ADC_IDATA1(ADC0);
  151. adc_uwRdsonWReg = ADC_IDATA2(ADC0);
  152. /* ADC0 disable */
  153. ADC_CTL1(ADC0) &= ~((uint32_t)ADC_CTL1_ADCON);
  154. /* ADC1 trigger set */
  155. TIMER_CH3CV(TIMER0) = (uint32_t) pwm_stGenOut.uwSigRTrig;
  156. /* ADC1 enable */
  157. ADC_CTL1(ADC1) |= (uint32_t)ADC_CTL1_ADCON;
  158. /* ADC0 interrupt flag clear */
  159. ADC_STAT(ADC0) &= ~((uint32_t)ADC_INT_FLAG_EOIC);
  160. }
  161. else if (ADC_STAT(ADC1) & ADC_INT_FLAG_EOIC)
  162. {
  163. if (pwm_stGenOut.blSampleCalibFlag == TRUE)
  164. {
  165. adc_uwADDMAPhase1 = ADC_IDATA0(ADC1);
  166. }
  167. /* ADC1 disable */
  168. ADC_CTL1(ADC1) &= ~((uint32_t)ADC_CTL1_ADCON);
  169. /* ADC1 interrupt flag clear */
  170. ADC_STAT(ADC1) &= ~((uint32_t)ADC_INT_FLAG_EOIC);
  171. }
  172. else
  173. {
  174. //do noting
  175. }
  176. }
  177. else
  178. {
  179. //do noting
  180. }
  181. }
  182. /*!
  183. \brief
  184. \param[in] none
  185. \param[out] none
  186. \retval none
  187. */
  188. void TIMER0_UP_TIMER9_IRQHandler(void)
  189. {
  190. ULONG ulOvTimeCnt = 0;
  191. /* MCU self check count */
  192. clasB_uwTIM0Cnt ++;
  193. if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
  194. {
  195. if(TIMER_INTF(TIMER0) & TIMER_INT_FLAG_UP)
  196. {
  197. if((TIMER_CTL0(TIMER0) & TIMER_CTL0_DIR) == 0) // When Counting Up
  198. {
  199. /* TBC Up interrupt */
  200. tbc_voUpIsr();
  201. }
  202. else
  203. {
  204. TIMER_CNT(TIMER6) = 0;
  205. /* TBC Down interrupt */
  206. tbc_voDownIsr();
  207. /* Timing management, refer to the Software design description for details */
  208. while ((TIMER_CNT(TIMER6) < HW_PWM_PERIOD) && (ulOvTimeCnt < 10000))
  209. {
  210. ulOvTimeCnt++;
  211. };
  212. /* ADC0 trigger set */
  213. TIMER_CH3CV(TIMER0) = (uint32_t) pwm_stGenOut.uwRdsonTrig;
  214. adc_enable(ADC0);
  215. /* Software trigger for regular sampling*/
  216. adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  217. /* Compara value load */
  218. hw_uwPWMCmpr[0] = pwm_stGenOut.uwNewTIM1COMPR[0];
  219. hw_uwPWMCmpr[1] = pwm_stGenOut.uwNewTIM1COMPR[1];
  220. hw_uwPWMCmpr[2] = pwm_stGenOut.uwNewTIM1COMPR[2];
  221. hw_uwPWMCmpr[3] = pwm_stGenOut.uwNewTIM1COMPR[3];
  222. hw_uwPWMCmpr[4] = pwm_stGenOut.uwNewTIM1COMPR[4];
  223. hw_uwPWMCmpr[5] = pwm_stGenOut.uwNewTIM1COMPR[5];
  224. timer_dma_enable(TIMER0,TIMER_DMA_UPD);
  225. dma_channel_enable(DMA0,DMA_CH4);
  226. }
  227. }
  228. /* Timer0 update interrupt flag clear */
  229. TIMER_INTF(TIMER0) = ~(uint32_t)TIMER_INT_FLAG_UP;
  230. }
  231. else
  232. {
  233. //do noting
  234. }
  235. }
  236. /*!
  237. \brief
  238. \param[in] none
  239. \param[out] none
  240. \retval none
  241. */
  242. UWORD tim1cnt;
  243. void TIMER1_IRQHandler(void)
  244. {
  245. UWORD uwIntSource = 0;
  246. /* MCU self check count */
  247. clasB_uwTIM1Cnt++;
  248. if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_UP) != 0)
  249. {
  250. tim1cnt++;
  251. if(switch_flg.SysCoef_Flag == TRUE)
  252. {
  253. uwIntSource = 1;
  254. cadence_voCadenceCal(uwIntSource);
  255. bikespeed_voBikeSpeedCal(uwIntSource);
  256. }
  257. timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_UP);
  258. }
  259. else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH2) != 0)
  260. {
  261. if(switch_flg.SysCoef_Flag == TRUE)
  262. {
  263. uwIntSource = 2;
  264. cadence_voCadenceCal(uwIntSource);
  265. /* Select rising or falling edge trigger */
  266. if(gpio_input_bit_get(GPIOB, GPIO_PIN_10) != 0)
  267. {
  268. /* reset the CH2P and CH2NP bits */
  269. TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
  270. TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_FALLING) << 8U);
  271. }
  272. else
  273. {
  274. /* reset the CH2P and CH2NP bits */
  275. TIMER_CHCTL2(TIMER1) &= ~(uint32_t)(TIMER_CHCTL2_CH2P|TIMER_CHCTL2_CH2NP);
  276. TIMER_CHCTL2(TIMER1) |= (uint32_t)((uint32_t)(TIMER_IC_POLARITY_RISING) << 8U);
  277. }
  278. }
  279. timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH2);
  280. }
  281. else if (timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH3) != 0)
  282. {
  283. if(switch_flg.SysCoef_Flag == TRUE)
  284. {
  285. uwIntSource = 3;
  286. bikespeed_voBikeSpeedCal(uwIntSource);
  287. }
  288. timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH3);
  289. }
  290. else
  291. {
  292. //do noting
  293. }
  294. }
  295. /*!
  296. \brief
  297. \param[in] none
  298. \param[out] none
  299. \retval none
  300. */
  301. void TIMER3_IRQHandler(void)
  302. {
  303. if(timer_interrupt_flag_get(TIMER3, TIMER_INT_FLAG_UP) != 0)
  304. {
  305. /* MCU self check count */
  306. clasB_uwTIM3Cnt++;
  307. /* TBS interrupt */
  308. tbs_voIsr();
  309. timer_interrupt_flag_clear(TIMER3, TIMER_INT_FLAG_UP);
  310. }
  311. }
  312. /*!
  313. \brief
  314. \param[in] none
  315. \param[out] none
  316. \retval none
  317. */
  318. void TIMER5_IRQHandler(void)
  319. {
  320. if(timer_interrupt_flag_get(TIMER5, TIMER_INT_FLAG_UP) != 0)
  321. {
  322. /* MCU self check count */
  323. clasB_uwTIM5Cnt++;
  324. /* Timing of time slices */
  325. TimingTaskTimerServer();
  326. /* Event_1ms interrupt */
  327. Event_1ms();
  328. timer_interrupt_flag_clear(TIMER5, TIMER_INT_FLAG_UP);
  329. }
  330. }
  331. /*!
  332. \brief
  333. \param[in] none
  334. \param[out] none
  335. \retval none
  336. */
  337. void DMA1_Channel2_IRQHandler(void)
  338. {
  339. static UWORD uwTempCount = 0;
  340. /* Read PC Conmand */
  341. if (dma_flag_get(DMA1, DMA_CH2, DMA_INT_FLAG_FTF) != 0)
  342. {
  343. UART_voCBDoneRead(UART_ERR_OK, 22);
  344. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  345. //dma_flag_clear(DMA1, DMA_CH2, DMA_INT_FLAG_FTF);
  346. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH2);
  347. uwTempCount = 22 - DMA_CH2CNT(DMA1);
  348. DMA_CH2CNT(DMA1) = uwTempCount;
  349. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  350. }
  351. /* RX error */
  352. if (dma_flag_get(DMA1, DMA_CH2, DMA_FLAG_ERR) != 0)
  353. {
  354. DMA_CH2CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  355. //dma_flag_clear(DMA1, DMA_CH2, DMA_FLAG_ERR);
  356. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH2);
  357. DMA_CH2CNT(DMA1) = 22;
  358. DMA_CH2CTL(DMA1) |= DMA_CHXCTL_CHEN;
  359. }
  360. }
  361. /*!
  362. \brief
  363. \param[in] none
  364. \param[out] none
  365. \retval none
  366. */
  367. void DMA1_Channel4_IRQHandler(void)
  368. {
  369. if (dma_flag_get(DMA1, DMA_CH4, DMA_INT_FLAG_FTF) != 0)
  370. {
  371. if (UART_stParaStatus.bParaStart)
  372. {
  373. UART_bInsertPendTx = FALSE; // clear insertBuffer pending
  374. UART_stParaStatus.bParaStart = FALSE; // clear parameter status
  375. }
  376. else
  377. {
  378. // do nothing
  379. }
  380. DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  381. //dma_flag_clear(DMA1, DMA_CH4, DMA_INT_FLAG_FTF);
  382. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_INT_FLAG_FTF, DMA_CH4);
  383. UART_stParaStatus.bWriteBusy = FALSE;
  384. }
  385. /* TX error */
  386. if (dma_flag_get(DMA1, DMA_CH4, DMA_FLAG_ERR) != 0)
  387. {
  388. if (UART_stParaStatus.bParaStart)
  389. {
  390. UART_bInsertPendTx = FALSE; // clear insertBuffer pending
  391. UART_stParaStatus.bParaStart = FALSE; // clear parameter status
  392. }
  393. DMA_CH4CTL(DMA1) &= ~DMA_CHXCTL_CHEN;
  394. //dma_flag_clear(DMA1, DMA_CH4, DMA_FLAG_ERR);
  395. DMA_INTC(DMA1) |= DMA_FLAG_ADD(DMA_FLAG_ERR, DMA_CH4);
  396. UART_stParaStatus.bWriteBusy = FALSE;
  397. }
  398. }
  399. /*!
  400. \brief
  401. \param[in] none
  402. \param[out] none
  403. \retval none
  404. */
  405. void CAN0_RX0_IRQHandler(void)
  406. {
  407. can_message_receive(CAN0, CAN_FIFO0, pRxMsg);
  408. if((pRxMsg->rx_ff != CAN_FF_STANDARD) || (pRxMsg->rx_dlen == 0))
  409. {
  410. can_interrupt_enable(CAN0, CAN_INT_RFF0);
  411. return;
  412. }
  413. switch (pRxMsg->rx_sfid)
  414. {
  415. case ID_PBU_BC:
  416. case ID_PBU_TO_MC: //接收PBU数据
  417. {
  418. CAN_RxBuf_Struct_PBU.ucBufID = (UWORD)pRxMsg->rx_sfid;
  419. CAN_Rx_ISR(&CAN_RxBuf_Struct_PBU, pRxMsg->rx_dlen);
  420. break;
  421. }
  422. case ID_BMS_BC:
  423. case ID_BMS_TO_MC: //接收BMS数据
  424. {
  425. CAN_RxBuf_Struct_BMS.ucBufID = (UWORD)pRxMsg->rx_sfid;
  426. CAN_Rx_ISR(&CAN_RxBuf_Struct_BMS, pRxMsg->rx_dlen);
  427. break;
  428. }
  429. case ID_HMI_BC:
  430. case ID_HMI_TO_MC: //接收HMI数据
  431. {
  432. CAN_RxBuf_Struct_HMI.ucBufID = (UWORD)pRxMsg->rx_sfid;
  433. CAN_Rx_ISR(&CAN_RxBuf_Struct_HMI, pRxMsg->rx_dlen);
  434. break;
  435. }
  436. case ID_CDL_BC:
  437. case ID_CDL_TO_MC: // case ID_CDL_TO_MC_TE://接收CDL数据
  438. {
  439. CAN_RxBuf_Struct_CDL.ucBufID = (UWORD)pRxMsg->rx_sfid;
  440. CAN_Rx_ISR(&CAN_RxBuf_Struct_CDL, pRxMsg->rx_dlen);
  441. break;
  442. }
  443. default:
  444. break;
  445. }
  446. can_interrupt_enable(CAN0, CAN_INT_RFF0);
  447. }