gd32f30x_it.c 12 KB

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