Subversion Repositories DashDisplay

Rev

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

  1. /**
  2.   ******************************************************************************
  3.   * File Name          : main.c
  4.   * Description        : Main program body
  5.   ******************************************************************************
  6.   *
  7.   * COPYRIGHT(c) 2017 STMicroelectronics
  8.   *
  9.   * Redistribution and use in source and binary forms, with or without modification,
  10.   * are permitted provided that the following conditions are met:
  11.   *   1. Redistributions of source code must retain the above copyright notice,
  12.   *      this list of conditions and the following disclaimer.
  13.   *   2. Redistributions in binary form must reproduce the above copyright notice,
  14.   *      this list of conditions and the following disclaimer in the documentation
  15.   *      and/or other materials provided with the distribution.
  16.   *   3. Neither the name of STMicroelectronics nor the names of its contributors
  17.   *      may be used to endorse or promote products derived from this software
  18.   *      without specific prior written permission.
  19.   *
  20.   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  21.   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  22.   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  23.   * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
  24.   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  25.   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  26.   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  27.   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  28.   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  29.   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  30.   *
  31.   ******************************************************************************
  32.   */
  33. /* Includes ------------------------------------------------------------------*/
  34. #include "stm32l1xx_hal.h"
  35.  
  36. /* USER CODE BEGIN Includes */
  37. #include "ap_math.h"
  38. #include "serial.h"
  39. #include "SSD1306.h"
  40. #include "Font.h"
  41. #include "dials.h"
  42. #include "switches.h"
  43. #include <math.h>
  44. #include "plx.h"
  45. #include "displayinfo.h"
  46. #include "small_printf.h"
  47. #include "nvram.h"
  48.  
  49. /* USER CODE END Includes */
  50.  
  51. /* Private variables ---------------------------------------------------------*/
  52. SPI_HandleTypeDef hspi1;
  53.  
  54. UART_HandleTypeDef huart1;
  55. UART_HandleTypeDef huart2;
  56. UART_HandleTypeDef huart3;
  57.  
  58. /* USER CODE BEGIN PV */
  59. /* Private variables ---------------------------------------------------------*/
  60. #define MAXRDG 32
  61.  
  62. /* timeout when the ignition is switched off */
  63. #define IGNITION_OFF_TIMEOUT 30000UL
  64.  
  65. int OldObservation[2] =
  66. { -1, -1 }; // illegal initial value
  67. int OldObservationIndex[2] =
  68. { -1, -1 }; // if more than one sensor this will be printed
  69. int16_t dial0[2] =
  70. { 0, 0 };
  71. int16_t dial1[2] =
  72. { -1, -1 };
  73.  
  74. uint16_t dial_timer[2] =
  75. { 0, 0 };
  76.  
  77. static const int DialTimeout = 50; // about 20 seconds after twiddle, save the dial position.
  78.  
  79. uint16_t dial_nvram[2] __attribute__((section(".NVRAM_Data")));
  80.  
  81. union
  82. {
  83.         PLX_SensorInfo Sensor[MAXRDG];
  84.         char Bytes[MAXRDG * sizeof(PLX_SensorInfo)];
  85. } Data;
  86. int Max[MAXRDG];
  87. int Min[MAXRDG];
  88. int PLXItems;
  89.  
  90. uint32_t Latch_Timer = IGNITION_OFF_TIMEOUT;
  91.  
  92. /* USER CODE END PV */
  93.  
  94. /* Private function prototypes -----------------------------------------------*/
  95. void SystemClock_Config(void);
  96. void Error_Handler(void);
  97. static void MX_GPIO_Init(void);
  98. static void MX_SPI1_Init(void);
  99. static void MX_USART1_UART_Init(void);
  100. static void MX_USART2_UART_Init(void);
  101. static void MX_USART3_UART_Init(void);
  102.  
  103. /* USER CODE BEGIN PFP */
  104. /* Private function prototypes -----------------------------------------------*/
  105.  
  106. /* USER CODE END PFP */
  107.  
  108. /* USER CODE BEGIN 0 */
  109. /* dummy function */
  110. void _init(void)
  111. {
  112.  
  113. }
  114. // the dial is the switch number we are using.
  115. // suppress is the ItemIndex we wish to suppress on this display
  116. int DisplayCurrent(int dial, int suppress)
  117. {
  118.         char buff[10];
  119.         int i;
  120.         int rc;
  121.         select_display(dial); // pick the display we are using
  122.         int ItemIndex = dial_pos[dial] / 4;
  123.  
  124.         // wrap around count if dial too far to the right
  125.         if (ItemIndex >= PLXItems)
  126.         {
  127.                 dial_pos[dial] = 0;
  128.                 ItemIndex = 0;
  129.         }
  130.         if (ItemIndex < 0)
  131.         {
  132.                 ItemIndex = PLXItems - 1;
  133.                 dial_pos[dial] = (PLXItems - 1) * 4;
  134.         }
  135.  
  136.         // check for item suppression
  137.         if (ItemIndex == suppress)
  138.         {
  139.                 dial1[dial] = -1;
  140.                 OldObservation[dial] = -1;
  141.                 OldObservationIndex[dial] = -1;
  142.  
  143.                 clearDisplay();
  144.                 display();
  145.                 return -1; // we suppressed this display
  146.         }
  147.         // do not try to convert if no items in buffer
  148.         if (PLXItems > 0)
  149.         {
  150.                 int DataVal = ConvPLX(Data.Sensor[ItemIndex].ReadingH,
  151.                                 Data.Sensor[ItemIndex].ReadingL); // data reading
  152.                 int Observation = ConvPLX(Data.Sensor[ItemIndex].AddrH,
  153.                                 Data.Sensor[ItemIndex].AddrL);
  154.                 int ObservationIndex = ConvPLX(0, Data.Sensor[ItemIndex].Instance);
  155.                 // now to convert the readings and format strings
  156.                 // find out limits
  157.                 char * msg;
  158.                 int len;
  159.  
  160.                 // if the user presses the dial then reset min/max to current value
  161.                 if (push_pos[dial] == 1)
  162.                 {
  163.                         Max[ItemIndex] = DataVal;
  164.                         Min[ItemIndex] = DataVal; // 12 bit max value
  165.                 }
  166.  
  167.                 if (Observation < PLX_MAX_OBS)
  168.                 {
  169.                         if (Observation != OldObservation[dial]
  170.                                         || ObservationIndex != OldObservationIndex[dial])
  171.                         {
  172.  
  173.                                 dial_timer[dial] = DialTimeout;
  174.  
  175.                                 dial1[dial] = -1;
  176.                                 clearDisplay();
  177.                                 dial_draw_scale(DisplayInfo[Observation].Low,
  178.                                                 DisplayInfo[Observation].High, 12, 1,
  179.                                                 DisplayInfo[Observation].TickScale);
  180.  
  181.                                 msg = DisplayInfo[Observation].name;
  182.                                 len = 7;
  183.                                 int len1 = ObservationIndex > 0 ? len - 1 : len;
  184.                                 for (i = 0; i < len1 && msg[i]; i++)
  185.                                 {
  186.                                         buff[i] = msg[i];
  187.                                 }
  188.                                 if (ObservationIndex > 0 && i < len)
  189.                                 {
  190.                                         buff[i++] = ObservationIndex + '1';
  191.                                 }
  192.  
  193.                                 print_large_string(buff, 64 - i * 4, 48, i); // this prints spaces for \0 at end of string
  194.  
  195.                                 // print suffix if present.
  196.                                 font_gotoxy(15, 4);
  197.                                 int i = 0;
  198.                                 while (DisplayInfo[Observation].suffix[i])
  199.                                 {
  200.                                         font_putchar(DisplayInfo[Observation].suffix[i++]);
  201.                                 }
  202.  
  203.                                 OldObservation[dial] = Observation;
  204.                                 OldObservationIndex[dial] = ObservationIndex;
  205.                                 //
  206.                                 display();
  207.  
  208.                         }
  209.                         else
  210.                         {
  211.                                 // check for timer timeout on consistent timer
  212.                                 if (dial_timer[dial])
  213.                                 {
  214.                                         dial_timer[dial]--;
  215.  
  216.                                         if (dial_timer[dial] == 0)
  217.                                         {
  218.                                                 uint16_t curr_val = dial_pos[dial];
  219.  
  220.                                                 uint8_t * ptr = (uint8_t *) (&dial_nvram[dial]);
  221.                                                 WriteNVRAM(ptr, curr_val & 0xFF);
  222.                                                 WriteNVRAM(ptr + 1, curr_val >> 8);
  223.  
  224.                                         }
  225.                                 }
  226.                         }
  227.  
  228.                 }
  229.  
  230.                 double max_rdg;
  231.                 double min_rdg;
  232.                 double cur_rdg;
  233.                 int int_rdg;
  234.                 int int_max;
  235.                 int int_min;
  236.  
  237.                 max_rdg = ConveriMFDRaw2Data(Observation,
  238.                                 DisplayInfo[Observation].Units, Max[ItemIndex]);
  239.                 min_rdg = ConveriMFDRaw2Data(Observation,
  240.                                 DisplayInfo[Observation].Units, Min[ItemIndex]);
  241.                 cur_rdg = ConveriMFDRaw2Data(Observation,
  242.                                 DisplayInfo[Observation].Units, DataVal);
  243.  
  244.                 int dp_pos;  // where to print the decimal place
  245.                 float scale = 1.0;
  246.                 switch (DisplayInfo[Observation].DP)
  247.                 {
  248.                 case 0:
  249.                         scale = 1.0;
  250.                         dp_pos = 100;
  251.                         break;
  252.                 case 1:
  253.                         scale = 10.0;
  254.                         dp_pos = 1;
  255.                         break;
  256.                 case 2:
  257.                         scale = 100.0;
  258.                         dp_pos = 2;
  259.                         break;
  260.                 }
  261.                 int_rdg = (int) (cur_rdg * scale);
  262.                 int_max = (int) (max_rdg * scale);
  263.                 int_min = (int) (min_rdg * scale);
  264.  
  265.                 cur_rdg -= DisplayInfo[Observation].Low;
  266.                 cur_rdg =
  267.                                 100 * cur_rdg
  268.                                                 / (DisplayInfo[Observation].High
  269.                                                                 - DisplayInfo[Observation].Low);
  270.  
  271.                 dial0[dial] = (int) cur_rdg;
  272.  
  273.                 /* old needle un-draw */
  274.                 if (dial1[dial] >= 0)
  275.                 {
  276.                         dial_draw_needle(dial1[dial]);
  277.                 }
  278.                 dial_draw_needle(dial0[dial]);
  279.                 // print value overlaid by needle
  280.                 // this is actual reading
  281.                 print_digits(30, 30, 5, dp_pos, int_rdg);
  282.                 font_gotoxy(0, 0);
  283.                 font_digits(5, dp_pos, int_min);
  284.  
  285.                 font_gotoxy(0, 1);
  286.                 font_puts("Min");
  287.  
  288.                 font_gotoxy(15, 0);
  289.                 font_digits(5, dp_pos, int_max);
  290.                 font_gotoxy(18, 1);
  291.                 font_puts("Max");
  292.  
  293.                 dial1[dial] = dial0[dial];
  294.  
  295.                 display();
  296.  
  297.         }
  298. return ItemIndex;
  299. }
  300. /* USER CODE END 0 */
  301.  
  302. int main(void)
  303. {
  304.  
  305.   /* USER CODE BEGIN 1 */
  306.  
  307. GPIO_InitTypeDef GPIO_InitStruct;
  308.  
  309. __HAL_RCC_SPI1_CLK_ENABLE()
  310. ;
  311. __HAL_RCC_USART1_CLK_ENABLE()
  312. ; // PLX main port
  313. __HAL_RCC_USART2_CLK_ENABLE()
  314. ; // debug port
  315. __HAL_RCC_USART3_CLK_ENABLE ()
  316. ; // Bluetooth port
  317.  
  318.   /* USER CODE END 1 */
  319.  
  320.   /* MCU Configuration----------------------------------------------------------*/
  321.  
  322.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  323.   HAL_Init();
  324.  
  325.   /* Configure the system clock */
  326.   SystemClock_Config();
  327.  
  328.   /* Initialize all configured peripherals */
  329.   MX_GPIO_Init();
  330.   MX_SPI1_Init();
  331.   MX_USART1_UART_Init();
  332.   MX_USART2_UART_Init();
  333.   MX_USART3_UART_Init();
  334.  
  335.   /* USER CODE BEGIN 2 */
  336.  
  337. /* Turn on USART1 IRQ */
  338. HAL_NVIC_SetPriority(USART1_IRQn, 2, 0);
  339. HAL_NVIC_EnableIRQ(USART1_IRQn);
  340.  
  341. /* Turn on USART2 IRQ  */
  342. HAL_NVIC_SetPriority(USART2_IRQn, 4, 0);
  343. HAL_NVIC_EnableIRQ(USART2_IRQn);
  344.  
  345. /* turn on USART3 IRQ */
  346. HAL_NVIC_SetPriority(USART3_IRQn, 4, 0);
  347. HAL_NVIC_EnableIRQ(USART3_IRQn);
  348.  
  349. /* setup the USART control blocks */
  350. init_usart_ctl(&uc1, huart1.Instance);
  351. init_usart_ctl(&uc2, huart2.Instance);
  352. init_usart_ctl(&uc3, huart3.Instance);
  353.  
  354. EnableSerialRxInterrupt(&uc1);
  355. EnableSerialRxInterrupt(&uc2);
  356. EnableSerialRxInterrupt(&uc3);
  357.  
  358.  
  359. InitSwitches();
  360.  
  361. int i;
  362. uint16_t rc;
  363. for (i = 0; i < 2; i++)
  364. {
  365.         dial_pos[i] = dial_nvram[i];
  366. }
  367.  
  368. ap_init(); // set up the approximate math library
  369.  
  370. int disp;
  371.  
  372. ssd1306_begin(1, 0);
  373. dial_origin(64, 60);
  374. dial_size(60);
  375.  
  376. /* reset the display timeout, latch on power from accessories */
  377. Latch_Timer = IGNITION_OFF_TIMEOUT;
  378. HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin, GPIO_PIN_RESET);
  379.  
  380. for (disp = 0; disp < 2; disp++)
  381. {
  382.         select_display(disp);
  383.         clearDisplay();
  384.         dim(0);
  385.         //font_puts(
  386.         //              "Hello world !!\rThis text is a test of the text rendering library in a 5*7 font");
  387.  
  388.         dial_draw_scale(0, 10, 12, 5, 1);
  389.         char buffer[] = "Display  ";
  390.         buffer[8] = disp + '1';
  391.         print_large_string(buffer, 20, 30, 9);
  392.  
  393.         display();
  394.  
  395. }
  396.  
  397.   /* USER CODE END 2 */
  398.  
  399.   /* Infinite loop */
  400.   /* USER CODE BEGIN WHILE */
  401. uint32_t Ticks = HAL_GetTick() + 100;
  402.  
  403. /* while ignition is on, keep resetting power latch timer */
  404. if (HAL_GPIO_ReadPin(IGNITION_GPIO_Port, IGNITION_Pin) == GPIO_PIN_RESET)
  405. {
  406.         Latch_Timer = HAL_GetTick() + IGNITION_OFF_TIMEOUT;
  407. }
  408. else
  409. {
  410.         /* if the ignition has been off for a while, then turn off power */
  411.         if (HAL_GetTick() > Latch_Timer)
  412.         {
  413.                 HAL_GPIO_WritePin(POWER_LATCH_GPIO_Port, POWER_LATCH_Pin,
  414.                                 GPIO_PIN_RESET);
  415.         }
  416. }
  417.  
  418. uint32_t timeout = 0;  //
  419. // PLX decoder protocols
  420. char PLXPacket = 0;
  421. for (i = 0; i < MAXRDG; i++)
  422. {
  423.         Max[i] = 0;
  424.         Min[i] = 0xFFF; // 12 bit max value
  425. }
  426.  
  427. int PLXPtr = 0;
  428.  
  429. while (1)
  430. {
  431. // poll switche
  432.         HandleSwitches();
  433. // Handle the bluetooth pairing function by pressing both buttons.
  434.         if ((push_pos[0] == 1) && (push_pos[1] == 1))
  435.         {
  436.                 HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_SET);
  437.         }
  438.         else
  439.         {
  440.                 HAL_GPIO_WritePin(BT_BUTTON_GPIO_Port, BT_BUTTON_Pin, GPIO_PIN_RESET);
  441.  
  442.         }
  443.  
  444.         uint16_t cc = SerialCharsReceived(&uc1);
  445.         int chr;
  446.         if (cc == 0)
  447.         {
  448.                 timeout++;
  449.                 if (timeout % 1000 == 0)
  450.                 {
  451.                         PutCharSerial(&uc3, '+');
  452.                 }
  453.                 if (timeout > 60000)
  454.                 {
  455.                         // do turn off screen
  456.                 }
  457.  
  458.         }
  459.         for (chr = 0; chr < cc; chr++)
  460.         {
  461.                 char c = GetCharSerial(&uc1);
  462.                 timeout = 0;
  463.  
  464.                 if (c == PLX_Start) // at any time if the start byte appears, reset the pointers
  465.                 {
  466.                         PLXPtr = 0;    // reset the pointer
  467.                         PLXPacket = 1;
  468.                 }
  469.                 else if (c == PLX_Stop)
  470.                 {
  471.                         if (PLXPacket)
  472.                         {
  473.                                 // we can now decode the selected parameter
  474.                                 PLXItems = PLXPtr / sizeof(PLX_SensorInfo); // total
  475.                                 // saturate the rotary switch position
  476.  
  477.                                 int DataVal;
  478.                                 // process min/max
  479.                                 for (i = 0; i < PLXItems; i++)
  480.                                 {
  481.                                         // Send item to BT
  482.                                         uint16_t addr = ConvPLX(Data.Sensor[i].AddrH,
  483.                                                         Data.Sensor[i].AddrL);
  484.                                         uint8_t inst = Data.Sensor[i].Instance;
  485.                                         uint16_t reading = ConvPLX(Data.Sensor[i].ReadingH,
  486.                                                         Data.Sensor[i].ReadingL);
  487.  
  488.                                         char outbuff[100];
  489.                                         int cnt = small_sprintf(outbuff, "%d,%d,%d\n", addr, inst,
  490.                                                         reading);
  491.                                         int i;
  492.                                         for (i = 0; i < cnt; i++)
  493.  
  494.                                         {
  495.                                                 PutCharSerial(&uc3, outbuff[i]);
  496.                                         }
  497.                                         DataVal = ConvPLX(Data.Sensor[i].ReadingH,
  498.                                                         Data.Sensor[i].ReadingL);
  499.                                         if (DataVal > Max[i])
  500.                                         {
  501.                                                 Max[i] = DataVal;
  502.                                         }
  503.                                         if (DataVal < Min[i])
  504.                                         {
  505.                                                 Min[i] = DataVal;
  506.                                         }
  507.                                 }
  508.  
  509.                                 // now to display the information
  510.                                 int suppress = DisplayCurrent(0, -1);
  511.                                 DisplayCurrent(1, suppress);
  512.                         }
  513.                         PLXPtr = 0;
  514.                         PLXPacket = 0;
  515.                 }
  516.                 else if (c > PLX_Stop) // illegal char, restart reading
  517.                 {
  518.                         PLXPacket = 0;
  519.                         PLXPtr = 0;
  520.                 }
  521.                 else if (PLXPtr < sizeof(Data.Bytes))
  522.                 {
  523.                         Data.Bytes[PLXPtr++] = c;
  524.                 }
  525.         }
  526.  
  527.         HAL_Delay(1);
  528. }
  529.   /* USER CODE END WHILE */
  530.  
  531.   /* USER CODE BEGIN 3 */
  532.  
  533.   /* USER CODE END 3 */
  534.  
  535. }
  536.  
  537. /** System Clock Configuration
  538. */
  539. void SystemClock_Config(void)
  540. {
  541.  
  542.   RCC_OscInitTypeDef RCC_OscInitStruct;
  543.   RCC_ClkInitTypeDef RCC_ClkInitStruct;
  544.  
  545.   __HAL_RCC_PWR_CLK_ENABLE();
  546.  
  547.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  548.  
  549.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  550.   RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  551.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  552.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  553.   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL12;
  554.   RCC_OscInitStruct.PLL.PLLDIV = RCC_PLL_DIV3;
  555.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  556.   {
  557.     Error_Handler();
  558.   }
  559.  
  560.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  561.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  562.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  563.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  564.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  565.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  566.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  567.   {
  568.     Error_Handler();
  569.   }
  570.  
  571.   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
  572.  
  573.   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
  574.  
  575.   /* SysTick_IRQn interrupt configuration */
  576.   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
  577. }
  578.  
  579. /* SPI1 init function */
  580. static void MX_SPI1_Init(void)
  581. {
  582.  
  583.   hspi1.Instance = SPI1;
  584.   hspi1.Init.Mode = SPI_MODE_MASTER;
  585.   hspi1.Init.Direction = SPI_DIRECTION_1LINE;
  586.   hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  587.   hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH;
  588.   hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  589.   hspi1.Init.NSS = SPI_NSS_SOFT;
  590.   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  591.   hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  592.   hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  593.   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  594.   hspi1.Init.CRCPolynomial = 10;
  595.   if (HAL_SPI_Init(&hspi1) != HAL_OK)
  596.   {
  597.     Error_Handler();
  598.   }
  599.  
  600. }
  601.  
  602. /* USART1 init function */
  603. static void MX_USART1_UART_Init(void)
  604. {
  605.  
  606.   huart1.Instance = USART1;
  607.   huart1.Init.BaudRate = 19200;
  608.   huart1.Init.WordLength = UART_WORDLENGTH_8B;
  609.   huart1.Init.StopBits = UART_STOPBITS_1;
  610.   huart1.Init.Parity = UART_PARITY_NONE;
  611.   huart1.Init.Mode = UART_MODE_TX_RX;
  612.   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  613.   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  614.   if (HAL_UART_Init(&huart1) != HAL_OK)
  615.   {
  616.     Error_Handler();
  617.   }
  618.  
  619. }
  620.  
  621. /* USART2 init function */
  622. static void MX_USART2_UART_Init(void)
  623. {
  624.  
  625.   huart2.Instance = USART2;
  626.   huart2.Init.BaudRate = 115200;
  627.   huart2.Init.WordLength = UART_WORDLENGTH_8B;
  628.   huart2.Init.StopBits = UART_STOPBITS_1;
  629.   huart2.Init.Parity = UART_PARITY_NONE;
  630.   huart2.Init.Mode = UART_MODE_TX_RX;
  631.   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  632.   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
  633.   if (HAL_UART_Init(&huart2) != HAL_OK)
  634.   {
  635.     Error_Handler();
  636.   }
  637.  
  638. }
  639.  
  640. /* USART3 init function */
  641. static void MX_USART3_UART_Init(void)
  642. {
  643.  
  644.   huart3.Instance = USART3;
  645.   huart3.Init.BaudRate = 19200;
  646.   huart3.Init.WordLength = UART_WORDLENGTH_8B;
  647.   huart3.Init.StopBits = UART_STOPBITS_1;
  648.   huart3.Init.Parity = UART_PARITY_NONE;
  649.   huart3.Init.Mode = UART_MODE_TX_RX;
  650.   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  651.   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  652.   if (HAL_UART_Init(&huart3) != HAL_OK)
  653.   {
  654.     Error_Handler();
  655.   }
  656.  
  657. }
  658.  
  659. /** Configure pins as
  660.         * Analog
  661.         * Input
  662.         * Output
  663.         * EVENT_OUT
  664.         * EXTI
  665. */
  666. static void MX_GPIO_Init(void)
  667. {
  668.  
  669.   GPIO_InitTypeDef GPIO_InitStruct;
  670.  
  671.   /* GPIO Ports Clock Enable */
  672.   __HAL_RCC_GPIOH_CLK_ENABLE();
  673.   __HAL_RCC_GPIOA_CLK_ENABLE();
  674.   __HAL_RCC_GPIOC_CLK_ENABLE();
  675.   __HAL_RCC_GPIOB_CLK_ENABLE();
  676.  
  677.   /*Configure GPIO pin Output Level */
  678.   HAL_GPIO_WritePin(GPIOA, SPI_NSS1_Pin|SPI1CD_Pin|BT_BUTTON_Pin, GPIO_PIN_RESET);
  679.  
  680.   /*Configure GPIO pin Output Level */
  681.   HAL_GPIO_WritePin(GPIOC, SPI_RESET_Pin|SPI_NSS2_Pin|POWER_LATCH_Pin|USB_PWR_Pin, GPIO_PIN_RESET);
  682.  
  683.   /*Configure GPIO pins : SPI_NSS1_Pin SPI1CD_Pin BT_BUTTON_Pin */
  684.   GPIO_InitStruct.Pin = SPI_NSS1_Pin|SPI1CD_Pin|BT_BUTTON_Pin;
  685.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  686.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  687.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  688.   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  689.  
  690.   /*Configure GPIO pins : SPI_RESET_Pin SPI_NSS2_Pin POWER_LATCH_Pin USB_PWR_Pin */
  691.   GPIO_InitStruct.Pin = SPI_RESET_Pin|SPI_NSS2_Pin|POWER_LATCH_Pin|USB_PWR_Pin;
  692.   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  693.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  694.   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  695.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  696.  
  697.   /*Configure GPIO pin : SW1_PUSH_Pin */
  698.   GPIO_InitStruct.Pin = SW1_PUSH_Pin;
  699.   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  700.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  701.   HAL_GPIO_Init(SW1_PUSH_GPIO_Port, &GPIO_InitStruct);
  702.  
  703.   /*Configure GPIO pins : SW1_I_Pin SW1_Q_Pin SW2_PUSH_Pin */
  704.   GPIO_InitStruct.Pin = SW1_I_Pin|SW1_Q_Pin|SW2_PUSH_Pin;
  705.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  706.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  707.   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  708.  
  709.   /*Configure GPIO pins : SW2_I_Pin SW2_Q_Pin IGNITION_Pin */
  710.   GPIO_InitStruct.Pin = SW2_I_Pin|SW2_Q_Pin|IGNITION_Pin;
  711.   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  712.   GPIO_InitStruct.Pull = GPIO_NOPULL;
  713.   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  714.  
  715. }
  716.  
  717. /* USER CODE BEGIN 4 */
  718.  
  719. /* USER CODE END 4 */
  720.  
  721. /**
  722.   * @brief  This function is executed in case of error occurrence.
  723.   * @param  None
  724.   * @retval None
  725.   */
  726. void Error_Handler(void)
  727. {
  728.   /* USER CODE BEGIN Error_Handler */
  729. /* User can add his own implementation to report the HAL error return state */
  730. while (1)
  731. {
  732. }
  733.   /* USER CODE END Error_Handler */
  734. }
  735.  
  736. #ifdef USE_FULL_ASSERT
  737.  
  738. /**
  739.    * @brief Reports the name of the source file and the source line number
  740.    * where the assert_param error has occurred.
  741.    * @param file: pointer to the source file name
  742.    * @param line: assert_param error line source number
  743.    * @retval None
  744.    */
  745. void assert_failed(uint8_t* file, uint32_t line)
  746. {
  747.   /* USER CODE BEGIN 6 */
  748. /* User can add his own implementation to report the file name and line number,
  749.  ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  750.   /* USER CODE END 6 */
  751.  
  752. }
  753.  
  754. #endif
  755.  
  756. /**
  757.   * @}
  758.   */
  759.  
  760. /**
  761.   * @}
  762. */
  763.  
  764. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
  765.