Subversion Repositories dashGPS

Rev

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