Subversion Repositories dashGPS

Rev

Rev 5 | 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.  
  23. /* Private includes ----------------------------------------------------------*/
  24. /* USER CODE BEGIN Includes */
  25. #include "libSerial/serial.h"
  26. #include "nmea.h"
  27. /* USER CODE END Includes */
  28.  
  29. /* Private typedef -----------------------------------------------------------*/
  30. /* USER CODE BEGIN PTD */
  31.  
  32. /* USER CODE END PTD */
  33.  
  34. /* Private define ------------------------------------------------------------*/
  35. /* USER CODE BEGIN PD */
  36. /* USER CODE END PD */
  37.  
  38. /* Private macro -------------------------------------------------------------*/
  39. /* USER CODE BEGIN PM */
  40.  
  41. /* USER CODE END PM */
  42.  
  43. /* Private variables ---------------------------------------------------------*/
  44. CAN_HandleTypeDef hcan;
  45.  
  46. SPI_HandleTypeDef hspi1;
  47.  
  48. TIM_HandleTypeDef htim4;
  49.  
  50. UART_HandleTypeDef huart1;
  51.  
  52. /* USER CODE BEGIN PV */
  53.  
  54. /* USER CODE END PV */
  55.  
  56. /* Private function prototypes -----------------------------------------------*/
  57. void SystemClock_Config(void);
  58. static void MX_GPIO_Init(void);
  59. static void MX_CAN_Init(void);
  60. static void MX_SPI1_Init(void);
  61. static void MX_TIM4_Init(void);
  62. static void MX_USART1_UART_Init(void);
  63. /* USER CODE BEGIN PFP */
  64.  
  65. /* USER CODE END PFP */
  66.  
  67. /* Private user code ---------------------------------------------------------*/
  68. /* USER CODE BEGIN 0 */
  69.  
  70. /* USER CODE END 0 */
  71.  
  72. /**
  73.   * @brief  The application entry point.
  74.   * @retval int
  75.   */
  76. int main(void)
  77. {
  78.   /* USER CODE BEGIN 1 */
  79.  
  80.   /* USER CODE END 1 */
  81.  
  82.   /* MCU Configuration--------------------------------------------------------*/
  83.  
  84.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  85.   HAL_Init();
  86.  
  87.   /* USER CODE BEGIN Init */
  88.  
  89.   /* USER CODE END Init */
  90.  
  91.   /* Configure the system clock */
  92.   SystemClock_Config();
  93.  
  94.   /* USER CODE BEGIN SysInit */
  95.  
  96.   /* USER CODE END SysInit */
  97.  
  98.   /* Initialize all configured peripherals */
  99.   MX_GPIO_Init();
  100.   MX_CAN_Init();
  101.   MX_SPI1_Init();
  102.   MX_TIM4_Init();
  103.   MX_USART1_UART_Init();
  104.   /* USER CODE BEGIN 2 */
  105.   __HAL_RCC_USART1_CLK_ENABLE();
  106.   /* setup the USART control blocks */
  107.   init_usart_ctl(&uc1, huart1.Instance);
  108.  
  109.   EnableSerialRxInterrupt (&uc1);
  110.  
  111.   /* USER CODE END 2 */
  112.  
  113.   /* Infinite loop */
  114.   /* USER CODE BEGIN WHILE */
  115.   while (1)
  116.     {
  117.  
  118.          Location loc;
  119.          uint8_t stat = updateLocation(&loc);
  120.  
  121.  
  122.     /* USER CODE END WHILE */
  123.  
  124.     /* USER CODE BEGIN 3 */
  125.     }
  126.   /* USER CODE END 3 */
  127. }
  128.  
  129. /**
  130.   * @brief System Clock Configuration
  131.   * @retval None
  132.   */
  133. void SystemClock_Config(void)
  134. {
  135.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  136.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  137.  
  138.   /** Initializes the RCC Oscillators according to the specified parameters
  139.   * in the RCC_OscInitTypeDef structure.
  140.   */
  141.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  142.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  143.   RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  144.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  145.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  146.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  147.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
  148.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  149.   {
  150.     Error_Handler();
  151.   }
  152.   /** Initializes the CPU, AHB and APB buses clocks
  153.   */
  154.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  155.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  156.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  157.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  158.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  159.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  160.  
  161.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  162.   {
  163.     Error_Handler();
  164.   }
  165. }
  166.  
  167. /**
  168.   * @brief CAN Initialization Function
  169.   * @param None
  170.   * @retval None
  171.   */
  172. static void MX_CAN_Init(void)
  173. {
  174.  
  175.   /* USER CODE BEGIN CAN_Init 0 */
  176.  
  177.   /* USER CODE END CAN_Init 0 */
  178.  
  179.   /* USER CODE BEGIN CAN_Init 1 */
  180.  
  181.   /* USER CODE END CAN_Init 1 */
  182.   hcan.Instance = CAN1;
  183.   hcan.Init.Prescaler = 16;
  184.   hcan.Init.Mode = CAN_MODE_NORMAL;
  185.   hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
  186.   hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
  187.   hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
  188.   hcan.Init.TimeTriggeredMode = DISABLE;
  189.   hcan.Init.AutoBusOff = DISABLE;
  190.   hcan.Init.AutoWakeUp = DISABLE;
  191.   hcan.Init.AutoRetransmission = DISABLE;
  192.   hcan.Init.ReceiveFifoLocked = DISABLE;
  193.   hcan.Init.TransmitFifoPriority = DISABLE;
  194.   if (HAL_CAN_Init(&hcan) != HAL_OK)
  195.   {
  196.     Error_Handler();
  197.   }
  198.   /* USER CODE BEGIN CAN_Init 2 */
  199.  
  200.   /* USER CODE END CAN_Init 2 */
  201.  
  202. }
  203.  
  204. /**
  205.   * @brief SPI1 Initialization Function
  206.   * @param None
  207.   * @retval None
  208.   */
  209. static void MX_SPI1_Init(void)
  210. {
  211.  
  212.   /* USER CODE BEGIN SPI1_Init 0 */
  213.  
  214.   /* USER CODE END SPI1_Init 0 */
  215.  
  216.   /* USER CODE BEGIN SPI1_Init 1 */
  217.  
  218.   /* USER CODE END SPI1_Init 1 */
  219.   /* SPI1 parameter configuration*/
  220.   hspi1.Instance = SPI1;
  221.   hspi1.Init.Mode = SPI_MODE_MASTER;
  222.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  223.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  224.   hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  225.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  226.   hspi1.Init.NSS = SPI_NSS_SOFT;
  227.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
  228.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  229.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  230.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  231.   hspi1.Init.CRCPolynomial = 10;
  232.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  233.   {
  234.     Error_Handler();
  235.   }
  236.   /* USER CODE BEGIN SPI1_Init 2 */
  237.  
  238.   /* USER CODE END SPI1_Init 2 */
  239.  
  240. }
  241.  
  242. /**
  243.   * @brief TIM4 Initialization Function
  244.   * @param None
  245.   * @retval None
  246.   */
  247. static void MX_TIM4_Init(void)
  248. {
  249.  
  250.   /* USER CODE BEGIN TIM4_Init 0 */
  251.  
  252.   /* USER CODE END TIM4_Init 0 */
  253.  
  254.   TIM_Encoder_InitTypeDef sConfig = {0};
  255.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  256.  
  257.   /* USER CODE BEGIN TIM4_Init 1 */
  258.  
  259.   /* USER CODE END TIM4_Init 1 */
  260.   htim4.Instance = TIM4;
  261.   htim4.Init.Prescaler = 0;
  262.   htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
  263.   htim4.Init.Period = 65535;
  264.   htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  265.   htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  266.   sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  267.   sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  268.   sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  269.   sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  270.   sConfig.IC1Filter = 8;
  271.   sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  272.   sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  273.   sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  274.   sConfig.IC2Filter = 8;
  275.   if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
  276.   {
  277.     Error_Handler();
  278.   }
  279.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  280.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  281.   if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
  282.   {
  283.     Error_Handler();
  284.   }
  285.   /* USER CODE BEGIN TIM4_Init 2 */
  286.  
  287.   /* USER CODE END TIM4_Init 2 */
  288.  
  289. }
  290.  
  291. /**
  292.   * @brief USART1 Initialization Function
  293.   * @param None
  294.   * @retval None
  295.   */
  296. static void MX_USART1_UART_Init(void)
  297. {
  298.  
  299.   /* USER CODE BEGIN USART1_Init 0 */
  300.  
  301.   /* USER CODE END USART1_Init 0 */
  302.  
  303.   /* USER CODE BEGIN USART1_Init 1 */
  304.  
  305.   /* USER CODE END USART1_Init 1 */
  306.   huart1.Instance = USART1;
  307.   huart1.Init.BaudRate = 115200;
  308.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  309.   huart1.Init.StopBits = UART_STOPBITS_1;
  310.   huart1.Init.Parity = UART_PARITY_NONE;
  311.   huart1.Init.Mode = UART_MODE_TX_RX;
  312.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  313.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  314.   if (HAL_UART_Init(&huart1) != HAL_OK)
  315.   {
  316.     Error_Handler();
  317.   }
  318.   /* USER CODE BEGIN USART1_Init 2 */
  319.  
  320.   /* USER CODE END USART1_Init 2 */
  321.  
  322. }
  323.  
  324. /**
  325.   * @brief GPIO Initialization Function
  326.   * @param None
  327.   * @retval None
  328.   */
  329. static void MX_GPIO_Init(void)
  330. {
  331.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  332.  
  333.   /* GPIO Ports Clock Enable */
  334.   __HAL_RCC_GPIOD_CLK_ENABLE();
  335.   __HAL_RCC_GPIOA_CLK_ENABLE();
  336.   __HAL_RCC_GPIOC_CLK_ENABLE();
  337.   __HAL_RCC_GPIOB_CLK_ENABLE();
  338.  
  339.   /*Configure GPIO pin Output Level */
  340.   HAL_GPIO_WritePin(GPIOA, SPI_NSS1_Pin|SPI_CD_Pin, GPIO_PIN_RESET);
  341.  
  342.   /*Configure GPIO pin Output Level */
  343.   HAL_GPIO_WritePin(SPI_RESET_GPIO_Port, SPI_RESET_Pin, GPIO_PIN_RESET);
  344.  
  345.   /*Configure GPIO pins : SPI_NSS1_Pin SPI_CD_Pin */
  346.   GPIO_InitStruct.Pin = SPI_NSS1_Pin|SPI_CD_Pin;
  347.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  348.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  349.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  350.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  351.  
  352.   /*Configure GPIO pin : SPI_RESET_Pin */
  353.   GPIO_InitStruct.Pin = SPI_RESET_Pin;
  354.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  355.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  356.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  357.   HAL_GPIO_Init(SPI_RESET_GPIO_Port, &GPIO_InitStruct);
  358.  
  359. }
  360.  
  361. /* USER CODE BEGIN 4 */
  362.  
  363. /* USER CODE END 4 */
  364.  
  365. /**
  366.   * @brief  This function is executed in case of error occurrence.
  367.   * @retval None
  368.   */
  369. void Error_Handler(void)
  370. {
  371.   /* USER CODE BEGIN Error_Handler_Debug */
  372.   /* User can add his own implementation to report the HAL error return state */
  373.  
  374.   /* USER CODE END Error_Handler_Debug */
  375. }
  376.  
  377. #ifdef  USE_FULL_ASSERT
  378. /**
  379.   * @brief  Reports the name of the source file and the source line number
  380.   *         where the assert_param error has occurred.
  381.   * @param  file: pointer to the source file name
  382.   * @param  line: assert_param error line source number
  383.   * @retval None
  384.   */
  385. void assert_failed(uint8_t *file, uint32_t line)
  386. {
  387.   /* USER CODE BEGIN 6 */
  388.   /* User can add his own implementation to report the file name and line number,
  389.      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  390.   /* USER CODE END 6 */
  391. }
  392. #endif /* USE_FULL_ASSERT */
  393.  
  394. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  395.