tdse-tf_3-02

Controlador PID para derretidor de miel con control local via botones y remoto via WiFi
Index Commits Files Refs Submodules README
firmware-nucleo/Core/Src/main.c (17249B)
   1 /* USER CODE BEGIN Header */
   2 /**
   3  ******************************************************************************
   4  * @file           : main.c
   5  * @brief          : Main program body
   6  ******************************************************************************
   7  * @attention
   8  *
   9  * Copyright (c) 2025 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 
  25 /* Application includes. */
  26 #include "logger.h"
  27 #include "app.h"
  28 
  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 
  39 /* USER CODE END PD */
  40 
  41 /* Private macro -------------------------------------------------------------*/
  42 /* USER CODE BEGIN PM */
  43 
  44 /* USER CODE END PM */
  45 
  46 /* Private variables ---------------------------------------------------------*/
  47 I2C_HandleTypeDef hi2c1;
  48 DMA_HandleTypeDef hdma_i2c1_tx;
  49 
  50 RTC_HandleTypeDef hrtc;
  51 
  52 TIM_HandleTypeDef htim1;
  53 TIM_HandleTypeDef htim3;
  54 
  55 UART_HandleTypeDef huart1;
  56 UART_HandleTypeDef huart3;
  57 DMA_HandleTypeDef hdma_usart1_tx;
  58 DMA_HandleTypeDef hdma_usart1_rx;
  59 DMA_HandleTypeDef hdma_usart3_rx;
  60 DMA_HandleTypeDef hdma_usart3_tx;
  61 
  62 /* USER CODE BEGIN PV */
  63 
  64 /* USER CODE END PV */
  65 
  66 /* Private function prototypes -----------------------------------------------*/
  67 void SystemClock_Config(void);
  68 static void MX_GPIO_Init(void);
  69 static void MX_DMA_Init(void);
  70 static void MX_RTC_Init(void);
  71 static void MX_I2C1_Init(void);
  72 static void MX_TIM1_Init(void);
  73 static void MX_USART1_UART_Init(void);
  74 static void MX_TIM3_Init(void);
  75 static void MX_USART3_UART_Init(void);
  76 /* USER CODE BEGIN PFP */
  77 
  78 /* USER CODE END PFP */
  79 
  80 /* Private user code ---------------------------------------------------------*/
  81 /* USER CODE BEGIN 0 */
  82 #if (1 == LOGGER_CONFIG_USE_SEMIHOSTING)
  83 extern void initialise_monitor_handles(void);
  84 #endif
  85 
  86 RTC_TimeTypeDef s_time = {0};
  87 RTC_DateTypeDef s_date = {0};
  88 
  89 /* USER CODE END 0 */
  90 
  91 /**
  92   * @brief  The application entry point.
  93   * @retval int
  94   */
  95 int main(void)
  96 {
  97 
  98   /* USER CODE BEGIN 1 */
  99 #if (1 == LOGGER_CONFIG_USE_SEMIHOSTING)
 100     initialise_monitor_handles();
 101 #endif
 102   /* USER CODE END 1 */
 103 
 104   /* MCU Configuration--------------------------------------------------------*/
 105 
 106   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
 107   HAL_Init();
 108 
 109   /* USER CODE BEGIN Init */
 110 
 111   /* USER CODE END Init */
 112 
 113   /* Configure the system clock */
 114   SystemClock_Config();
 115 
 116   /* USER CODE BEGIN SysInit */
 117 
 118   /* USER CODE END SysInit */
 119 
 120   /* Initialize all configured peripherals */
 121   MX_GPIO_Init();
 122   MX_DMA_Init();
 123   MX_RTC_Init();
 124   MX_I2C1_Init();
 125   MX_TIM1_Init();
 126   MX_USART1_UART_Init();
 127   MX_TIM3_Init();
 128   MX_USART3_UART_Init();
 129   /* USER CODE BEGIN 2 */
 130 
 131     /* Application Init */
 132     app_init();
 133   /* USER CODE END 2 */
 134 
 135   /* Infinite loop */
 136   /* USER CODE BEGIN WHILE */
 137 
 138     LOGGER_INFO("Running main loop...");
 139     while (1)
 140     {
 141     /* USER CODE END WHILE */
 142 
 143     /* USER CODE BEGIN 3 */
 144 
 145         /* Application Update */
 146         app_update();
 147     }
 148   /* USER CODE END 3 */
 149 }
 150 
 151 /**
 152   * @brief System Clock Configuration
 153   * @retval None
 154   */
 155 void SystemClock_Config(void)
 156 {
 157   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 158   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 159   RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 160 
 161   /** Initializes the RCC Oscillators according to the specified parameters
 162   * in the RCC_OscInitTypeDef structure.
 163   */
 164   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE;
 165   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
 166   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
 167   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
 168   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 169   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;
 170   RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
 171   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
 172   {
 173     Error_Handler();
 174   }
 175 
 176   /** Initializes the CPU, AHB and APB buses clocks
 177   */
 178   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
 179                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
 180   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 181   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 182   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
 183   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 184 
 185   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
 186   {
 187     Error_Handler();
 188   }
 189   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
 190   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
 191   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 192   {
 193     Error_Handler();
 194   }
 195 }
 196 
 197 /**
 198   * @brief I2C1 Initialization Function
 199   * @param None
 200   * @retval None
 201   */
 202 static void MX_I2C1_Init(void)
 203 {
 204 
 205   /* USER CODE BEGIN I2C1_Init 0 */
 206 
 207   /* USER CODE END I2C1_Init 0 */
 208 
 209   /* USER CODE BEGIN I2C1_Init 1 */
 210 
 211   /* USER CODE END I2C1_Init 1 */
 212   hi2c1.Instance = I2C1;
 213   hi2c1.Init.ClockSpeed = 100000;
 214   hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
 215   hi2c1.Init.OwnAddress1 = 0;
 216   hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
 217   hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
 218   hi2c1.Init.OwnAddress2 = 0;
 219   hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
 220   hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
 221   if (HAL_I2C_Init(&hi2c1) != HAL_OK)
 222   {
 223     Error_Handler();
 224   }
 225   /* USER CODE BEGIN I2C1_Init 2 */
 226 
 227   /* USER CODE END I2C1_Init 2 */
 228 
 229 }
 230 
 231 /**
 232   * @brief RTC Initialization Function
 233   * @param None
 234   * @retval None
 235   */
 236 static void MX_RTC_Init(void)
 237 {
 238 
 239   /* USER CODE BEGIN RTC_Init 0 */
 240 
 241   /* USER CODE END RTC_Init 0 */
 242 
 243   RTC_TimeTypeDef sTime = {0};
 244   RTC_DateTypeDef DateToUpdate = {0};
 245 
 246   /* USER CODE BEGIN RTC_Init 1 */
 247 
 248   /* USER CODE END RTC_Init 1 */
 249 
 250   /** Initialize RTC Only
 251   */
 252   hrtc.Instance = RTC;
 253   hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
 254   hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
 255   if (HAL_RTC_Init(&hrtc) != HAL_OK)
 256   {
 257     Error_Handler();
 258   }
 259 
 260   /* USER CODE BEGIN Check_RTC_BKUP */
 261 
 262   if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) == RTC_BACKUP_MAGIC_NUMBER)
 263   {
 264       return;
 265   }
 266 
 267   /* USER CODE END Check_RTC_BKUP */
 268 
 269   /** Initialize RTC and set the Time and Date
 270   */
 271   sTime.Hours = 0;
 272   sTime.Minutes = 0;
 273   sTime.Seconds = 0;
 274 
 275   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
 276   {
 277     Error_Handler();
 278   }
 279   DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
 280   DateToUpdate.Month = RTC_MONTH_JANUARY;
 281   DateToUpdate.Date = 1;
 282   DateToUpdate.Year = 0;
 283 
 284   if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
 285   {
 286     Error_Handler();
 287   }
 288   /* USER CODE BEGIN RTC_Init 2 */
 289 
 290   /* USER CODE END RTC_Init 2 */
 291 
 292 }
 293 
 294 /**
 295   * @brief TIM1 Initialization Function
 296   * @param None
 297   * @retval None
 298   */
 299 static void MX_TIM1_Init(void)
 300 {
 301 
 302   /* USER CODE BEGIN TIM1_Init 0 */
 303 
 304   /* USER CODE END TIM1_Init 0 */
 305 
 306   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
 307   TIM_MasterConfigTypeDef sMasterConfig = {0};
 308   TIM_OC_InitTypeDef sConfigOC = {0};
 309   TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
 310 
 311   /* USER CODE BEGIN TIM1_Init 1 */
 312 
 313   /* USER CODE END TIM1_Init 1 */
 314   htim1.Instance = TIM1;
 315   htim1.Init.Prescaler = 640-1;
 316   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
 317   htim1.Init.Period = 200-1;
 318   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 319   htim1.Init.RepetitionCounter = 0;
 320   htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 321   if (HAL_TIM_Base_Init(&htim1) != HAL_OK)
 322   {
 323     Error_Handler();
 324   }
 325   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
 326   if (HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig) != HAL_OK)
 327   {
 328     Error_Handler();
 329   }
 330   if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
 331   {
 332     Error_Handler();
 333   }
 334   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 335   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 336   if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
 337   {
 338     Error_Handler();
 339   }
 340   sConfigOC.OCMode = TIM_OCMODE_PWM1;
 341   sConfigOC.Pulse = 0;
 342   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 343   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 344   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 345   sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
 346   sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
 347   if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 348   {
 349     Error_Handler();
 350   }
 351   sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
 352   sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
 353   sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
 354   sBreakDeadTimeConfig.DeadTime = 0;
 355   sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
 356   sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
 357   sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
 358   if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
 359   {
 360     Error_Handler();
 361   }
 362   /* USER CODE BEGIN TIM1_Init 2 */
 363 
 364   /* USER CODE END TIM1_Init 2 */
 365   HAL_TIM_MspPostInit(&htim1);
 366 
 367 }
 368 
 369 /**
 370   * @brief TIM3 Initialization Function
 371   * @param None
 372   * @retval None
 373   */
 374 static void MX_TIM3_Init(void)
 375 {
 376 
 377   /* USER CODE BEGIN TIM3_Init 0 */
 378 
 379   /* USER CODE END TIM3_Init 0 */
 380 
 381   TIM_ClockConfigTypeDef sClockSourceConfig = {0};
 382   TIM_MasterConfigTypeDef sMasterConfig = {0};
 383   TIM_OC_InitTypeDef sConfigOC = {0};
 384 
 385   /* USER CODE BEGIN TIM3_Init 1 */
 386 
 387   /* USER CODE END TIM3_Init 1 */
 388   htim3.Instance = TIM3;
 389   htim3.Init.Prescaler = 0;
 390   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
 391   htim3.Init.Period = 8000;
 392   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 393   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
 394   if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
 395   {
 396     Error_Handler();
 397   }
 398   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
 399   if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
 400   {
 401     Error_Handler();
 402   }
 403   if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
 404   {
 405     Error_Handler();
 406   }
 407   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
 408   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
 409   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
 410   {
 411     Error_Handler();
 412   }
 413   sConfigOC.OCMode = TIM_OCMODE_PWM1;
 414   sConfigOC.Pulse = 4000;
 415   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 416   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
 417   if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
 418   {
 419     Error_Handler();
 420   }
 421   /* USER CODE BEGIN TIM3_Init 2 */
 422 
 423   /* USER CODE END TIM3_Init 2 */
 424   HAL_TIM_MspPostInit(&htim3);
 425 
 426 }
 427 
 428 /**
 429   * @brief USART1 Initialization Function
 430   * @param None
 431   * @retval None
 432   */
 433 static void MX_USART1_UART_Init(void)
 434 {
 435 
 436   /* USER CODE BEGIN USART1_Init 0 */
 437 
 438   /* USER CODE END USART1_Init 0 */
 439 
 440   /* USER CODE BEGIN USART1_Init 1 */
 441 
 442   /* USER CODE END USART1_Init 1 */
 443   huart1.Instance = USART1;
 444   huart1.Init.BaudRate = 115200;
 445   huart1.Init.WordLength = UART_WORDLENGTH_8B;
 446   huart1.Init.StopBits = UART_STOPBITS_1;
 447   huart1.Init.Parity = UART_PARITY_NONE;
 448   huart1.Init.Mode = UART_MODE_TX_RX;
 449   huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 450   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
 451   if (HAL_HalfDuplex_Init(&huart1) != HAL_OK)
 452   {
 453     Error_Handler();
 454   }
 455   /* USER CODE BEGIN USART1_Init 2 */
 456 
 457   /* USER CODE END USART1_Init 2 */
 458 
 459 }
 460 
 461 /**
 462   * @brief USART3 Initialization Function
 463   * @param None
 464   * @retval None
 465   */
 466 static void MX_USART3_UART_Init(void)
 467 {
 468 
 469   /* USER CODE BEGIN USART3_Init 0 */
 470 
 471   /* USER CODE END USART3_Init 0 */
 472 
 473   /* USER CODE BEGIN USART3_Init 1 */
 474 
 475   /* USER CODE END USART3_Init 1 */
 476   huart3.Instance = USART3;
 477   huart3.Init.BaudRate = 115200;
 478   huart3.Init.WordLength = UART_WORDLENGTH_8B;
 479   huart3.Init.StopBits = UART_STOPBITS_1;
 480   huart3.Init.Parity = UART_PARITY_NONE;
 481   huart3.Init.Mode = UART_MODE_TX_RX;
 482   huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
 483   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
 484   if (HAL_UART_Init(&huart3) != HAL_OK)
 485   {
 486     Error_Handler();
 487   }
 488   /* USER CODE BEGIN USART3_Init 2 */
 489 
 490   /* USER CODE END USART3_Init 2 */
 491 
 492 }
 493 
 494 /**
 495   * Enable DMA controller clock
 496   */
 497 static void MX_DMA_Init(void)
 498 {
 499 
 500   /* DMA controller clock enable */
 501   __HAL_RCC_DMA1_CLK_ENABLE();
 502 
 503   /* DMA interrupt init */
 504   /* DMA1_Channel2_IRQn interrupt configuration */
 505   HAL_NVIC_SetPriority(DMA1_Channel2_IRQn, 0, 0);
 506   HAL_NVIC_EnableIRQ(DMA1_Channel2_IRQn);
 507   /* DMA1_Channel3_IRQn interrupt configuration */
 508   HAL_NVIC_SetPriority(DMA1_Channel3_IRQn, 0, 0);
 509   HAL_NVIC_EnableIRQ(DMA1_Channel3_IRQn);
 510   /* DMA1_Channel4_IRQn interrupt configuration */
 511   HAL_NVIC_SetPriority(DMA1_Channel4_IRQn, 0, 0);
 512   HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
 513   /* DMA1_Channel5_IRQn interrupt configuration */
 514   HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
 515   HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
 516   /* DMA1_Channel6_IRQn interrupt configuration */
 517   HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
 518   HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
 519 
 520 }
 521 
 522 /**
 523   * @brief GPIO Initialization Function
 524   * @param None
 525   * @retval None
 526   */
 527 static void MX_GPIO_Init(void)
 528 {
 529   GPIO_InitTypeDef GPIO_InitStruct = {0};
 530   /* USER CODE BEGIN MX_GPIO_Init_1 */
 531   /* USER CODE END MX_GPIO_Init_1 */
 532 
 533   /* GPIO Ports Clock Enable */
 534   __HAL_RCC_GPIOC_CLK_ENABLE();
 535   __HAL_RCC_GPIOD_CLK_ENABLE();
 536   __HAL_RCC_GPIOA_CLK_ENABLE();
 537   __HAL_RCC_GPIOB_CLK_ENABLE();
 538 
 539   /*Configure GPIO pin Output Level */
 540   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
 541 
 542   /*Configure GPIO pin Output Level */
 543   HAL_GPIO_WritePin(LD3_GPIO_Port, LD3_Pin, GPIO_PIN_RESET);
 544 
 545   /*Configure GPIO pin : BTN_A_Pin */
 546   GPIO_InitStruct.Pin = BTN_A_Pin;
 547   GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
 548   GPIO_InitStruct.Pull = GPIO_NOPULL;
 549   HAL_GPIO_Init(BTN_A_GPIO_Port, &GPIO_InitStruct);
 550 
 551   /*Configure GPIO pins : USART2_TX_Pin USART2_RX_Pin */
 552   GPIO_InitStruct.Pin = USART2_TX_Pin|USART2_RX_Pin;
 553   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
 554   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 555   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 556 
 557   /*Configure GPIO pin : LD2_Pin */
 558   GPIO_InitStruct.Pin = LD2_Pin;
 559   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 560   GPIO_InitStruct.Pull = GPIO_NOPULL;
 561   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 562   HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
 563 
 564   /*Configure GPIO pin : LD3_Pin */
 565   GPIO_InitStruct.Pin = LD3_Pin;
 566   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
 567   GPIO_InitStruct.Pull = GPIO_NOPULL;
 568   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
 569   HAL_GPIO_Init(LD3_GPIO_Port, &GPIO_InitStruct);
 570 
 571   /*Configure GPIO pin : BTN_B_Pin */
 572   GPIO_InitStruct.Pin = BTN_B_Pin;
 573   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 574   GPIO_InitStruct.Pull = GPIO_PULLUP;
 575   HAL_GPIO_Init(BTN_B_GPIO_Port, &GPIO_InitStruct);
 576 
 577   /*Configure GPIO pins : BTN_D_Pin BTN_C_Pin */
 578   GPIO_InitStruct.Pin = BTN_D_Pin|BTN_C_Pin;
 579   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
 580   GPIO_InitStruct.Pull = GPIO_PULLUP;
 581   HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 582 
 583   /* EXTI interrupt init*/
 584   HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
 585   HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
 586 
 587   /* USER CODE BEGIN MX_GPIO_Init_2 */
 588   /* USER CODE END MX_GPIO_Init_2 */
 589 }
 590 
 591 /* USER CODE BEGIN 4 */
 592 
 593 /* USER CODE END 4 */
 594 
 595 /**
 596   * @brief  This function is executed in case of error occurrence.
 597   * @retval None
 598   */
 599 void Error_Handler(void)
 600 {
 601   /* USER CODE BEGIN Error_Handler_Debug */
 602     /* User can add his own implementation to report the HAL error return state */
 603     __disable_irq();
 604     while (1)
 605     {
 606         ;
 607     }
 608   /* USER CODE END Error_Handler_Debug */
 609 }
 610 #ifdef USE_FULL_ASSERT
 611 /**
 612   * @brief  Reports the name of the source file and the source line number
 613   *         where the assert_param error has occurred.
 614   * @param  file: pointer to the source file name
 615   * @param  line: assert_param error line source number
 616   * @retval None
 617   */
 618 void assert_failed(uint8_t *file, uint32_t line)
 619 {
 620   /* USER CODE BEGIN 6 */
 621     /*
 622      * User can add his own implementation to report the file name and line
 623      * number, i.e. `printf("Error: file %s on line %d\r\n", file, line)
 624      */
 625   /* USER CODE END 6 */
 626 }
 627 #endif /* USE_FULL_ASSERT */