GPIO.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. #include <Myproject.h>
  2. /**
  3. @function GPIO_Init
  4. @brief IO初始化
  5. @date 2025-11-01
  6. */
  7. void GPIO_Init(void)
  8. {
  9. // LED上拉 低电平点亮
  10. SetBit(P0_OE, P03);
  11. SetBit(P0_PU, P03);
  12. GP03 = 1;
  13. // 主电源继电器驱动 高使能
  14. SetBit(P5_OE, P51);
  15. SetBit(P5_PU, P51);
  16. GP51 = 0;
  17. // 预驱复位控制 低复位
  18. SetBit(P0_OE, P04);
  19. SetBit(P0_PU, P04);
  20. GP04 = 0;
  21. }
  22. /**
  23. @function PreDriver_Falut_Init
  24. @brief 预驱故障中断
  25. @date 2025-10-31
  26. */
  27. void PreDriver_Falut_Init(void)
  28. {
  29. // 关闭输出 配置上拉
  30. ClrBit(P0_OE, PIN2);
  31. SetBit(P0_PU, PIN2);
  32. // 中断源配置为P02
  33. SetReg(LVSR, EXT0CFG0 | EXT0CFG1 | EXT0CFG2, EXT0CFG1);
  34. // 清除中断标志位
  35. IF0 = 0;
  36. // 配置为下降沿触发
  37. IT01 = 0;
  38. IT00 = 1;
  39. // 中断触发时自动关闭MOE
  40. SetBit(EVT_FILT, INT0_MOE_EN);
  41. // 不滤波
  42. ClrBit(EVT_FILT, EFDIV0 | EFDIV1);
  43. // 配置中断优先级为最高
  44. SetBit(IP0, PX00 | PX01);
  45. // 外部中断0使能
  46. EX0 = 1;
  47. }
  48. LED_Control_t ledControl = { LED_STATE_OFF, 0, 0 };
  49. /**
  50. @function LED_State_Display
  51. @brief 指示运行与故障代码
  52. @param[in] Xn0: [输入/出] 故障代码
  53. @date 2025-05-30
  54. */
  55. void LED_State_Display(uint8_t Xn0)
  56. {
  57. switch (ledControl.LedState)
  58. {
  59. // 关闭状态
  60. case LED_STATE_OFF:
  61. // 存在故障 切入故障状态 清零计数
  62. if (Xn0)
  63. {
  64. ledControl.LedState = LED_STATE_BLINK_FAULT;
  65. ledControl.PauseDelayCnt = 0;
  66. ledControl.BlinkCnt = 0;
  67. }
  68. // 开启状态且无故障 切入开启状态并打开LED
  69. else if (isCtrlPowOn)
  70. {
  71. ledControl.LedState = LED_STATE_ON;
  72. LED_ON;
  73. }
  74. break;
  75. // 开启状态
  76. case LED_STATE_ON:
  77. // 故障或停止时 关闭LED并切回关闭状态
  78. if (!isCtrlPowOn || Xn0)
  79. {
  80. ledControl.LedState = LED_STATE_OFF;
  81. LED_OFF;
  82. }
  83. break;
  84. // 故障指示状态
  85. case LED_STATE_BLINK_FAULT:
  86. ledControl.PauseDelayCnt ++;
  87. // 延时等待
  88. if (ledControl.PauseDelayCnt >= 500)
  89. {
  90. ledControl.PauseDelayCnt = 0;
  91. LED_TOGGLE;
  92. // 灭灯时计数
  93. if (LED_OFF_STATE)
  94. {
  95. ledControl.BlinkCnt ++;
  96. // 完成一个周期的闪烁 切换到延时等待模式
  97. if (ledControl.BlinkCnt >= Xn0)
  98. { ledControl.LedState = LED_STATE_POST_FAULT_DELAY; }
  99. }
  100. }
  101. // 故障清除后 立刻回到熄灭状态
  102. if (!Xn0)
  103. {
  104. LED_OFF;
  105. ledControl.LedState = LED_STATE_OFF;
  106. }
  107. break;
  108. // 延迟等待
  109. case LED_STATE_POST_FAULT_DELAY:
  110. ledControl.PauseDelayCnt ++;
  111. // 延时满足或故障清除回到关闭状态
  112. if ((ledControl.PauseDelayCnt >= 1000) || (!Xn0))
  113. { ledControl.LedState = LED_STATE_OFF; }
  114. break;
  115. }
  116. }
  117. volatile Power_Control_t powerControl ={DELAY_POWER_ON,0};
  118. /**
  119. * @function Power_In_Control
  120. * @brief 上电控制与预驱复位控制
  121. * @date 2025-11-01
  122. */
  123. void Power_In_Control(void)
  124. {
  125. switch (powerControl.PowerSate)
  126. {
  127. case DELAY_POWER_ON:
  128. {
  129. powerControl.PowerInCnt ++;
  130. if (powerControl.PowerInCnt > 5000)
  131. {
  132. // 继电器上电
  133. MAIN_RELAY = 1;
  134. powerControl.PowerInCnt = 0;
  135. powerControl.PowerSate = DELAY_FREE_RST;
  136. }
  137. break;
  138. }
  139. case DELAY_FREE_RST:
  140. {
  141. powerControl.PowerInCnt ++;
  142. if (powerControl.PowerInCnt > 1000)
  143. {
  144. powerControl.PowerInCnt = 0;
  145. powerControl.PowerSate = POWER_RUN;
  146. }
  147. break;
  148. }
  149. case POWER_RUN:
  150. {
  151. if (mcFaultSource == FaultNoSource)
  152. { PRE_DRIVER_RST = 1; }
  153. }
  154. }
  155. }
  156. /*Value--定时时间,单位ms,最小定时时间8ms,最大定时1800ms*/
  157. void WatchDogConfig(uint32 value, uint8 Status)
  158. {
  159. SetReg(CCFG1, WDT_EN, (Status ? WDT_EN : 0x00));
  160. WDT_ARR = ((uint16)(65532 - value * 32768 / 1000) >> 8);
  161. ClrBit(WDT_CR, WDTF);
  162. SetBit(WDT_CR, WDTRF);
  163. }