Subversion Repositories dashGPS

Rev

Rev 28 | Rev 30 | 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.  * <h2><center>&copy; Copyright (c) 2020 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 "usb_device.h"
  23.  
  24. /* Private includes ----------------------------------------------------------*/
  25. /* USER CODE BEGIN Includes */
  26. #include "libSerial/serial.h"
  27. #include "libBMP280/bmp280.h"
  28. #include "display.h"
  29. /* USER CODE END Includes */
  30.  
  31. /* Private typedef -----------------------------------------------------------*/
  32. /* USER CODE BEGIN PTD */
  33.  
  34. /* USER CODE END PTD */
  35.  
  36. /* Private define ------------------------------------------------------------*/
  37. /* USER CODE BEGIN PD */
  38. /* USER CODE END PD */
  39.  
  40. /* Private macro -------------------------------------------------------------*/
  41. /* USER CODE BEGIN PM */
  42.  
  43. /* USER CODE END PM */
  44.  
  45. /* Private variables ---------------------------------------------------------*/
  46. I2C_HandleTypeDef hi2c1;
  47. I2C_HandleTypeDef hi2c2;
  48.  
  49. IWDG_HandleTypeDef hiwdg;
  50.  
  51. RTC_HandleTypeDef hrtc;
  52.  
  53. SPI_HandleTypeDef hspi1;
  54.  
  55. TIM_HandleTypeDef htim3;
  56. TIM_HandleTypeDef htim4;
  57.  
  58. UART_HandleTypeDef huart1;
  59.  
  60. /* USER CODE BEGIN PV */
  61. typedef struct
  62. {
  63.   uint8_t dev_addr;
  64. } interface_t;
  65.  
  66. static int8_t
  67. user_i2c_write (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data,
  68.                 uint32_t len)
  69. {
  70.   HAL_StatusTypeDef st = HAL_I2C_Mem_Write (&hi2c2, i2c_addr << 1, reg_addr, 1,
  71.                                             reg_data, len, 1000);
  72.  
  73.   return st != HAL_OK ? BMP280_E_COMM_FAIL : BMP280_OK;
  74.  
  75. }
  76. static int8_t
  77. user_i2c_read (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data,
  78.                uint32_t len)
  79. {
  80.   HAL_StatusTypeDef st = HAL_I2C_Mem_Read (&hi2c2, i2c_addr << 1, reg_addr, 1,
  81.                                            reg_data, len, 1000);
  82.  
  83.   return st != HAL_OK ? BMP280_E_COMM_FAIL : BMP280_OK;
  84.  
  85. }
  86. // the second I2C bus is I2C1, this is used for the external I2C thermometer to avoid problems with noise pickup .
  87. static int8_t
  88. user_i2c2_write (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data,
  89.                 uint32_t len)
  90. {
  91.   HAL_StatusTypeDef st = HAL_I2C_Mem_Write (&hi2c1, i2c_addr << 1, reg_addr, 1,
  92.                                             reg_data, len, 1000);
  93.  
  94.   return st != HAL_OK ? BMP280_E_COMM_FAIL : BMP280_OK;
  95.  
  96. }
  97. static int8_t
  98. user_i2c2_read (uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data,
  99.                uint32_t len)
  100. {
  101.   HAL_StatusTypeDef st = HAL_I2C_Mem_Read (&hi2c1, i2c_addr << 1, reg_addr, 1,
  102.                                            reg_data, len, 1000);
  103.  
  104.   return st != HAL_OK ? BMP280_E_COMM_FAIL : BMP280_OK;
  105.  
  106. }
  107.  
  108.  
  109. static void
  110. user_delay_ms (uint32_t ms, void *handle)
  111. {
  112.   HAL_Delay (ms);
  113.  
  114. }
  115.  
  116. struct bmp280_dev bmp =
  117.   {
  118.   .intf = BMP280_I2C_INTF,
  119.   .read = user_i2c_read,
  120.   .write = user_i2c_write,
  121.   .delay_ms = user_delay_ms,
  122.  
  123.    /* Update interface pointer with the structure that contains both device address and file descriptor */
  124.   .dev_id = BMP280_I2C_ADDR_PRIM
  125.   };
  126.  
  127. struct bmp280_dev bmp2 =
  128.   {
  129.   .intf = BMP280_I2C_INTF,
  130.   .read = user_i2c2_read,
  131.   .write = user_i2c2_write,
  132.   .delay_ms = user_delay_ms,
  133.  
  134.   /* Update interface pointer with the structure that contains both device address and file descriptor */
  135.   .dev_id = BMP280_I2C_ADDR_PRIM
  136.   };
  137.  
  138. int8_t rslt;
  139.  
  140.  
  141. struct bmp280_config conf;
  142. struct bmp280_config conf2;
  143.  
  144. /* USER CODE END PV */
  145.  
  146. /* Private function prototypes -----------------------------------------------*/
  147. void SystemClock_Config(void);
  148. static void MX_GPIO_Init(void);
  149. static void MX_SPI1_Init(void);
  150. static void MX_TIM4_Init(void);
  151. static void MX_USART1_UART_Init(void);
  152. static void MX_TIM3_Init(void);
  153. static void MX_I2C2_Init(void);
  154. static void MX_RTC_Init(void);
  155. static void MX_IWDG_Init(void);
  156. static void MX_I2C1_Init(void);
  157. /* USER CODE BEGIN PFP */
  158.  
  159. /* USER CODE END PFP */
  160.  
  161. /* Private user code ---------------------------------------------------------*/
  162. /* USER CODE BEGIN 0 */
  163.  
  164. uint32_t const TICKS_LOOP = 50; // 50mS per loop.
  165.  
  166. // initialise the BMP
  167. uint8_t init_bmp(struct bmp280_config * conf, struct bmp280_dev * bmp )
  168. {
  169.   rslt = bmp280_init(bmp);
  170.   if (rslt != BMP280_OK)
  171.     return rslt;
  172.  
  173.   rslt = bmp280_get_config (conf, bmp);
  174.   if (rslt != BMP280_OK)
  175.     return rslt;
  176.   /* configuring the temperature oversampling, filter coefficient and output data rate */
  177.   /* Overwrite the desired settings */
  178.   conf->filter = BMP280_FILTER_COEFF_2;
  179.  
  180.   /* Temperature oversampling set at 4x */
  181.   conf->os_temp = BMP280_OS_4X;
  182.  
  183.   /* Pressure over sampling none (disabling pressure measurement) */
  184.   conf->os_pres = BMP280_OS_4X;
  185.  
  186.   /* Setting the output data rate as 2HZ(500ms) */
  187.   conf->odr = BMP280_ODR_500_MS;
  188.   rslt = bmp280_set_config (conf, bmp);
  189.   if (rslt != BMP280_OK)
  190.     return rslt;
  191.  
  192.   /* Always set the power mode after setting the configuration */
  193.   rslt = bmp280_set_power_mode (BMP280_NORMAL_MODE, bmp);
  194.   if (rslt != BMP280_OK)
  195.     return rslt;
  196.  
  197. }
  198.  
  199. static void reset_I2C1(void)
  200. {
  201.   HAL_GPIO_WritePin ( GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  202.   HAL_GPIO_WritePin ( GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
  203.   __HAL_AFIO_REMAP_I2C1_DISABLE();
  204.   int i;
  205.   // clock 18 times
  206.   for (i=0;i<18;++i)
  207.     {
  208.      HAL_Delay (1);
  209.      HAL_GPIO_WritePin ( GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  210.      HAL_Delay (1);
  211.      HAL_GPIO_WritePin ( GPIOB, GPIO_PIN_9, GPIO_PIN_SET);
  212.     }
  213.    __HAL_AFIO_REMAP_I2C1_ENABLE();
  214.  
  215. }
  216.  
  217. void resetBmp2(void)
  218. {
  219.   HAL_GPIO_WritePin (I2C1_BusPower_GPIO_Port, I2C1_BusPower_Pin, GPIO_PIN_RESET);
  220.   HAL_Delay (200);
  221.   HAL_GPIO_WritePin (I2C1_BusPower_GPIO_Port, I2C1_BusPower_Pin, GPIO_PIN_SET);
  222.   HAL_Delay (200);
  223.   init_bmp(&conf2,&bmp2);
  224.  
  225. }
  226.  
  227.  
  228. /* USER CODE END 0 */
  229.  
  230. /**
  231.   * @brief  The application entry point.
  232.   * @retval int
  233.   */
  234. int main(void)
  235. {
  236.   /* USER CODE BEGIN 1 */
  237.  
  238.   /* USER CODE END 1 */
  239.  
  240.   /* MCU Configuration--------------------------------------------------------*/
  241.  
  242.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  243.   HAL_Init();
  244.  
  245.   /* USER CODE BEGIN Init */
  246.  
  247.   /* USER CODE END Init */
  248.  
  249.   /* Configure the system clock */
  250.   SystemClock_Config();
  251.  
  252.   /* USER CODE BEGIN SysInit */
  253.  
  254.   /* USER CODE END SysInit */
  255.  
  256.   /* Initialize all configured peripherals */
  257.   MX_GPIO_Init();
  258.   MX_SPI1_Init();
  259.   MX_TIM4_Init();
  260.   MX_USART1_UART_Init();
  261.   MX_TIM3_Init();
  262.   MX_I2C2_Init();
  263.   MX_RTC_Init();
  264.   MX_USB_DEVICE_Init();
  265.   MX_IWDG_Init();
  266.   MX_I2C1_Init();
  267.   /* USER CODE BEGIN 2 */
  268.  
  269.   HAL_GPIO_WritePin ( USB_PULLUP_GPIO_Port, USB_PULLUP_Pin, GPIO_PIN_RESET);
  270.   HAL_Delay (1000);
  271.   HAL_GPIO_WritePin ( USB_PULLUP_GPIO_Port, USB_PULLUP_Pin, GPIO_PIN_SET);
  272.   /* setup the USART control blocks */
  273.  
  274. #if defined SERIAL_UART1
  275.   init_usart_ctl (&uc1, &huart1);
  276.  
  277.  
  278.   EnableSerialRxInterrupt (&uc1);
  279.  
  280. #endif
  281.  
  282.   init_bmp(&conf,&bmp);
  283.   init_bmp(&conf2,&bmp2);
  284.  
  285.    cc_init ();
  286.  
  287.  
  288.   uint32_t timeNext = HAL_GetTick () + TICKS_LOOP;
  289.  
  290.   /* USER CODE END 2 */
  291.  
  292.   /* Infinite loop */
  293.   /* USER CODE BEGIN WHILE */
  294.   while (1)
  295.     {
  296.       uint32_t timeNow = HAL_GetTick ();
  297.  
  298.       if (timeNow < timeNext)
  299.         HAL_Delay (timeNext - timeNow);
  300.       timeNext += TICKS_LOOP;
  301.       cc_run (&bmp, &bmp2);
  302.  
  303.       // refresh watchdog timer
  304.       HAL_IWDG_Refresh(&hiwdg);
  305.  
  306.  
  307.     /* USER CODE END WHILE */
  308.  
  309.     /* USER CODE BEGIN 3 */
  310.     }
  311.   /* USER CODE END 3 */
  312. }
  313.  
  314. /**
  315.   * @brief System Clock Configuration
  316.   * @retval None
  317.   */
  318. void SystemClock_Config(void)
  319. {
  320.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  321.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  322.   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  323.  
  324.   /** Initializes the RCC Oscillators according to the specified parameters
  325.   * in the RCC_OscInitTypeDef structure.
  326.   */
  327.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE
  328.                               |RCC_OSCILLATORTYPE_LSE;
  329.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  330.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  331.   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
  332.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  333.   RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  334.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  335.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  336.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  337.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  338.   {
  339.     Error_Handler();
  340.   }
  341.   /** Initializes the CPU, AHB and APB buses clocks
  342.   */
  343.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  344.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  345.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  346.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  347.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  348.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  349.  
  350.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  351.   {
  352.     Error_Handler();
  353.   }
  354.   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USB;
  355.   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
  356.   PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_PLL_DIV1_5;
  357.   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  358.   {
  359.     Error_Handler();
  360.   }
  361. }
  362.  
  363. /**
  364.   * @brief I2C1 Initialization Function
  365.   * @param None
  366.   * @retval None
  367.   */
  368. static void MX_I2C1_Init(void)
  369. {
  370.  
  371.   /* USER CODE BEGIN I2C1_Init 0 */
  372.  
  373.   /* USER CODE END I2C1_Init 0 */
  374.  
  375.   /* USER CODE BEGIN I2C1_Init 1 */
  376.  
  377.   /* USER CODE END I2C1_Init 1 */
  378.   hi2c1.Instance = I2C1;
  379.   hi2c1.Init.ClockSpeed = 100000;
  380.   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  381.   hi2c1.Init.OwnAddress1 = 0;
  382.   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  383.   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  384.   hi2c1.Init.OwnAddress2 = 0;
  385.   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  386.   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  387.   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
  388.   {
  389.     Error_Handler();
  390.   }
  391.   /* USER CODE BEGIN I2C1_Init 2 */
  392.  
  393.   /* USER CODE END I2C1_Init 2 */
  394.  
  395. }
  396.  
  397. /**
  398.   * @brief I2C2 Initialization Function
  399.   * @param None
  400.   * @retval None
  401.   */
  402. static void MX_I2C2_Init(void)
  403. {
  404.  
  405.   /* USER CODE BEGIN I2C2_Init 0 */
  406.  
  407.   /* USER CODE END I2C2_Init 0 */
  408.  
  409.   /* USER CODE BEGIN I2C2_Init 1 */
  410.  
  411.   /* USER CODE END I2C2_Init 1 */
  412.   hi2c2.Instance = I2C2;
  413.   hi2c2.Init.ClockSpeed = 100000;
  414.   hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
  415.   hi2c2.Init.OwnAddress1 = 0;
  416.   hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  417.   hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  418.   hi2c2.Init.OwnAddress2 = 0;
  419.   hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  420.   hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  421.   if (HAL_I2C_Init(&hi2c2) != HAL_OK)
  422.   {
  423.     Error_Handler();
  424.   }
  425.   /* USER CODE BEGIN I2C2_Init 2 */
  426.  
  427.   /* USER CODE END I2C2_Init 2 */
  428.  
  429. }
  430.  
  431. /**
  432.   * @brief IWDG Initialization Function
  433.   * @param None
  434.   * @retval None
  435.   */
  436. static void MX_IWDG_Init(void)
  437. {
  438.  
  439.   /* USER CODE BEGIN IWDG_Init 0 */
  440.  
  441.   /* USER CODE END IWDG_Init 0 */
  442.  
  443.   /* USER CODE BEGIN IWDG_Init 1 */
  444.  
  445.   /* USER CODE END IWDG_Init 1 */
  446.   hiwdg.Instance = IWDG;
  447.   hiwdg.Init.Prescaler = IWDG_PRESCALER_16;
  448.   hiwdg.Init.Reload = 4095;
  449.   if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
  450.   {
  451.     Error_Handler();
  452.   }
  453.   /* USER CODE BEGIN IWDG_Init 2 */
  454.  
  455.   /* USER CODE END IWDG_Init 2 */
  456.  
  457. }
  458.  
  459. /**
  460.   * @brief RTC Initialization Function
  461.   * @param None
  462.   * @retval None
  463.   */
  464. static void MX_RTC_Init(void)
  465. {
  466.  
  467.   /* USER CODE BEGIN RTC_Init 0 */
  468.  
  469.   /* USER CODE END RTC_Init 0 */
  470.  
  471.   RTC_TimeTypeDef sTime = {0};
  472.   RTC_DateTypeDef DateToUpdate = {0};
  473.  
  474.   /* USER CODE BEGIN RTC_Init 1 */
  475.  
  476.   /* USER CODE END RTC_Init 1 */
  477.   /** Initialize RTC Only
  478.   */
  479.   hrtc.Instance = RTC;
  480.   hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
  481.   hrtc.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
  482.   if (HAL_RTC_Init(&hrtc) != HAL_OK)
  483.   {
  484.     Error_Handler();
  485.   }
  486.  
  487.   /* USER CODE BEGIN Check_RTC_BKUP */
  488.  
  489.   /* USER CODE END Check_RTC_BKUP */
  490.  
  491.   /** Initialize RTC and set the Time and Date
  492.   */
  493.   sTime.Hours = 0x0;
  494.   sTime.Minutes = 0x0;
  495.   sTime.Seconds = 0x0;
  496.  
  497.   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
  498.   {
  499.     Error_Handler();
  500.   }
  501.   DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
  502.   DateToUpdate.Month = RTC_MONTH_JANUARY;
  503.   DateToUpdate.Date = 0x1;
  504.   DateToUpdate.Year = 0x0;
  505.  
  506.   if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
  507.   {
  508.     Error_Handler();
  509.   }
  510.   /* USER CODE BEGIN RTC_Init 2 */
  511.  
  512.   /* USER CODE END RTC_Init 2 */
  513.  
  514. }
  515.  
  516. /**
  517.   * @brief SPI1 Initialization Function
  518.   * @param None
  519.   * @retval None
  520.   */
  521. static void MX_SPI1_Init(void)
  522. {
  523.  
  524.   /* USER CODE BEGIN SPI1_Init 0 */
  525.  
  526.   /* USER CODE END SPI1_Init 0 */
  527.  
  528.   /* USER CODE BEGIN SPI1_Init 1 */
  529.  
  530.   /* USER CODE END SPI1_Init 1 */
  531.   /* SPI1 parameter configuration*/
  532.   hspi1.Instance = SPI1;
  533.   hspi1.Init.Mode = SPI_MODE_MASTER;
  534.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  535.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  536.   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  537.   hspi1.Init.CLKPhase = SPI_PHASE_2EDGE;
  538.   hspi1.Init.NSS = SPI_NSS_SOFT;
  539.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  540.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  541.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  542.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  543.   hspi1.Init.CRCPolynomial = 10;
  544.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  545.   {
  546.     Error_Handler();
  547.   }
  548.   /* USER CODE BEGIN SPI1_Init 2 */
  549.  
  550.   /* USER CODE END SPI1_Init 2 */
  551.  
  552. }
  553.  
  554. /**
  555.   * @brief TIM3 Initialization Function
  556.   * @param None
  557.   * @retval None
  558.   */
  559. static void MX_TIM3_Init(void)
  560. {
  561.  
  562.   /* USER CODE BEGIN TIM3_Init 0 */
  563.  
  564.   /* USER CODE END TIM3_Init 0 */
  565.  
  566.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  567.   TIM_OC_InitTypeDef sConfigOC = {0};
  568.  
  569.   /* USER CODE BEGIN TIM3_Init 1 */
  570.  
  571.   /* USER CODE END TIM3_Init 1 */
  572.   htim3.Instance = TIM3;
  573.   htim3.Init.Prescaler = 719;
  574.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  575.   htim3.Init.Period = 10000;
  576.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  577.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  578.   if (HAL_TIM_OC_Init(&htim3) != HAL_OK)
  579.   {
  580.     Error_Handler();
  581.   }
  582.   if (HAL_TIM_OnePulse_Init(&htim3, TIM_OPMODE_SINGLE) != HAL_OK)
  583.   {
  584.     Error_Handler();
  585.   }
  586.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_ENABLE;
  587.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  588.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  589.   {
  590.     Error_Handler();
  591.   }
  592.   sConfigOC.OCMode = TIM_OCMODE_TIMING;
  593.   sConfigOC.Pulse = 9999;
  594.   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
  595.   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
  596.   if (HAL_TIM_OC_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  597.   {
  598.     Error_Handler();
  599.   }
  600.   /* USER CODE BEGIN TIM3_Init 2 */
  601.  
  602.   /* USER CODE END TIM3_Init 2 */
  603.  
  604. }
  605.  
  606. /**
  607.   * @brief TIM4 Initialization Function
  608.   * @param None
  609.   * @retval None
  610.   */
  611. static void MX_TIM4_Init(void)
  612. {
  613.  
  614.   /* USER CODE BEGIN TIM4_Init 0 */
  615.  
  616.   /* USER CODE END TIM4_Init 0 */
  617.  
  618.   TIM_Encoder_InitTypeDef sConfig = {0};
  619.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  620.  
  621.   /* USER CODE BEGIN TIM4_Init 1 */
  622.  
  623.   /* USER CODE END TIM4_Init 1 */
  624.   htim4.Instance = TIM4;
  625.   htim4.Init.Prescaler = 0;
  626.   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  627.   htim4.Init.Period = 65535;
  628.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  629.   htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  630.   sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  631.   sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  632.   sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  633.   sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  634.   sConfig.IC1Filter = 15;
  635.   sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  636.   sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  637.   sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  638.   sConfig.IC2Filter = 15;
  639.   if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
  640.   {
  641.     Error_Handler();
  642.   }
  643.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  644.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  645.   if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  646.   {
  647.     Error_Handler();
  648.   }
  649.   /* USER CODE BEGIN TIM4_Init 2 */
  650.  
  651.   /* USER CODE END TIM4_Init 2 */
  652.  
  653. }
  654.  
  655. /**
  656.   * @brief USART1 Initialization Function
  657.   * @param None
  658.   * @retval None
  659.   */
  660. static void MX_USART1_UART_Init(void)
  661. {
  662.  
  663.   /* USER CODE BEGIN USART1_Init 0 */
  664.  
  665.   /* USER CODE END USART1_Init 0 */
  666.  
  667.   /* USER CODE BEGIN USART1_Init 1 */
  668.  
  669.   /* USER CODE END USART1_Init 1 */
  670.   huart1.Instance = USART1;
  671.   huart1.Init.BaudRate = 9600;
  672.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  673.   huart1.Init.StopBits = UART_STOPBITS_1;
  674.   huart1.Init.Parity = UART_PARITY_NONE;
  675.   huart1.Init.Mode = UART_MODE_TX_RX;
  676.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  677.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  678.   if (HAL_UART_Init(&huart1) != HAL_OK)
  679.   {
  680.     Error_Handler();
  681.   }
  682.   /* USER CODE BEGIN USART1_Init 2 */
  683.  
  684.   /* USER CODE END USART1_Init 2 */
  685.  
  686. }
  687.  
  688. /**
  689.   * @brief GPIO Initialization Function
  690.   * @param None
  691.   * @retval None
  692.   */
  693. static void MX_GPIO_Init(void)
  694. {
  695.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  696.  
  697.   /* GPIO Ports Clock Enable */
  698.   __HAL_RCC_GPIOC_CLK_ENABLE();
  699.   __HAL_RCC_GPIOD_CLK_ENABLE();
  700.   __HAL_RCC_GPIOA_CLK_ENABLE();
  701.   __HAL_RCC_GPIOB_CLK_ENABLE();
  702.  
  703.   /*Configure GPIO pin Output Level */
  704.   HAL_GPIO_WritePin(Green_LED_GPIO_Port, Green_LED_Pin, GPIO_PIN_RESET);
  705.  
  706.   /*Configure GPIO pin Output Level */
  707.   HAL_GPIO_WritePin(GPIOA, SPI_CD_Pin|SPI_RESET_Pin|SPI_NSS1_Pin, GPIO_PIN_RESET);
  708.  
  709.   /*Configure GPIO pin Output Level */
  710.   HAL_GPIO_WritePin(I2C1_BusPower_GPIO_Port, I2C1_BusPower_Pin, GPIO_PIN_SET);
  711.  
  712.   /*Configure GPIO pin Output Level */
  713.   HAL_GPIO_WritePin(USB_PULLUP_GPIO_Port, USB_PULLUP_Pin, GPIO_PIN_RESET);
  714.  
  715.   /*Configure GPIO pin : Green_LED_Pin */
  716.   GPIO_InitStruct.Pin = Green_LED_Pin;
  717.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  718.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  719.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  720.   HAL_GPIO_Init(Green_LED_GPIO_Port, &GPIO_InitStruct);
  721.  
  722.   /*Configure GPIO pins : SPI_CD_Pin SPI_RESET_Pin SPI_NSS1_Pin */
  723.   GPIO_InitStruct.Pin = SPI_CD_Pin|SPI_RESET_Pin|SPI_NSS1_Pin;
  724.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  725.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  726.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  727.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  728.  
  729.   /*Configure GPIO pin : I2C1_BusPower_Pin */
  730.   GPIO_InitStruct.Pin = I2C1_BusPower_Pin;
  731.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  732.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  733.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  734.   HAL_GPIO_Init(I2C1_BusPower_GPIO_Port, &GPIO_InitStruct);
  735.  
  736.   /*Configure GPIO pin : USB_PULLUP_Pin */
  737.   GPIO_InitStruct.Pin = USB_PULLUP_Pin;
  738.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  739.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  740.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  741.   HAL_GPIO_Init(USB_PULLUP_GPIO_Port, &GPIO_InitStruct);
  742.  
  743.   /*Configure GPIO pin : encoder_push_Pin */
  744.   GPIO_InitStruct.Pin = encoder_push_Pin;
  745.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  746.   GPIO_InitStruct.Pull = GPIO_PULLUP;
  747.   HAL_GPIO_Init(encoder_push_GPIO_Port, &GPIO_InitStruct);
  748.  
  749. }
  750.  
  751. /* USER CODE BEGIN 4 */
  752.  
  753. /* USER CODE END 4 */
  754.  
  755. /**
  756.   * @brief  This function is executed in case of error occurrence.
  757.   * @retval None
  758.   */
  759. void Error_Handler(void)
  760. {
  761.   /* USER CODE BEGIN Error_Handler_Debug */
  762.   /* User can add his own implementation to report the HAL error return state */
  763.  
  764.   /* USER CODE END Error_Handler_Debug */
  765. }
  766.  
  767. #ifdef  USE_FULL_ASSERT
  768. /**
  769.   * @brief  Reports the name of the source file and the source line number
  770.   *         where the assert_param error has occurred.
  771.   * @param  file: pointer to the source file name
  772.   * @param  line: assert_param error line source number
  773.   * @retval None
  774.   */
  775. void assert_failed(uint8_t *file, uint32_t line)
  776. {
  777.   /* USER CODE BEGIN 6 */
  778.   /* User can add his own implementation to report the file name and line number,
  779.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  780.   /* USER CODE END 6 */
  781. }
  782. #endif /* USE_FULL_ASSERT */
  783.  
  784. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  785.