Interrupt.c 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * @copyright None
  3. * @file Interrupt.c
  4. * @author Comment Vivre
  5. * @date 2024-08-26
  6. * @brief 中断处理
  7. */
  8. #include <MyProject.h>
  9. extern uint8 data g_1mTick; ///< 1ms滴答信号,每隔1ms在SYSTICK定时器被置1,需在大循环使用处清零
  10. /**
  11. @brief 低于预警中断与过温中断
  12. @brief 开启低压检测中断后,MCU会对输入电压进行监测,当输入电压低于设定值,则会触发中断
  13. @brief 开启过温保护中断后,MCU会对内部结温进行监测,当内部结温高于设定值,则会触发中断
  14. @date 2022-07-14
  15. */
  16. void LVW_TSD_INT(void) interrupt 0 // LVW & TSD interrupt
  17. {
  18. if (ReadBit(LVSR, LVWIF))
  19. {
  20. if (ReadBit(LVSR, LVWF))
  21. {
  22. mcFaultSource = FaultUnderVoltageDC;
  23. ClrBit(LVSR, LVWF);
  24. }
  25. ClrBit(LVSR, LVWIF);
  26. }
  27. if (TSDIF)
  28. {
  29. if (ReadBit(LVSR, TSDF))
  30. {
  31. mcFaultSource = FaultTSD;
  32. ClrBit(LVSR, TSDF);
  33. }
  34. TSDIF = 0;
  35. }
  36. }
  37. /**
  38. @brief 外部中断0
  39. @brief 一般用于响应IPM的FO过流信号
  40. @date 2022-07-14
  41. */
  42. void EXTERN0_INT(void) interrupt 1 // 外部中断0
  43. {
  44. if (IF0)
  45. {
  46. IF0 = 0;
  47. }
  48. }
  49. /**
  50. @brief FOC中断(Drv中断),每个载波周期执行一次,用于处理响应较高的程序,中断优先级第二
  51. @date 2022-07-14
  52. */
  53. void DRV_ISR(void) interrupt 3
  54. {
  55. if (ReadBit(DRV_SR, FGIF))
  56. { ClrBit(DRV_SR, FGIF); }
  57. if (ReadBit(DRV_SR, DCIF)) // 比较中断
  58. {
  59. #if (VoltageCompensationEn == 1)
  60. {
  61. if (VoltageComp.cpscnt > VoltageCompensationDelayCnt)
  62. {
  63. SetBit(ADC_CR, ADCBSY);
  64. while (ReadBit(ADC_CR, ADCBSY));
  65. // mcFocCtrl.mcDcbusFlt = ADC2_DR;
  66. }
  67. VoltageCompensation(mcFocCtrl.CtrlMode,mcFocCtrl.mcDcbusFlt);
  68. }
  69. #endif
  70. DRV_SR = (DRV_SR | SYSTIF) & (~DCIF);
  71. }
  72. }
  73. /**
  74. @brief Timer2中断服务函数
  75. @note 本例程中用于RSD方式顺逆风检测
  76. @date 2022-07-14
  77. */
  78. #if (TAILWIND_MODE == RSDMethod)
  79. void TIM2_INT(void) interrupt 4
  80. {
  81. if (ReadBit(TIM2_CR1, T2IP))
  82. {
  83. RsdProcess();
  84. ClrBit(TIM2_CR1, T2IP);
  85. }
  86. if (ReadBit(TIM2_CR1, T2IF)) // 溢出中断,用于判断静止,时间为349ms。
  87. {
  88. mcRsd.State = STATIC;
  89. mcRsd.Period = 65535;
  90. mcRsd.Speed = 0;
  91. mcRsd.SpeedUpdate = 1;
  92. ClrBit(TIM2_CR1, T2IF);
  93. }
  94. if (ReadBit(TIM2_CR1, T2IR))
  95. {
  96. ClrBit(TIM2_CR1, T2IR);
  97. }
  98. }
  99. #endif
  100. /**
  101. @brief Timer1中断服务函数
  102. @note 本例程中用于BEMF方式顺逆风检测
  103. @date 2022-07-14
  104. */
  105. #if (TAILWIND_MODE == BEMFMethod)
  106. void CMP012_INT(void) interrupt 7
  107. {
  108. if (CMP_SR & 0x70)
  109. {
  110. BemfProcess();
  111. CMP_SR = CMP_SR & 0x8F;
  112. }
  113. }
  114. void TIM2_INT(void) interrupt 4
  115. {
  116. if (ReadBit(TIM2_CR1, T2IP))
  117. {
  118. ClrBit(TIM2_CR1, T2IP);
  119. }
  120. if (ReadBit(TIM2_CR1, T2IF)) // 溢出中断,用于判断静止,时间为349ms。
  121. {
  122. mcBemf.PeriodTime = 65535;
  123. mcBemf.BEMFSpeed = 0;
  124. mcBemf.SpeedUpdate = 1;
  125. ClrBit(TIM2_CR1, T2IF);
  126. }
  127. if (ReadBit(TIM2_CR1, T2IR))
  128. {
  129. ClrBit(TIM2_CR1, T2IR);
  130. }
  131. }
  132. #endif
  133. void TIM2_INT(void) interrupt 4
  134. {
  135. if (ReadBit(TIM2_CR1, T2IP))
  136. {
  137. ClrBit(TIM2_CR1, T2IP);
  138. }
  139. // 溢出中断,用于判断静止,时间为349ms。
  140. if (ReadBit(TIM2_CR1, T2IF))
  141. {
  142. ClrBit(TIM2_CR1, T2IF);
  143. }
  144. if (ReadBit(TIM2_CR1, T2IR))
  145. {
  146. ClrBit(TIM2_CR1, T2IR);
  147. }
  148. }
  149. /**
  150. @brief 定时器3中断服务函数
  151. @note 本例程中用于PWM调速信号捕获
  152. @date 2022-07-14
  153. */
  154. void TIM3_INT(void) interrupt 9
  155. {
  156. static uint16 ScrOnTime = 0; // 发热开启时间
  157. if (ReadBit(TIM3_CR1, T3IR))
  158. {
  159. ClrBit(TIM3_CR1, T3IR);
  160. }
  161. if (ReadBit(TIM3_CR1, T3IP)) // 周期中断
  162. {
  163. ClrBit(TIM3_CR1, T3IP);
  164. }
  165. if (ReadBit(TIM3_CR1, T3IF))
  166. {
  167. ClrBit(TIM3_CR1, T3IF);
  168. }
  169. }
  170. /**
  171. @brief 滴答定时器,默认用于产生1ms定时间隔
  172. @date 2022-07-14
  173. */
  174. void SYStick_INT(void) interrupt 10
  175. {
  176. if (ReadBit(DRV_SR, SYSTIF)) // SYS TICK中断
  177. {
  178. g_1mTick = 1;
  179. DRV_SR = (DRV_SR | DCIF) & (~SYSTIF);
  180. }
  181. }
  182. /**
  183. @brief 比较器硬件过流保护,该中断仅提供 故障码 赋值,用于状态机的切换。
  184. 需要开启比较器CMP3 发生过流 自动清除MOE功能
  185. @date 2022-07-14
  186. */
  187. void CMP3_INT(void) interrupt 12
  188. {
  189. if (ReadBit(CMP_SR, CMP3IF))
  190. {
  191. if (mcState != mcPosiCheck)
  192. {
  193. mcFaultSource = FaultHardOVCurrent; // 硬件过流保护
  194. }
  195. ClrBit(CMP_SR, CMP3IF);
  196. }
  197. }