Subversion Repositories EDIS_Ignition

Rev

Rev 17 | Rev 19 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /* USER CODE BEGIN Header */
  2. /**
  3.  ******************************************************************************
  4.  * @file           : main.c
  5.  * @brief          : Main program body
  6.  ******************************************************************************
  7.  * @attention
  8.  *
  9.  * Copyright (c) 2023 STMicroelectronics.
  10.  * All rights reserved.
  11.  *
  12.  * This software is licensed under terms that can be found in the LICENSE file
  13.  * in the root directory of this software component.
  14.  * If no LICENSE file comes with this software, it is provided AS-IS.
  15.  *
  16.  ******************************************************************************
  17.  */
  18. /* USER CODE END Header */
  19. /* Includes ------------------------------------------------------------------*/
  20. #include "main.h"
  21.  
  22. /* Private includes ----------------------------------------------------------*/
  23. /* USER CODE BEGIN Includes */
  24. #include "memory.h"
  25. #include "display.h"
  26. #include "bmp280driver.h"
  27. #include "libMisc/fixI2C.h"
  28. #include "libPlx/plx.h"
  29. #include "libSerial/serial.h"
  30. #include "libIgnTiming/timing.h"
  31. #include "libIgnTiming/edis.h"
  32. #include "libIgnTiming/rpm.h"
  33. #include "saveTiming.h"
  34. #include "libPLX/commsLib.h"
  35. /* USER CODE END Includes */
  36.  
  37. /* Private typedef -----------------------------------------------------------*/
  38. /* USER CODE BEGIN PTD */
  39.  
  40. /* USER CODE END PTD */
  41.  
  42. /* Private define ------------------------------------------------------------*/
  43. /* USER CODE BEGIN PD */
  44. /* USER CODE END PD */
  45.  
  46. /* Private macro -------------------------------------------------------------*/
  47. /* USER CODE BEGIN PM */
  48.  
  49. /* USER CODE END PM */
  50.  
  51. /* Private variables ---------------------------------------------------------*/
  52. CAN_HandleTypeDef hcan;
  53.  
  54. I2C_HandleTypeDef hi2c1;
  55.  
  56. IWDG_HandleTypeDef hiwdg;
  57.  
  58. SPI_HandleTypeDef hspi1;
  59.  
  60. TIM_HandleTypeDef htim1;
  61. TIM_HandleTypeDef htim2;
  62. TIM_HandleTypeDef htim3;
  63.  
  64. UART_HandleTypeDef huart2;
  65.  
  66. /* USER CODE BEGIN PV */
  67. int const T100MS = 100;
  68.  
  69. int const DISPLAY_REINITIALISE = 60 * 1000;
  70. // compensated pressure in mb * 100
  71. uint32_t comp_pres = 0;
  72. // compensated temperature
  73. int32_t comp_temp = -10000;
  74.  
  75. int32_t timing = 0;
  76.  
  77. // 6 degrees error in timing wheel this time ..
  78. int const TIMING_OFFSET = -6 * TIMING_SCALE;
  79.  
  80. // default atmospheric pressure
  81. uint32_t const DEFAULT_ATMOSPHERIC_PRESSURE = 1014 * 100;
  82.  
  83. uint32_t const DEFAULT_ATMOSPHERIC_TEMPERATURE = 25 * 100;
  84. /* USER CODE END PV */
  85.  
  86. /* Private function prototypes -----------------------------------------------*/
  87. void SystemClock_Config(void);
  88. static void MX_GPIO_Init(void);
  89. static void MX_CAN_Init(void);
  90. static void MX_I2C1_Init(void);
  91. static void MX_TIM1_Init(void);
  92. static void MX_TIM2_Init(void);
  93. static void MX_SPI1_Init(void);
  94. static void MX_USART2_UART_Init(void);
  95. static void MX_TIM3_Init(void);
  96. static void MX_IWDG_Init(void);
  97. /* USER CODE BEGIN PFP */
  98.  
  99.  
  100. void libPLXcallbackSendUserData()
  101. {
  102.   // send MAP
  103.   PLX_SensorInfo info;
  104.   ConvToPLXInstance(libPLXgetNextInstance(PLX_MAP), &info);
  105.   ConvToPLXAddr(PLX_MAP, &info);
  106.   ConvToPLXReading(ConveriMFDData2Raw(PLX_MAP, PRESSURE_kPa, (float)(comp_pres) / 100.0), &info);
  107.   sendInfo(&uc2, &info);
  108.  
  109.   ConvToPLXInstance(libPLXgetNextInstance(PLX_Timing), &info);
  110.   ConvToPLXAddr(PLX_Timing, &info);
  111.   ConvToPLXReading(ConveriMFDData2Raw(PLX_Timing, 0, (float)(timing) / TIMING_SCALE), &info);
  112.   sendInfo(&uc2, &info);
  113. }
  114.  
  115. void triggerSAW()
  116. {
  117.   // trigger SAW timer, timer 1##pragma endregion
  118.  
  119.   __HAL_TIM_ENABLE(&htim1);
  120. }
  121.  
  122. /* USER CODE END PFP */
  123.  
  124. /* Private user code ---------------------------------------------------------*/
  125. /* USER CODE BEGIN 0 */
  126. void watchdogWrite()
  127. {
  128.   HAL_IWDG_Refresh(&hiwdg);
  129. }
  130.  
  131. /* USER CODE END 0 */
  132.  
  133. /**
  134.  * @brief  The application entry point.
  135.  * @retval int
  136.  */
  137. int main(void)
  138. {
  139.   /* USER CODE BEGIN 1 */
  140.  
  141.   /* USER CODE END 1 */
  142.  
  143.   /* MCU Configuration--------------------------------------------------------*/
  144.  
  145.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  146.   HAL_Init();
  147.  
  148.   /* USER CODE BEGIN Init */
  149.  
  150.   /* USER CODE END Init */
  151.  
  152.   /* Configure the system clock */
  153.   SystemClock_Config();
  154.  
  155.   /* USER CODE BEGIN SysInit */
  156.  
  157.   /* USER CODE END SysInit */
  158.  
  159.   /* Initialize all configured peripherals */
  160.   MX_GPIO_Init();
  161.   MX_CAN_Init();
  162.   MX_I2C1_Init();
  163.   MX_TIM1_Init();
  164.   MX_TIM2_Init();
  165.   MX_SPI1_Init();
  166.   MX_USART2_UART_Init();
  167.   MX_TIM3_Init();
  168.   MX_IWDG_Init();
  169.   /* USER CODE BEGIN 2 */
  170.  
  171.   init_usart_ctl(&uc2, &huart2);
  172.  
  173.   cc_init();
  174.  
  175.   HAL_TIM_Base_MspInit(&htim1);
  176.  
  177.   HAL_TIM_Base_Start(&htim1);
  178.   HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_1);
  179.  
  180.   // initialise all the STMCubeMX stuff
  181.   HAL_TIM_Base_MspInit(&htim2);
  182.   // Start the counter
  183.   HAL_TIM_Base_Start(&htim2);
  184.   // Start the input capture and the rising edge interrupt
  185.   HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
  186.   // Start the input capture and the falling edge interrupt
  187.   HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
  188.  
  189.   __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 5); // delay of 5 uS
  190.  
  191.   HAL_I2C_ClearBusyFlagErrata_2_14_7(&hi2c1);
  192.   MX_I2C1_Init();
  193.   init_bmp(&hi2c1);
  194.   uint32_t lastTick = HAL_GetTick();
  195.  
  196.   uint32_t displayOff = lastTick + 10000;
  197.   uint32_t displayReinitialise = lastTick + DISPLAY_REINITIALISE; // every minute, reinitialise display because of risk of noise
  198.  
  199.   uint8_t intensity = 2;
  200.  
  201.   ResetRxBuffer(&uc2);
  202.  
  203.   resetPLX();
  204.  
  205.   // HAL_IWDG_Init(&hiwdg);
  206.   /* USER CODE END 2 */
  207.  
  208.   /* Infinite loop */
  209.   /* USER CODE BEGIN WHILE */
  210.   while (1)
  211.   {
  212.  
  213.     int button = HAL_GPIO_ReadPin(PUSHBUTTON_GPIO_Port, PUSHBUTTON_Pin) == GPIO_PIN_RESET;
  214.  
  215.     if (button)
  216.     {
  217.       intensity = 2;
  218.       displayOff = lastTick + 30000;
  219.     }
  220.  
  221.     switch (intensity)
  222.     {
  223.     case 2:
  224.       if (HAL_GetTick() > displayOff)
  225.       {
  226.         intensity = 1;
  227.         displayOff = lastTick + 60000;
  228.       }
  229.  
  230.       break;
  231.     case 1:
  232.       if (HAL_GetTick() > displayOff)
  233.       {
  234.         intensity = 1; // was 0
  235.       }
  236.     default:
  237.       break;
  238.     }
  239.     // periodically write to the display and clear it
  240.     if (HAL_GetTick() > displayReinitialise)
  241.     {
  242.       displayReinitialise += DISPLAY_REINITIALISE;
  243.       cc_display(0, intensity, 1);
  244.     }
  245.     else
  246.       cc_display(0, intensity, 0);
  247.  
  248.     if (HAL_GetTick() - lastTick > T100MS)
  249.     {
  250.       lastTick = HAL_GetTick();
  251.       /* Reading the raw data from sensor */
  252.       struct bmp280_uncomp_data ucomp_data;
  253.       uint8_t rslt = bmp280_get_uncomp_data(&ucomp_data, &bmp);
  254.  
  255.       uint8_t rslt2 = 1;
  256.       uint8_t rslt3 = 1;
  257.  
  258.       if (rslt == 0)
  259.       {
  260.         rslt2 = bmp280_get_comp_pres_32bit(&comp_pres, ucomp_data.uncomp_press, &bmp);
  261.  
  262.         rslt3 = bmp280_get_comp_temp_32bit(&comp_temp, ucomp_data.uncomp_temp, &bmp);
  263.  
  264. #if defined TEST_CODE
  265.         comp_pres = 100000;
  266.         comp_temp = 4000;
  267. #endif
  268.       }
  269.       // if the BMP280 pressure is good, then allow it through, otherwise drop to
  270.       // centrifugal advance only.
  271.       if (rslt == BMP280_OK && rslt2 == BMP280_OK && rslt3 == BMP280_OK)
  272.         cc_feed_env(comp_pres, comp_temp);
  273.       else
  274.         cc_feed_env(DEFAULT_ATMOSPHERIC_PRESSURE, DEFAULT_ATMOSPHERIC_TEMPERATURE);
  275.  
  276.         // compute RPM value, feed to display
  277. #if defined TEST_CODE
  278.       int rpm = 1000;
  279. #else
  280.       int rpm = CalculateRPM();
  281. #endif
  282.       if (rpm > 0)
  283.       {
  284.         cc_feed_rpm(rpm);
  285.         // compute timing value, feed to display
  286.         timing = mapTiming(rpm, 1000 - comp_pres / 100);
  287.         cc_feed_timing(timing);
  288.         int microsecs = mapTimingToMicroseconds(timing + TIMING_OFFSET, 0);
  289.         __HAL_TIM_SET_AUTORELOAD(&htim1, microsecs + SAW_DELAY);
  290.       }
  291.     }
  292.  
  293.     // Handle PLX
  294.     libPLXpollData(&uc2);
  295.  
  296.     /* USER CODE END WHILE */
  297.  
  298.     /* USER CODE BEGIN 3 */
  299.     watchdogWrite();
  300.  
  301.     HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
  302.  
  303.     // todo occasionally     saveTimingInfoToNvram();
  304.   }
  305.   /* USER CODE END 3 */
  306. }
  307.  
  308. /**
  309.  * @brief System Clock Configuration
  310.  * @retval None
  311.  */
  312. void SystemClock_Config(void)
  313. {
  314.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  315.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  316.  
  317.   /** Initializes the RCC Oscillators according to the specified parameters
  318.    * in the RCC_OscInitTypeDef structure.
  319.    */
  320.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_HSE;
  321.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  322.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  323.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  324.   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  325.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  326.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  327.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  328.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  329.   {
  330.     Error_Handler();
  331.   }
  332.  
  333.   /** Initializes the CPU, AHB and APB buses clocks
  334.    */
  335.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
  336.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  337.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  338.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  339.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  340.  
  341.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  342.   {
  343.     Error_Handler();
  344.   }
  345. }
  346.  
  347. /**
  348.  * @brief CAN Initialization Function
  349.  * @param None
  350.  * @retval None
  351.  */
  352. static void MX_CAN_Init(void)
  353. {
  354.  
  355.   /* USER CODE BEGIN CAN_Init 0 */
  356.  
  357.   /* USER CODE END CAN_Init 0 */
  358.  
  359.   /* USER CODE BEGIN CAN_Init 1 */
  360.  
  361.   /* USER CODE END CAN_Init 1 */
  362.   hcan.Instance = CAN1;
  363.   hcan.Init.Prescaler = 18;
  364.   hcan.Init.Mode = CAN_MODE_NORMAL;
  365.   hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  366.   hcan.Init.TimeSeg1 = CAN_BS1_3TQ;
  367.   hcan.Init.TimeSeg2 = CAN_BS2_4TQ;
  368.   hcan.Init.TimeTriggeredMode = DISABLE;
  369.   hcan.Init.AutoBusOff = DISABLE;
  370.   hcan.Init.AutoWakeUp = DISABLE;
  371.   hcan.Init.AutoRetransmission = DISABLE;
  372.   hcan.Init.ReceiveFifoLocked = DISABLE;
  373.   hcan.Init.TransmitFifoPriority = DISABLE;
  374.   if (HAL_CAN_Init(&hcan) != HAL_OK)
  375.   {
  376.     Error_Handler();
  377.   }
  378.   /* USER CODE BEGIN CAN_Init 2 */
  379.  
  380.   /* USER CODE END CAN_Init 2 */
  381. }
  382.  
  383. /**
  384.  * @brief I2C1 Initialization Function
  385.  * @param None
  386.  * @retval None
  387.  */
  388. static void MX_I2C1_Init(void)
  389. {
  390.  
  391.   /* USER CODE BEGIN I2C1_Init 0 */
  392.  
  393.   /* USER CODE END I2C1_Init 0 */
  394.  
  395.   /* USER CODE BEGIN I2C1_Init 1 */
  396.  
  397.   /* USER CODE END I2C1_Init 1 */
  398.   hi2c1.Instance = I2C1;
  399.   hi2c1.Init.ClockSpeed = 100000;
  400.   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  401.   hi2c1.Init.OwnAddress1 = 0;
  402.   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  403.   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  404.   hi2c1.Init.OwnAddress2 = 0;
  405.   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  406.   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  407.   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  408.   {
  409.     Error_Handler();
  410.   }
  411.   /* USER CODE BEGIN I2C1_Init 2 */
  412.  
  413.   /* USER CODE END I2C1_Init 2 */
  414. }
  415.  
  416. /**
  417.  * @brief IWDG Initialization Function
  418.  * @param None
  419.  * @retval None
  420.  */
  421. static void MX_IWDG_Init(void)
  422. {
  423.  
  424.   /* USER CODE BEGIN IWDG_Init 0 */
  425.  
  426.   /* USER CODE END IWDG_Init 0 */
  427.  
  428.   /* USER CODE BEGIN IWDG_Init 1 */
  429.  
  430.   /* USER CODE END IWDG_Init 1 */
  431.   hiwdg.Instance = IWDG;
  432.   hiwdg.Init.Prescaler = IWDG_PRESCALER_4;
  433.   hiwdg.Init.Reload = 1000;
  434.   if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  435.   {
  436.     Error_Handler();
  437.   }
  438.   /* USER CODE BEGIN IWDG_Init 2 */
  439.  
  440.   /* USER CODE END IWDG_Init 2 */
  441. }
  442.  
  443. /**
  444.  * @brief SPI1 Initialization Function
  445.  * @param None
  446.  * @retval None
  447.  */
  448. static void MX_SPI1_Init(void)
  449. {
  450.  
  451.   /* USER CODE BEGIN SPI1_Init 0 */
  452.  
  453.   /* USER CODE END SPI1_Init 0 */
  454.  
  455.   /* USER CODE BEGIN SPI1_Init 1 */
  456.  
  457.   /* USER CODE END SPI1_Init 1 */
  458.   /* SPI1 parameter configuration*/
  459.   hspi1.Instance = SPI1;
  460.   hspi1.Init.Mode = SPI_MODE_MASTER;
  461.   hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  462.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  463.   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  464.   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  465.   hspi1.Init.NSS = SPI_NSS_SOFT;
  466.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  467.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  468.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  469.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  470.   hspi1.Init.CRCPolynomial = 10;
  471.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  472.   {
  473.     Error_Handler();
  474.   }
  475.   /* USER CODE BEGIN SPI1_Init 2 */
  476.  
  477.   /* USER CODE END SPI1_Init 2 */
  478. }
  479.  
  480. /**
  481.  * @brief TIM1 Initialization Function
  482.  * @param None
  483.  * @retval None
  484.  */
  485. static void MX_TIM1_Init(void)
  486. {
  487.  
  488.   /* USER CODE BEGIN TIM1_Init 0 */
  489.  
  490.   /* USER CODE END TIM1_Init 0 */
  491.  
  492.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  493.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  494.   TIM_OC_InitTypeDef sConfigOC = {0};
  495.   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
  496.  
  497.   /* USER CODE BEGIN TIM1_Init 1 */
  498.  
  499.   /* USER CODE END TIM1_Init 1 */
  500.   htim1.Instance = TIM1;
  501.   htim1.Init.Prescaler = 71;
  502.   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
  503.   htim1.Init.Period = 65535;
  504.   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  505.   htim1.Init.RepetitionCounter = 0;
  506.   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  507.   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
  508.   {
  509.     Error_Handler();
  510.   }
  511.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  512.   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
  513.   {
  514.     Error_Handler();
  515.   }
  516.   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
  517.   {
  518.     Error_Handler();
  519.   }
  520.   if (HAL_TIM_OnePulse_Init(&htim1, TIM_OPMODE_SINGLE) != HAL_OK)
  521.   {
  522.     Error_Handler();
  523.   }
  524.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1REF;
  525.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  526.   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  527.   {
  528.     Error_Handler();
  529.   }
  530.   sConfigOC.OCMode = TIM_OCMODE_PWM1;
  531.   sConfigOC.Pulse = SAW_DELAY;
  532.   sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  533.   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
  534.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  535.   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
  536.   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
  537.   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  538.   {
  539.     Error_Handler();
  540.   }
  541.   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
  542.   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
  543.   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
  544.   sBreakDeadTimeConfig.DeadTime = 0;
  545.   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
  546.   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
  547.   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
  548.   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
  549.   {
  550.     Error_Handler();
  551.   }
  552.   /* USER CODE BEGIN TIM1_Init 2 */
  553.  
  554.   /* USER CODE END TIM1_Init 2 */
  555.   HAL_TIM_MspPostInit(&htim1);
  556. }
  557.  
  558. /**
  559.  * @brief TIM2 Initialization Function
  560.  * @param None
  561.  * @retval None
  562.  */
  563. static void MX_TIM2_Init(void)
  564. {
  565.  
  566.   /* USER CODE BEGIN TIM2_Init 0 */
  567.  
  568.   /* USER CODE END TIM2_Init 0 */
  569.  
  570.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  571.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  572.   TIM_IC_InitTypeDef sConfigIC = {0};
  573.  
  574.   /* USER CODE BEGIN TIM2_Init 1 */
  575.  
  576.   /* USER CODE END TIM2_Init 1 */
  577.   htim2.Instance = TIM2;
  578.   htim2.Init.Prescaler = 719;
  579.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  580.   htim2.Init.Period = 65535;
  581.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  582.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  583.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  584.   {
  585.     Error_Handler();
  586.   }
  587.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  588.   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  589.   {
  590.     Error_Handler();
  591.   }
  592.   if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
  593.   {
  594.     Error_Handler();
  595.   }
  596.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE;
  597.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  598.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  599.   {
  600.     Error_Handler();
  601.   }
  602.   sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_RISING;
  603.   sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  604.   sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  605.   sConfigIC.ICFilter = 0;
  606.   if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  607.   {
  608.     Error_Handler();
  609.   }
  610.   sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_FALLING;
  611.   sConfigIC.ICSelection = TIM_ICSELECTION_INDIRECTTI;
  612.   if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_2) != HAL_OK)
  613.   {
  614.     Error_Handler();
  615.   }
  616.   /* USER CODE BEGIN TIM2_Init 2 */
  617.  
  618.   /* USER CODE END TIM2_Init 2 */
  619. }
  620.  
  621. /**
  622.  * @brief TIM3 Initialization Function
  623.  * @param None
  624.  * @retval None
  625.  */
  626. static void MX_TIM3_Init(void)
  627. {
  628.  
  629.   /* USER CODE BEGIN TIM3_Init 0 */
  630.  
  631.   /* USER CODE END TIM3_Init 0 */
  632.  
  633.   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  634.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  635.  
  636.   /* USER CODE BEGIN TIM3_Init 1 */
  637.  
  638.   /* USER CODE END TIM3_Init 1 */
  639.   htim3.Instance = TIM3;
  640.   htim3.Init.Prescaler = 719;
  641.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  642.   htim3.Init.Period = 10000;
  643.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  644.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  645.   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  646.   {
  647.     Error_Handler();
  648.   }
  649.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  650.   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
  651.   {
  652.     Error_Handler();
  653.   }
  654.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  655.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  656.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  657.   {
  658.     Error_Handler();
  659.   }
  660.   /* USER CODE BEGIN TIM3_Init 2 */
  661.  
  662.   /* USER CODE END TIM3_Init 2 */
  663. }
  664.  
  665. /**
  666.  * @brief USART2 Initialization Function
  667.  * @param None
  668.  * @retval None
  669.  */
  670. static void MX_USART2_UART_Init(void)
  671. {
  672.  
  673.   /* USER CODE BEGIN USART2_Init 0 */
  674.  
  675.   /* USER CODE END USART2_Init 0 */
  676.  
  677.   /* USER CODE BEGIN USART2_Init 1 */
  678.  
  679.   /* USER CODE END USART2_Init 1 */
  680.   huart2.Instance = USART2;
  681.   huart2.Init.BaudRate = 19200;
  682.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  683.   huart2.Init.StopBits = UART_STOPBITS_1;
  684.   huart2.Init.Parity = UART_PARITY_NONE;
  685.   huart2.Init.Mode = UART_MODE_TX_RX;
  686.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  687.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  688.   if (HAL_UART_Init(&huart2) != HAL_OK)
  689.   {
  690.     Error_Handler();
  691.   }
  692.   /* USER CODE BEGIN USART2_Init 2 */
  693.  
  694.   /* USER CODE END USART2_Init 2 */
  695. }
  696.  
  697. /**
  698.  * @brief GPIO Initialization Function
  699.  * @param None
  700.  * @retval None
  701.  */
  702. static void MX_GPIO_Init(void)
  703. {
  704.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  705.   /* USER CODE BEGIN MX_GPIO_Init_1 */
  706.   /* USER CODE END MX_GPIO_Init_1 */
  707.  
  708.   /* GPIO Ports Clock Enable */
  709.   __HAL_RCC_GPIOC_CLK_ENABLE();
  710.   __HAL_RCC_GPIOD_CLK_ENABLE();
  711.   __HAL_RCC_GPIOA_CLK_ENABLE();
  712.   __HAL_RCC_GPIOB_CLK_ENABLE();
  713.  
  714.   /*Configure GPIO pin Output Level */
  715.   HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
  716.  
  717.   /*Configure GPIO pin Output Level */
  718.   HAL_GPIO_WritePin(GPIOA, SPI1_NSS_Pin | SPI1_RESET_Pin, GPIO_PIN_RESET);
  719.  
  720.   /*Configure GPIO pin Output Level */
  721.   HAL_GPIO_WritePin(SPI1_CD_GPIO_Port, SPI1_CD_Pin, GPIO_PIN_RESET);
  722.  
  723.   /*Configure GPIO pin : LED_Pin */
  724.   GPIO_InitStruct.Pin = LED_Pin;
  725.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  726.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  727.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  728.   HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
  729.  
  730.   /*Configure GPIO pins : SPI1_NSS_Pin SPI1_RESET_Pin */
  731.   GPIO_InitStruct.Pin = SPI1_NSS_Pin | SPI1_RESET_Pin;
  732.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  733.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  734.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  735.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  736.  
  737.   /*Configure GPIO pin : SPI1_CD_Pin */
  738.   GPIO_InitStruct.Pin = SPI1_CD_Pin;
  739.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  740.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  741.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  742.   HAL_GPIO_Init(SPI1_CD_GPIO_Port, &GPIO_InitStruct);
  743.  
  744.   /*Configure GPIO pin : PUSHBUTTON_Pin */
  745.   GPIO_InitStruct.Pin = PUSHBUTTON_Pin;
  746.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  747.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  748.   HAL_GPIO_Init(PUSHBUTTON_GPIO_Port, &GPIO_InitStruct);
  749.  
  750.   /*Configure GPIO pin : dualSpark_Pin */
  751.   GPIO_InitStruct.Pin = dualSpark_Pin;
  752.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  753.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  754.   HAL_GPIO_Init(dualSpark_GPIO_Port, &GPIO_InitStruct);
  755.  
  756.   /* USER CODE BEGIN MX_GPIO_Init_2 */
  757.   /* USER CODE END MX_GPIO_Init_2 */
  758. }
  759.  
  760. /* USER CODE BEGIN 4 */
  761.  
  762. /* USER CODE END 4 */
  763.  
  764. /**
  765.  * @brief  This function is executed in case of error occurrence.
  766.  * @retval None
  767.  */
  768. void Error_Handler(void)
  769. {
  770.   /* USER CODE BEGIN Error_Handler_Debug */
  771.   /* User can add his own implementation to report the HAL error return state */
  772.   __disable_irq();
  773.   while (1)
  774.   {
  775.   }
  776.   /* USER CODE END Error_Handler_Debug */
  777. }
  778.  
  779. #ifdef USE_FULL_ASSERT
  780. /**
  781.  * @brief  Reports the name of the source file and the source line number
  782.  *         where the assert_param error has occurred.
  783.  * @param  file: pointer to the source file name
  784.  * @param  line: assert_param error line source number
  785.  * @retval None
  786.  */
  787. void assert_failed(uint8_t *file, uint32_t line)
  788. {
  789.   /* USER CODE BEGIN 6 */
  790.   /* User can add his own implementation to report the file name and line number,
  791.      ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  792.   /* USER CODE END 6 */
  793. }
  794. #endif /* USE_FULL_ASSERT */
  795.