main.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. /* USER CODE BEGIN Header */
  2. /**
  3. ******************************************************************************
  4. * @file : main.c
  5. * @brief : Main program body
  6. ******************************************************************************
  7. * @attention
  8. *
  9. * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
  10. * All rights reserved.</center></h2>
  11. *
  12. * This software component is licensed by ST under BSD 3-Clause license,
  13. * the "License"; You may not use this file except in compliance with the
  14. * License. You may obtain a copy of the License at:
  15. * opensource.org/licenses/BSD-3-Clause
  16. *
  17. ******************************************************************************
  18. */
  19. /* USER CODE END Header */
  20. /* Includes ------------------------------------------------------------------*/
  21. #include "main.h"
  22. #include "cmsis_os.h"
  23. #include "adc.h"
  24. #include "can.h"
  25. #include "crc.h"
  26. #include "dma.h"
  27. #include "iwdg.h"
  28. #include "rtc.h"
  29. #include "tim.h"
  30. #include "usart.h"
  31. #include "gpio.h"
  32. /* Private includes ----------------------------------------------------------*/
  33. /* USER CODE BEGIN Includes */
  34. #include "usart.h"
  35. #include "sine.h"
  36. #include "flash_if.h"
  37. /* USER CODE END Includes */
  38. /* Private typedef -----------------------------------------------------------*/
  39. /* USER CODE BEGIN PTD */
  40. /* USER CODE END PTD */
  41. /* Private define ------------------------------------------------------------*/
  42. /* USER CODE BEGIN PD */
  43. /* USER CODE END PD */
  44. /* Private macro -------------------------------------------------------------*/
  45. /* USER CODE BEGIN PM */
  46. /* USER CODE END PM */
  47. /* Private variables ---------------------------------------------------------*/
  48. /* USER CODE BEGIN PV */
  49. /* USER CODE END PV */
  50. /* Private function prototypes -----------------------------------------------*/
  51. void SystemClock_Config(void);
  52. void MX_FREERTOS_Init(void);
  53. /* USER CODE BEGIN PFP */
  54. #ifdef __GNUC__
  55. #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  56. #else
  57. #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  58. #endif
  59. PUTCHAR_PROTOTYPE
  60. {
  61. HAL_UART_Transmit(&DEBUG_USART , (uint8_t *)&ch, 1, 0xFFFF);
  62. return ch;
  63. }
  64. /* USER CODE END PFP */
  65. /* Private user code ---------------------------------------------------------*/
  66. /* USER CODE BEGIN 0 */
  67. uint16_t serial_n;
  68. //const uint16_t nRPM_Tbl[11][2] ={ {0,0}, {10,1800}, {20,2400}, {30,3000}, {40,3800}, {50,4300}, {60,4800}, {70,5300}, {80,5600}, {90,5940}, {100,6200} };
  69. struct MODULE_INFO Module_Info;
  70. RLY_ST RelayStatus;
  71. struct COUNTER Counter;
  72. struct OP_FLAG OpFlag;
  73. struct GFD Gfd;
  74. SF_test sf_t;
  75. struct EXT_inupt Exti;
  76. float Avg_offset_v ;
  77. uint16_t Freq_CLC_Grid_v ;
  78. uint8_t bGfd_Correct[2];
  79. uint32_t nGfd_Temp[2][17];
  80. uint32_t R_GFD_Total[2];
  81. uint8_t nGfd_Idx[2];
  82. uint8_t nGun;
  83. uint16_t pwmVal;
  84. uint8_t dir ;
  85. uint8_t bRelayFeedback;
  86. uint8_t nBoard_Addr;
  87. float c_vadc[2];
  88. bool GainCaliFlag;
  89. uint8_t EXTI_SMR1_Count;
  90. uint8_t EXTI_SMR2_Count;
  91. uint8_t EXTI_SMR3_Count;
  92. uint8_t EXTI_SMR4_Count;
  93. uint8_t EXTI_SMR5_Count;
  94. uint8_t EXTI_SMR6_Count;
  95. uint8_t EXTI_Test_Count;
  96. uint8_t EXTI_TestFlag1;
  97. uint8_t EXTI_TestFlag2;
  98. uint8_t EXTI_TestFlag3;
  99. uint8_t EXTI_TestFlag4;
  100. uint8_t EXTI_TestFlag5;
  101. uint8_t EXTI_TestFlag6;
  102. uint8_t ModelName[15];
  103. uint8_t DoGfdBridge[2];
  104. //for test
  105. uint8_t temp1,temp2,temp3,temp4;
  106. float temp5,temp6,temp7,temp8;
  107. uint8_t Cmdcount;
  108. /* USER CODE END 0 */
  109. /**
  110. * @brief The application entry point.
  111. * @retval int
  112. */
  113. int main(void)
  114. {
  115. /* USER CODE BEGIN 1 */
  116. /* USER CODE END 1 */
  117. /* MCU Configuration--------------------------------------------------------*/
  118. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  119. HAL_Init();
  120. /* USER CODE BEGIN Init */
  121. memset(&Module_Info, 0x00, sizeof(struct MODULE_INFO));
  122. memset(&Counter, 0x00, sizeof(struct COUNTER));
  123. memset(&OpFlag, 0x00, sizeof(struct OP_FLAG));
  124. serial_n = 0;
  125. bGfd_Correct[0] = bGfd_Correct[1] = 0;
  126. bRelayFeedback = 0;
  127. for (int i=0; i<2; i++)
  128. {
  129. nGfd_Idx[i] = 0;
  130. for (int j=0; j<GFD_FILTER_LIMIT; j++)
  131. {
  132. nGfd_Temp[i][j] = 0;
  133. }
  134. }
  135. sf_t.SF_Config.data.value = 0;
  136. sf_t.SF_Config.SF_test_status = 2; // Wait for result.
  137. sf_t.SF_Config.SF_Act = 0;
  138. sf_t.SF_Config.SF_State = 0;
  139. Gfd.GfdMode[0] = GFD_UNBALANCE;
  140. Gfd.GfdMode[1] = GFD_UNBALANCE;
  141. Gfd.ToggleBridge[0] = 0;
  142. Gfd.ToggleBridge[1] = 0;
  143. pwmVal = 0;
  144. dir = 0;
  145. nBoard_Addr = 0x03; // default old relay board
  146. /* USER CODE END Init */
  147. /* Configure the system clock */
  148. SystemClock_Config();
  149. /* USER CODE BEGIN SysInit */
  150. /* USER CODE END SysInit */
  151. /* Initialize all configured peripherals */
  152. MX_GPIO_Init();
  153. MX_DMA_Init();
  154. MX_RTC_Init();
  155. MX_USART1_UART_Init();
  156. MX_ADC1_Init();
  157. MX_ADC3_Init();
  158. MX_ADC2_Init();
  159. MX_TIM2_Init();
  160. MX_TIM5_Init();
  161. MX_IWDG_Init();
  162. MX_CRC_Init();
  163. MX_TIM3_Init();
  164. MX_USART6_UART_Init();
  165. MX_TIM4_Init();
  166. MX_CAN1_Init();
  167. /* USER CODE BEGIN 2 */
  168. HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2); // Led1
  169. HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_2);
  170. HAL_TIM_PWM_Start(&htim5, TIM_CHANNEL_3);
  171. HAL_TIM_Base_Start_IT(&htim3);
  172. // //Can Filter
  173. // ConfigFliter();
  174. // if(HAL_CAN_Start(&hcan1) != HAL_OK)
  175. // {
  176. // Error_Handler();
  177. // }
  178. // //Enable Rx receice
  179. // HAL_CAN_ActivateNotification(&hcan1, CAN_IT_RX_FIFO0_MSG_PENDING);
  180. HAL_ADC_Start_DMA(&hadc1, ADC1_Buf, (ADC1_CHANEL_COUNT * ADC1_SAMPLE_COUNT)); // start adc in DMA mode
  181. HAL_ADC_Start_DMA(&hadc2, ADC2_Buf, (ADC2_SAMPLE_COUNT * ADC2_CHANEL_COUNT)); // start adc in DMA mode
  182. HAL_ADC_Start_DMA(&hadc3, ADC3_Buf, (ADC3_CHANEL_COUNT * ADC3_SAMPLE_COUNT)); // start adc in DMA mode
  183. HAL_UART_Receive_DMA(&huart1, uart_rx_buffer, UART_BUFFER_SIZE);
  184. __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE);
  185. // Relay IO Reset All ....
  186. HAL_GPIO_WritePin(SMR1_RLY_n_Enable_GPIO_Port, SMR1_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  187. HAL_GPIO_WritePin(SMR1_RLY_p_Enable_GPIO_Port, SMR1_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  188. HAL_GPIO_WritePin(SMR2_RLY_n_Enable_GPIO_Port, SMR2_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  189. HAL_GPIO_WritePin(SMR2_RLY_p_Enable_GPIO_Port, SMR2_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  190. HAL_GPIO_WritePin(SMR3_RLY_n_Enable_GPIO_Port, SMR3_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  191. HAL_GPIO_WritePin(SMR3_RLY_p_Enable_GPIO_Port, SMR3_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  192. HAL_GPIO_WritePin(SMR4_RLY_n_Enable_GPIO_Port, SMR4_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  193. HAL_GPIO_WritePin(SMR4_RLY_p_Enable_GPIO_Port, SMR4_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  194. HAL_GPIO_WritePin(SMR5_RLY_n_Enable_GPIO_Port, SMR5_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  195. HAL_GPIO_WritePin(SMR5_RLY_p_Enable_GPIO_Port, SMR5_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  196. HAL_GPIO_WritePin(SMR6_RLY_n_Enable_GPIO_Port, SMR6_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  197. HAL_GPIO_WritePin(SMR6_RLY_p_Enable_GPIO_Port, SMR6_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  198. HAL_GPIO_WritePin(Contactor_Enable_GPIO_Port, Contactor_Enable_Pin, GPIO_PIN_RESET);
  199. HAL_GPIO_WritePin(PSU_Enable1_GPIO_Port, PSU_Enable1_Pin, GPIO_PIN_RESET); // no used
  200. HAL_GPIO_WritePin(PSU_Enable2_GPIO_Port, PSU_Enable2_Pin, GPIO_PIN_RESET); // no used
  201. //LED2,LED3 OFF
  202. HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET);
  203. HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET);
  204. FLASH_If_Init();
  205. // Read board Dip address and redefine address
  206. Module_Info.Dip_status.flags.SW2 =~HAL_GPIO_ReadPin(SW2_GPIO_Port, SW2_Pin); // SW_2
  207. Module_Info.Dip_status.flags.SW0 =~HAL_GPIO_ReadPin(SW1_GPIO_Port, SW1_Pin); // SW_1
  208. Module_Info.Dip_status.flags.SW1 =~HAL_GPIO_ReadPin(SW0_GPIO_Port, SW0_Pin); // SW_0
  209. switch(Module_Info.Dip_status.Mode)
  210. {
  211. case 01:
  212. nBoard_Addr = MainRelay1;
  213. break;
  214. case 02:
  215. nBoard_Addr = MainRelay2;
  216. break;
  217. case 03:
  218. nBoard_Addr = GunRelay;
  219. break;
  220. case 04:
  221. nBoard_Addr = MainBridge1;
  222. break;
  223. case 05:
  224. nBoard_Addr = MainBridge2;
  225. break;
  226. case 06:
  227. nBoard_Addr = MainBridge3;
  228. break;
  229. case 07:
  230. nBoard_Addr = MainBridge4;
  231. break;
  232. default:
  233. nBoard_Addr = 0xFF;
  234. break;
  235. }
  236. //Module_Info.Dip_status.Mode = m_ALL;
  237. /* USER CODE END 2 */
  238. /* Call init function for freertos objects (in freertos.c) */
  239. MX_FREERTOS_Init();
  240. /* Start scheduler */
  241. osKernelStart();
  242. /* We should never get here as control is now taken by the scheduler */
  243. /* Infinite loop */
  244. /* USER CODE BEGIN WHILE */
  245. while (1)
  246. {
  247. /* USER CODE END WHILE */
  248. /* USER CODE BEGIN 3 */
  249. }
  250. /* USER CODE END 3 */
  251. }
  252. /**
  253. * @brief System Clock Configuration
  254. * @retval None
  255. */
  256. void SystemClock_Config(void)
  257. {
  258. RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  259. RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  260. /** Configure the main internal regulator output voltage
  261. */
  262. __HAL_RCC_PWR_CLK_ENABLE();
  263. __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  264. /** Initializes the RCC Oscillators according to the specified parameters
  265. * in the RCC_OscInitTypeDef structure.
  266. */
  267. RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
  268. |RCC_OSCILLATORTYPE_LSE;
  269. RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  270. RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  271. RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  272. RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  273. RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  274. RCC_OscInitStruct.PLL.PLLM = 25;
  275. RCC_OscInitStruct.PLL.PLLN = 336;
  276. RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  277. RCC_OscInitStruct.PLL.PLLQ = 4;
  278. if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  279. {
  280. Error_Handler();
  281. }
  282. /** Initializes the CPU, AHB and APB buses clocks
  283. */
  284. RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  285. |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  286. RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  287. RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  288. RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  289. RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4;
  290. if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  291. {
  292. Error_Handler();
  293. }
  294. }
  295. /* USER CODE BEGIN 4 */
  296. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
  297. {
  298. // Sure in the charging state.
  299. if (sf_t.SF_Config.SF_Act){
  300. if(GPIO_Pin == GPIO_PIN_0){
  301. printf("SMR1 OFF\r\n");
  302. EXTI_TestFlag1 = 1;
  303. }
  304. if(GPIO_Pin == GPIO_PIN_1){
  305. printf("SMR2 OFF\r\n");
  306. EXTI_TestFlag2 = 1;
  307. }
  308. if(GPIO_Pin == GPIO_PIN_2){
  309. printf("SMR3 OFF\r\n");
  310. EXTI_TestFlag3 = 1;
  311. }
  312. if(GPIO_Pin == GPIO_PIN_3){
  313. printf("SMR4 OFF\r\n");
  314. EXTI_TestFlag4 = 1;
  315. }
  316. if(GPIO_Pin == GPIO_PIN_4){
  317. printf("SMR5 OFF\r\n");
  318. EXTI_TestFlag5 = 1;
  319. }
  320. if(GPIO_Pin == GPIO_PIN_5){
  321. printf("SMR6 OFF\r\n");
  322. EXTI_TestFlag6 = 1;
  323. }
  324. }else{
  325. if(Module_Info.SMR1_Relay_V > 200){
  326. if(GPIO_Pin == GPIO_PIN_0){
  327. // Disable SMR1 DC Output.
  328. Exti.EXTI_SMR1_Flag = true;
  329. HAL_GPIO_WritePin(SMR1_RLY_n_Enable_GPIO_Port, SMR1_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  330. HAL_GPIO_WritePin(SMR1_RLY_p_Enable_GPIO_Port, SMR1_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  331. printf(" SMR1 Relay Off, SMR1 Voltage = %d \n\r", Module_Info.SMR1_Relay_V);
  332. HAL_Delay(50);
  333. }
  334. }
  335. if(Module_Info.SMR2_Relay_V > 200){
  336. if(GPIO_Pin == GPIO_PIN_1){
  337. // Disable SMR2 DC Output.
  338. Exti.EXTI_SMR2_Flag = true;
  339. HAL_GPIO_WritePin(SMR2_RLY_n_Enable_GPIO_Port, SMR2_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  340. HAL_GPIO_WritePin(SMR2_RLY_p_Enable_GPIO_Port, SMR2_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  341. printf(" SMR2 Relay Off, SMR2 Voltage = %d \n\r", Module_Info.SMR2_Relay_V);
  342. HAL_Delay(50);
  343. }
  344. }
  345. if(Module_Info.SMR3_Relay_V > 200){
  346. if(GPIO_Pin == GPIO_PIN_2){
  347. // Disable SMR3 DC Output.
  348. Exti.EXTI_SMR3_Flag = true;
  349. HAL_GPIO_WritePin(SMR3_RLY_n_Enable_GPIO_Port, SMR3_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  350. HAL_GPIO_WritePin(SMR3_RLY_p_Enable_GPIO_Port, SMR3_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  351. printf(" SMR3 Relay Off, SMR2 Voltage = %d \n\r", Module_Info.SMR3_Relay_V);
  352. HAL_Delay(50);
  353. }
  354. }
  355. if(Module_Info.SMR4_Relay_V > 200){
  356. if(GPIO_Pin == GPIO_PIN_3){
  357. // Disable SMR4 DC Output.
  358. Exti.EXTI_SMR4_Flag = true;
  359. HAL_GPIO_WritePin(SMR4_RLY_n_Enable_GPIO_Port, SMR4_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  360. HAL_GPIO_WritePin(SMR4_RLY_p_Enable_GPIO_Port, SMR4_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  361. printf(" SMR2 Relay Off, SMR4 Voltage = %d \n\r", Module_Info.SMR4_Relay_V);
  362. HAL_Delay(50);
  363. }
  364. }
  365. if(Module_Info.SMR5_Relay_V > 200){
  366. if(GPIO_Pin == GPIO_PIN_4){
  367. // Disable SMR5 DC Output.
  368. Exti.EXTI_SMR5_Flag = true;
  369. HAL_GPIO_WritePin(SMR5_RLY_n_Enable_GPIO_Port, SMR5_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  370. HAL_GPIO_WritePin(SMR5_RLY_p_Enable_GPIO_Port, SMR5_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  371. printf(" SMR5 Relay Off, SMR2 Voltage = %d \n\r", Module_Info.SMR5_Relay_V);
  372. HAL_Delay(50);
  373. }
  374. }
  375. if(Module_Info.SMR6_Relay_V > 200){
  376. if(GPIO_Pin == GPIO_PIN_5){
  377. // Disable SMR6 DC Output.
  378. Exti.EXTI_SMR6_Flag = true;
  379. HAL_GPIO_WritePin(SMR6_RLY_n_Enable_GPIO_Port, SMR6_RLY_n_Enable_Pin, GPIO_PIN_RESET);
  380. HAL_GPIO_WritePin(SMR6_RLY_p_Enable_GPIO_Port, SMR6_RLY_p_Enable_Pin, GPIO_PIN_RESET);
  381. printf(" SMR6 Relay Off, SMR2 Voltage = %d \n\r", Module_Info.SMR6_Relay_V);
  382. HAL_Delay(50);
  383. }
  384. }
  385. }
  386. }
  387. // void ConfigFliter(void)
  388. // {
  389. // CAN_FilterTypeDef sFilterConfig;
  390. // sFilterConfig.FilterBank = 0;
  391. // sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  392. // sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  393. // sFilterConfig.FilterIdHigh = 0x0000;
  394. // sFilterConfig.FilterIdLow = 0x0000;
  395. // sFilterConfig.FilterMaskIdHigh = 0x0000;
  396. // sFilterConfig.FilterMaskIdLow = 0x0000;
  397. // sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0;
  398. // sFilterConfig.FilterActivation = ENABLE;
  399. // sFilterConfig.SlaveStartFilterBank = 0;
  400. // if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
  401. // {
  402. // Error_Handler();
  403. // }
  404. // }
  405. /* USER CODE END 4 */
  406. /**
  407. * @brief Period elapsed callback in non blocking mode
  408. * @note This function is called when TIM7 interrupt took place, inside
  409. * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment
  410. * a global variable "uwTick" used as application time base.
  411. * @param htim : TIM handle
  412. * @retval None
  413. */
  414. void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
  415. {
  416. /* USER CODE BEGIN Callback 0 */
  417. /* USER CODE END Callback 0 */
  418. if (htim->Instance == TIM7) {
  419. HAL_IncTick();
  420. }
  421. /* USER CODE BEGIN Callback 1 */
  422. if (htim->Instance==TIM3) // 100ms
  423. {
  424. if(Exti.EXTI_SMR1_Flag && EXTI_SMR1_Count < 20)
  425. EXTI_SMR1_Count ++;
  426. if(Exti.EXTI_SMR2_Flag && EXTI_SMR2_Count < 20)
  427. EXTI_SMR2_Count ++;
  428. if(Exti.EXTI_SMR3_Flag && EXTI_SMR3_Count < 20)
  429. EXTI_SMR3_Count ++;
  430. if(Exti.EXTI_SMR4_Flag && EXTI_SMR4_Count < 20)
  431. EXTI_SMR4_Count ++;
  432. if(Exti.EXTI_SMR5_Flag && EXTI_SMR5_Count < 20)
  433. EXTI_SMR5_Count ++;
  434. if(Exti.EXTI_SMR6_Flag && EXTI_SMR6_Count < 20)
  435. EXTI_SMR6_Count ++;
  436. for(int i=0; i<2; i++){
  437. if(Gfd.SCBwaitfg[i] == 1){
  438. if(Gfd.SCBwaitcount[i] <= 13){
  439. Gfd.SCBwaitcount[i]++;
  440. }else{
  441. Gfd.SCBwaitcount[i] = 0;
  442. Gfd.SCBwaitfg[i] = 0;
  443. Gfd.GfdAvgCount[i] = 0;
  444. }
  445. }
  446. if(Module_Info.gfd_chk[i].Csu_State != IDLE || bGfd_Correct[i] == 1){
  447. if(Gfd.operation[i] == GFD_BALANCE && Gfd.SCBwaitfg[i] == 0){
  448. if(++Gfd.GfdAvgCount[i] > 5){
  449. Gfd.GfdAvgCount[i] = 0;
  450. }else{
  451. Gfd.GfdAvgCount[i]++;
  452. }
  453. if(i == 0){
  454. HAL_GPIO_WritePin(Drv_Up_GPIO_Port, Drv_Up_Pin, GPIO_PIN_SET);
  455. HAL_GPIO_WritePin(Drv_Down_GPIO_Port, Drv_Down_Pin, GPIO_PIN_SET);
  456. }else{
  457. HAL_GPIO_WritePin(Drv_Up_2_GPIO_Port, Drv_Up_2_Pin, GPIO_PIN_SET);
  458. HAL_GPIO_WritePin(Drv_Down_2_GPIO_Port, Drv_Down_2_Pin, GPIO_PIN_SET);
  459. }
  460. }
  461. }
  462. }
  463. DoGfdBridge[0] = 0;
  464. DoGfdBridge[1] = 0;
  465. if(Gfd.operation[0] == GFD_UNBALANCE){
  466. if((Module_Info.gfd_chk[0].Csu_State == CABLE_CHECK && Module_Info.gfd_chk[0].Rfd_State > 2) ||
  467. (Module_Info.gfd_chk[0].Csu_State == PRECHARGE && Module_Info.SMR1_Relay_V > GFD_WORKING_VOLTAGE) ||
  468. (Module_Info.gfd_chk[0].Csu_State == CHARGE && Module_Info.SMR1_Relay_V > GFD_WORKING_VOLTAGE)) {
  469. DoGfdBridge[0] = 1;
  470. }
  471. }
  472. if(Gfd.operation[1] == GFD_UNBALANCE){
  473. if((Module_Info.gfd_chk[1].Csu_State == CABLE_CHECK && Module_Info.gfd_chk[1].Rfd_State > 2) ||
  474. (Module_Info.gfd_chk[1].Csu_State == PRECHARGE && Module_Info.SMR2_Relay_V > GFD_WORKING_VOLTAGE) ||
  475. (Module_Info.gfd_chk[1].Csu_State == CHARGE && Module_Info.SMR2_Relay_V > GFD_WORKING_VOLTAGE)) {
  476. DoGfdBridge[1] = 1;
  477. }
  478. }
  479. if(DoGfdBridge[0] == 1 || DoGfdBridge[1] == 1){
  480. Gfd.Gfdtimer++;
  481. if(Gfd.Gfdtimer < GFD_SWITCH_TIME*2){
  482. if(DoGfdBridge[0] == 0 ||
  483. Gfd.operation[0] != GFD_UNBALANCE){
  484. Gfd.Gfdtimer = (GFD_SWITCH_TIME*2)+1;
  485. }
  486. }
  487. if(Gfd.Gfdtimer > GFD_SWITCH_TIME*2){
  488. if(DoGfdBridge[1] == 0 ||
  489. Gfd.operation[1] != GFD_UNBALANCE){
  490. Gfd.Gfdtimer = 0;
  491. }
  492. }
  493. if(Gfd.Gfdtimer < GFD_SWITCH_TIME){
  494. Gfd.GfdSwitch = 0;
  495. }else if (Gfd.Gfdtimer > GFD_SWITCH_TIME && Gfd.Gfdtimer <= GFD_SWITCH_TIME*2){
  496. Gfd.GfdSwitch = 1;
  497. }else if (Gfd.Gfdtimer > GFD_SWITCH_TIME*2 && Gfd.Gfdtimer <= GFD_SWITCH_TIME*3){
  498. Gfd.GfdSwitch = 2;
  499. }else if (Gfd.Gfdtimer > GFD_SWITCH_TIME*3 && Gfd.Gfdtimer <= GFD_SWITCH_TIME*4){
  500. Gfd.GfdSwitch = 3;
  501. }
  502. if(Gfd.Gfdtimer > (GFD_SWITCH_TIME*4)+1){
  503. Gfd.Gfdtimer = 0;
  504. }
  505. switch (Gfd.GfdSwitch){
  506. case 0:
  507. if(Gfd.operation[0] == GFD_UNBALANCE){
  508. HAL_GPIO_WritePin(Drv_Up_GPIO_Port, Drv_Up_Pin, GPIO_PIN_SET);
  509. HAL_GPIO_WritePin(Drv_Down_GPIO_Port, Drv_Down_Pin, GPIO_PIN_RESET);
  510. }
  511. if(Gfd.operation[1] == GFD_UNBALANCE){
  512. HAL_GPIO_WritePin(Drv_Up_2_GPIO_Port, Drv_Up_2_Pin, GPIO_PIN_RESET);
  513. HAL_GPIO_WritePin(Drv_Down_2_GPIO_Port, Drv_Down_2_Pin, GPIO_PIN_RESET);
  514. }
  515. break;
  516. case 1:
  517. if(Gfd.operation[0] == GFD_UNBALANCE){
  518. HAL_GPIO_WritePin(Drv_Up_GPIO_Port, Drv_Up_Pin, GPIO_PIN_RESET);
  519. HAL_GPIO_WritePin(Drv_Down_GPIO_Port, Drv_Down_Pin, GPIO_PIN_SET);
  520. }
  521. break;
  522. case 2:
  523. if(Gfd.operation[0] == GFD_UNBALANCE){
  524. HAL_GPIO_WritePin(Drv_Up_GPIO_Port, Drv_Up_Pin, GPIO_PIN_RESET);
  525. HAL_GPIO_WritePin(Drv_Down_GPIO_Port, Drv_Down_Pin, GPIO_PIN_RESET);
  526. }
  527. if(Gfd.operation[1] == GFD_UNBALANCE){
  528. HAL_GPIO_WritePin(Drv_Up_2_GPIO_Port, Drv_Up_2_Pin, GPIO_PIN_SET);
  529. HAL_GPIO_WritePin(Drv_Down_2_GPIO_Port, Drv_Down_2_Pin, GPIO_PIN_RESET);
  530. }
  531. break;
  532. case 3:
  533. if(Gfd.operation[1] == GFD_UNBALANCE){
  534. HAL_GPIO_WritePin(Drv_Up_2_GPIO_Port, Drv_Up_2_Pin, GPIO_PIN_RESET);
  535. HAL_GPIO_WritePin(Drv_Down_2_GPIO_Port, Drv_Down_2_Pin, GPIO_PIN_SET);
  536. }
  537. break;
  538. }
  539. }else{
  540. Gfd.Gfdtimer = 0;
  541. }
  542. }
  543. /* USER CODE END Callback 1 */
  544. }
  545. /**
  546. * @brief This function is executed in case of error occurrence.
  547. * @retval None
  548. */
  549. void Error_Handler(void)
  550. {
  551. /* USER CODE BEGIN Error_Handler_Debug */
  552. /* User can add his own implementation to report the HAL error return state */
  553. /* USER CODE END Error_Handler_Debug */
  554. }
  555. #ifdef USE_FULL_ASSERT
  556. /**
  557. * @brief Reports the name of the source file and the source line number
  558. * where the assert_param error has occurred.
  559. * @param file: pointer to the source file name
  560. * @param line: assert_param error line source number
  561. * @retval None
  562. */
  563. void assert_failed(uint8_t *file, uint32_t line)
  564. {
  565. /* USER CODE BEGIN 6 */
  566. /* User can add his own implementation to report the file name and line number,
  567. tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  568. /* USER CODE END 6 */
  569. }
  570. #endif /* USE_FULL_ASSERT */