[STM32H7] STM32H750B-DK TouchGFX 测评——快速开发

搭建开发环境,首先下载STM32cubmx,图形化配置工具,非常强大,作为高端mcu,freertos是必备的,多任务开发,其他的软件包按照需求添加,比如文件系统,网络协议栈,USB、这些都是开发板上带的,必须加进去在添加软件包额时候,如果出现不合理的地方,点击生成代码的时候,会进行提示,  在SYS下降时钟从systick改成TIM1,警告消除;

类似的还有FREERTOS的newlib settings,直接改成enable

IDE开发工具当然选择STM32CubIDE,完成FREERTOS的系统工程,代码如下:

 

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c

  * [url=home.php?mod=space&uid=247401]@brief[/url]          : Main program body

  ******************************************************************************

  * @attention

  *

  * Copyright (c) 2022 STMicroelectronics.

  * All rights reserved.

  *

  * This software is licensed under terms that can be found in the LICENSE file

  * in the root directory of this software component.

  * If no LICENSE file comes with this software, it is provided AS-IS.

  *

  ******************************************************************************

  */

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "string.h"

#include "cmsis_os.h"

#include "fatfs.h"

#include "libjpeg.h"

#include "mbedtls.h"

#include "usb_device.h"



/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */



/* USER CODE END Includes */



/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */



/* USER CODE END PTD */



/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */



/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */



/* USER CODE END PM */



/* Private variables ---------------------------------------------------------*/

#if defined ( __ICCARM__ ) /*!< IAR Compiler */

#pragma location=0x30000000

ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */

#pragma location=0x30000200

ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */



#elif defined ( __CC_ARM )  /* MDK ARM Compiler */



__attribute__((at(0x30000000))) ETH_DMADescTypeDef  DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */

__attribute__((at(0x30000200))) ETH_DMADescTypeDef  DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */



#elif defined ( __GNUC__ ) /* GNU Compiler */

ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT] __attribute__((section(".RxDecripSection"))); /* Ethernet Rx DMA Descriptors */

ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecripSection")));   /* Ethernet Tx DMA Descriptors */



#endif



ETH_TxPacketConfig TxConfig;



ADC_HandleTypeDef hadc1;

ADC_HandleTypeDef hadc2;

ADC_HandleTypeDef hadc3;



ETH_HandleTypeDef heth;



FDCAN_HandleTypeDef hfdcan1;

FDCAN_HandleTypeDef hfdcan2;



LTDC_HandleTypeDef hltdc;



QSPI_HandleTypeDef hqspi;



RTC_HandleTypeDef hrtc;



SAI_HandleTypeDef hsai_BlockA2;

SAI_HandleTypeDef hsai_BlockB2;



MMC_HandleTypeDef hmmc1;



SPI_HandleTypeDef hspi2;



UART_HandleTypeDef huart3;



SDRAM_HandleTypeDef hsdram1;



/* Definitions for defaultTask */

osThreadId_t defaultTaskHandle;

const osThreadAttr_t defaultTask_attributes = {

  .name = "defaultTask",

  .stack_size = 128 * 4,

  .priority = (osPriority_t) osPriorityNormal,

};

/* USER CODE BEGIN PV */



/* USER CODE END PV */



/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

void PeriphCommonClock_Config(void);

static void MX_GPIO_Init(void);

static void MX_ADC1_Init(void);

static void MX_ADC2_Init(void);

static void MX_ADC3_Init(void);

static void MX_ETH_Init(void);

static void MX_FDCAN1_Init(void);

static void MX_FDCAN2_Init(void);

static void MX_FMC_Init(void);

static void MX_LTDC_Init(void);

static void MX_QUADSPI_Init(void);

static void MX_RTC_Init(void);

static void MX_SAI2_Init(void);

static void MX_SDMMC1_MMC_Init(void);

static void MX_SPI2_Init(void);

static void MX_USART3_UART_Init(void);

void StartDefaultTask(void *argument);



/* USER CODE BEGIN PFP */



/* USER CODE END PFP */



/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */



/* USER CODE END 0 */



/**

  * [url=home.php?mod=space&uid=247401]@brief[/url]  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */



  /* USER CODE END 1 */



  /* MCU Configuration--------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



/* Configure the peripherals common clocks */

  PeriphCommonClock_Config();



  /* USER CODE BEGIN SysInit */



  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_ADC1_Init();

  MX_ADC2_Init();

  MX_ADC3_Init();

  MX_ETH_Init();

  MX_FDCAN1_Init();

  MX_FDCAN2_Init();

  MX_FMC_Init();

  MX_LTDC_Init();

  MX_QUADSPI_Init();

  MX_RTC_Init();

  MX_SAI2_Init();

  MX_SDMMC1_MMC_Init();

  MX_SPI2_Init();

  MX_USART3_UART_Init();

  MX_FATFS_Init();

  MX_LIBJPEG_Init();

  MX_MBEDTLS_Init();

  /* Call PreOsInit function */

  MX_MBEDTLS_Init();

  /* USER CODE BEGIN 2 */



  /* USER CODE END 2 */



  /* Init scheduler */

  osKernelInitialize();



  /* USER CODE BEGIN RTOS_MUTEX */

  /* add mutexes, ... */

  /* USER CODE END RTOS_MUTEX */



  /* USER CODE BEGIN RTOS_SEMAPHORES */

  /* add semaphores, ... */

  /* USER CODE END RTOS_SEMAPHORES */



  /* USER CODE BEGIN RTOS_TIMERS */

  /* start timers, add new ones, ... */

  /* USER CODE END RTOS_TIMERS */



  /* USER CODE BEGIN RTOS_QUEUES */

  /* add queues, ... */

  /* USER CODE END RTOS_QUEUES */



  /* Create the thread(s) */

  /* creation of defaultTask */

  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);



  /* USER CODE BEGIN RTOS_THREADS */

  /* add threads, ... */

  /* USER CODE END RTOS_THREADS */



  /* USER CODE BEGIN RTOS_EVENTS */

  /* add events, ... */

  /* USER CODE END RTOS_EVENTS */



  /* Start scheduler */

  osKernelStart();



  /* We should never get here as control is now taken by the scheduler */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}



/**

  * [url=home.php?mod=space&uid=247401]@brief[/url] System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};



  /** Supply configuration update enable

  */

  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);



  /** Configure the main internal regulator output voltage

  */

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE2);



  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}



  /** Macro to configure the PLL clock source

  */

  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);



  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI

                              |RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;

  RCC_OscInitStruct.HSIState = RCC_HSI_DIV1;

  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  RCC_OscInitStruct.LSIState = RCC_LSI_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 22;

  RCC_OscInitStruct.PLL.PLLN = 169;

  RCC_OscInitStruct.PLL.PLLP = 2;

  RCC_OscInitStruct.PLL.PLLQ = 4;

  RCC_OscInitStruct.PLL.PLLR = 2;

  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_0;

  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;

  RCC_OscInitStruct.PLL.PLLFRACN = 0;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }



  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2

                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;

  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV1;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV1;

  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV1;



  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)

  {

    Error_Handler();

  }

}



/**

  * @brief Peripherals Common Clock Configuration

  * @retval None

  */

void PeriphCommonClock_Config(void)

{

  RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};



  /** Initializes the peripherals clock

  */

  PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;

  PeriphClkInitStruct.PLL2.PLL2M = 2;

  PeriphClkInitStruct.PLL2.PLL2N = 12;

  PeriphClkInitStruct.PLL2.PLL2P = 5;

  PeriphClkInitStruct.PLL2.PLL2Q = 2;

  PeriphClkInitStruct.PLL2.PLL2R = 2;

  PeriphClkInitStruct.PLL2.PLL2RGE = RCC_PLL2VCIRANGE_3;

  PeriphClkInitStruct.PLL2.PLL2VCOSEL = RCC_PLL2VCOMEDIUM;

  PeriphClkInitStruct.PLL2.PLL2FRACN = 0;

  PeriphClkInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_PLL2;

  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

  {

    Error_Handler();

  }

}



/**

  * @brief ADC1 Initialization Function

  * @param None

  * @retval None

  */

static void MX_ADC1_Init(void)

{



  /* USER CODE BEGIN ADC1_Init 0 */



  /* USER CODE END ADC1_Init 0 */



  ADC_MultiModeTypeDef multimode = {0};

  ADC_ChannelConfTypeDef sConfig = {0};



  /* USER CODE BEGIN ADC1_Init 1 */



  /* USER CODE END ADC1_Init 1 */



  /** Common config

  */

  hadc1.Instance = ADC1;

  hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;

  hadc1.Init.Resolution = ADC_RESOLUTION_16B;

  hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

  hadc1.Init.LowPowerAutoWait = DISABLE;

  hadc1.Init.ContinuousConvMode = DISABLE;

  hadc1.Init.NbrOfConversion = 1;

  hadc1.Init.DiscontinuousConvMode = DISABLE;

  hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;

  hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

  hadc1.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;

  hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED;

  hadc1.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

  hadc1.Init.OversamplingMode = DISABLE;

  if (HAL_ADC_Init(&hadc1) != HAL_OK)

  {

    Error_Handler();

  }



  /** Configure the ADC multi-mode

  */

  multimode.Mode = ADC_MODE_INDEPENDENT;

  if (HAL_ADCEx_MultiModeConfigChannel(&hadc1, &multimode) != HAL_OK)

  {

    Error_Handler();

  }



  /** Configure Regular Channel

  */

  sConfig.Channel = ADC_CHANNEL_0;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

  sConfig.SingleDiff = ADC_SINGLE_ENDED;

  sConfig.OffsetNumber = ADC_OFFSET_NONE;

  sConfig.Offset = 0;

  sConfig.OffsetSignedSaturation = DISABLE;

  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN ADC1_Init 2 */



  /* USER CODE END ADC1_Init 2 */



}



/**

  * @brief ADC2 Initialization Function

  * @param None

  * @retval None

  */

static void MX_ADC2_Init(void)

{



  /* USER CODE BEGIN ADC2_Init 0 */



  /* USER CODE END ADC2_Init 0 */



  ADC_ChannelConfTypeDef sConfig = {0};



  /* USER CODE BEGIN ADC2_Init 1 */



  /* USER CODE END ADC2_Init 1 */



  /** Common config

  */

  hadc2.Instance = ADC2;

  hadc2.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV2;

  hadc2.Init.Resolution = ADC_RESOLUTION_16B;

  hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;

  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

  hadc2.Init.LowPowerAutoWait = DISABLE;

  hadc2.Init.ContinuousConvMode = DISABLE;

  hadc2.Init.NbrOfConversion = 1;

  hadc2.Init.DiscontinuousConvMode = DISABLE;

  hadc2.Init.ExternalTrigConv = ADC_SOFTWARE_START;

  hadc2.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

  hadc2.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;

  hadc2.Init.Overrun = ADC_OVR_DATA_PRESERVED;

  hadc2.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

  hadc2.Init.OversamplingMode = DISABLE;

  if (HAL_ADC_Init(&hadc2) != HAL_OK)

  {

    Error_Handler();

  }



  /** Configure Regular Channel

  */

  sConfig.Channel = ADC_CHANNEL_0;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

  sConfig.SingleDiff = ADC_SINGLE_ENDED;

  sConfig.OffsetNumber = ADC_OFFSET_NONE;

  sConfig.Offset = 0;

  sConfig.OffsetSignedSaturation = DISABLE;

  if (HAL_ADC_ConfigChannel(&hadc2, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN ADC2_Init 2 */



  /* USER CODE END ADC2_Init 2 */



}



/**

  * @brief ADC3 Initialization Function

  * @param None

  * @retval None

  */

static void MX_ADC3_Init(void)

{



  /* USER CODE BEGIN ADC3_Init 0 */



  /* USER CODE END ADC3_Init 0 */



  ADC_ChannelConfTypeDef sConfig = {0};



  /* USER CODE BEGIN ADC3_Init 1 */



  /* USER CODE END ADC3_Init 1 */



  /** Common config

  */

  hadc3.Instance = ADC3;

  hadc3.Init.Resolution = ADC_RESOLUTION_16B;

  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;

  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;

  hadc3.Init.LowPowerAutoWait = DISABLE;

  hadc3.Init.ContinuousConvMode = DISABLE;

  hadc3.Init.NbrOfConversion = 1;

  hadc3.Init.DiscontinuousConvMode = DISABLE;

  hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;

  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;

  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DR;

  hadc3.Init.Overrun = ADC_OVR_DATA_PRESERVED;

  hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;

  hadc3.Init.OversamplingMode = DISABLE;

  if (HAL_ADC_Init(&hadc3) != HAL_OK)

  {

    Error_Handler();

  }



  /** Configure Regular Channel

  */

  sConfig.Channel = ADC_CHANNEL_7;

  sConfig.Rank = ADC_REGULAR_RANK_1;

  sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;

  sConfig.SingleDiff = ADC_SINGLE_ENDED;

  sConfig.OffsetNumber = ADC_OFFSET_NONE;

  sConfig.Offset = 0;

  sConfig.OffsetSignedSaturation = DISABLE;

  if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN ADC3_Init 2 */



  /* USER CODE END ADC3_Init 2 */



}



/**

  * @brief ETH Initialization Function

  * @param None

  * @retval None

  */

static void MX_ETH_Init(void)

{



  /* USER CODE BEGIN ETH_Init 0 */



  /* USER CODE END ETH_Init 0 */



   static uint8_t MACAddr[6];



  /* USER CODE BEGIN ETH_Init 1 */



  /* USER CODE END ETH_Init 1 */

  heth.Instance = ETH;

  MACAddr[0] = 0x00;

  MACAddr[1] = 0x80;

  MACAddr[2] = 0xE1;

  MACAddr[3] = 0x00;

  MACAddr[4] = 0x00;

  MACAddr[5] = 0x00;

  heth.Init.MACAddr = &MACAddr[0];

  heth.Init.MediaInterface = HAL_ETH_MII_MODE;

  heth.Init.TxDesc = DMATxDscrTab;

  heth.Init.RxDesc = DMARxDscrTab;

  heth.Init.RxBuffLen = 1524;



  /* USER CODE BEGIN MACADDRESS */



  /* USER CODE END MACADDRESS */



  if (HAL_ETH_Init(&heth) != HAL_OK)

  {

    Error_Handler();

  }



  memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));

  TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;

  TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;

  TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;

  /* USER CODE BEGIN ETH_Init 2 */



  /* USER CODE END ETH_Init 2 */



}



/**

  * @brief FDCAN1 Initialization Function

  * @param None

  * @retval None

  */

static void MX_FDCAN1_Init(void)

{



  /* USER CODE BEGIN FDCAN1_Init 0 */



  /* USER CODE END FDCAN1_Init 0 */



  /* USER CODE BEGIN FDCAN1_Init 1 */



  /* USER CODE END FDCAN1_Init 1 */

  hfdcan1.Instance = FDCAN1;

  hfdcan1.Init.FrameFormat = FDCAN_FRAME_CLASSIC;

  hfdcan1.Init.Mode = FDCAN_MODE_NORMAL;

  hfdcan1.Init.AutoRetransmission = DISABLE;

  hfdcan1.Init.TransmitPause = DISABLE;

  hfdcan1.Init.ProtocolException = DISABLE;

  hfdcan1.Init.NominalPrescaler = 16;

  hfdcan1.Init.NominalSyncJumpWidth = 1;

  hfdcan1.Init.NominalTimeSeg1 = 2;

  hfdcan1.Init.NominalTimeSeg2 = 2;

  hfdcan1.Init.DataPrescaler = 1;

  hfdcan1.Init.DataSyncJumpWidth = 1;

  hfdcan1.Init.DataTimeSeg1 = 1;

  hfdcan1.Init.DataTimeSeg2 = 1;

  hfdcan1.Init.MessageRAMOffset = 0;

  hfdcan1.Init.StdFiltersNbr = 0;

  hfdcan1.Init.ExtFiltersNbr = 0;

  hfdcan1.Init.RxFifo0ElmtsNbr = 0;

  hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;

  hfdcan1.Init.RxFifo1ElmtsNbr = 0;

  hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;

  hfdcan1.Init.RxBuffersNbr = 0;

  hfdcan1.Init.RxBufferSize = FDCAN_DATA_BYTES_8;

  hfdcan1.Init.TxEventsNbr = 0;

  hfdcan1.Init.TxBuffersNbr = 0;

  hfdcan1.Init.TxFifoQueueElmtsNbr = 0;

  hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;

  hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_8;

  if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN FDCAN1_Init 2 */



  /* USER CODE END FDCAN1_Init 2 */



}



/**

  * @brief FDCAN2 Initialization Function

  * @param None

  * @retval None

  */

static void MX_FDCAN2_Init(void)

{



  /* USER CODE BEGIN FDCAN2_Init 0 */



  /* USER CODE END FDCAN2_Init 0 */



  /* USER CODE BEGIN FDCAN2_Init 1 */



  /* USER CODE END FDCAN2_Init 1 */

  hfdcan2.Instance = FDCAN2;

  hfdcan2.Init.FrameFormat = FDCAN_FRAME_CLASSIC;

  hfdcan2.Init.Mode = FDCAN_MODE_NORMAL;

  hfdcan2.Init.AutoRetransmission = DISABLE;

  hfdcan2.Init.TransmitPause = DISABLE;

  hfdcan2.Init.ProtocolException = DISABLE;

  hfdcan2.Init.NominalPrescaler = 16;

  hfdcan2.Init.NominalSyncJumpWidth = 1;

  hfdcan2.Init.NominalTimeSeg1 = 2;

  hfdcan2.Init.NominalTimeSeg2 = 2;

  hfdcan2.Init.DataPrescaler = 1;

  hfdcan2.Init.DataSyncJumpWidth = 1;

  hfdcan2.Init.DataTimeSeg1 = 1;

  hfdcan2.Init.DataTimeSeg2 = 1;

  hfdcan2.Init.MessageRAMOffset = 0;

  hfdcan2.Init.StdFiltersNbr = 0;

  hfdcan2.Init.ExtFiltersNbr = 0;

  hfdcan2.Init.RxFifo0ElmtsNbr = 0;

  hfdcan2.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_8;

  hfdcan2.Init.RxFifo1ElmtsNbr = 0;

  hfdcan2.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_8;

  hfdcan2.Init.RxBuffersNbr = 0;

  hfdcan2.Init.RxBufferSize = FDCAN_DATA_BYTES_8;

  hfdcan2.Init.TxEventsNbr = 0;

  hfdcan2.Init.TxBuffersNbr = 0;

  hfdcan2.Init.TxFifoQueueElmtsNbr = 0;

  hfdcan2.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION;

  hfdcan2.Init.TxElmtSize = FDCAN_DATA_BYTES_8;

  if (HAL_FDCAN_Init(&hfdcan2) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN FDCAN2_Init 2 */



  /* USER CODE END FDCAN2_Init 2 */



}



/**

  * @brief LTDC Initialization Function

  * @param None

  * @retval None

  */

static void MX_LTDC_Init(void)

{



  /* USER CODE BEGIN LTDC_Init 0 */



  /* USER CODE END LTDC_Init 0 */



  LTDC_LayerCfgTypeDef pLayerCfg = {0};

  LTDC_LayerCfgTypeDef pLayerCfg1 = {0};



  /* USER CODE BEGIN LTDC_Init 1 */



  /* USER CODE END LTDC_Init 1 */

  hltdc.Instance = LTDC;

  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;

  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;

  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;

  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

  hltdc.Init.HorizontalSync = 7;

  hltdc.Init.VerticalSync = 3;

  hltdc.Init.AccumulatedHBP = 14;

  hltdc.Init.AccumulatedVBP = 5;

  hltdc.Init.AccumulatedActiveW = 654;

  hltdc.Init.AccumulatedActiveH = 485;

  hltdc.Init.TotalWidth = 660;

  hltdc.Init.TotalHeigh = 487;

  hltdc.Init.Backcolor.Blue = 0;

  hltdc.Init.Backcolor.Green = 0;

  hltdc.Init.Backcolor.Red = 0;

  if (HAL_LTDC_Init(&hltdc) != HAL_OK)

  {

    Error_Handler();

  }

  pLayerCfg.WindowX0 = 0;

  pLayerCfg.WindowX1 = 0;

  pLayerCfg.WindowY0 = 0;

  pLayerCfg.WindowY1 = 0;

  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;

  pLayerCfg.Alpha = 0;

  pLayerCfg.Alpha0 = 0;

  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;

  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;

  pLayerCfg.FBStartAdress = 0;

  pLayerCfg.ImageWidth = 0;

  pLayerCfg.ImageHeight = 0;

  pLayerCfg.Backcolor.Blue = 0;

  pLayerCfg.Backcolor.Green = 0;

  pLayerCfg.Backcolor.Red = 0;

  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)

  {

    Error_Handler();

  }

  pLayerCfg1.WindowX0 = 0;

  pLayerCfg1.WindowX1 = 0;

  pLayerCfg1.WindowY0 = 0;

  pLayerCfg1.WindowY1 = 0;

  pLayerCfg1.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888;

  pLayerCfg1.Alpha = 0;

  pLayerCfg1.Alpha0 = 0;

  pLayerCfg1.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;

  pLayerCfg1.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;

  pLayerCfg1.FBStartAdress = 0;

  pLayerCfg1.ImageWidth = 0;

  pLayerCfg1.ImageHeight = 0;

  pLayerCfg1.Backcolor.Blue = 0;

  pLayerCfg1.Backcolor.Green = 0;

  pLayerCfg1.Backcolor.Red = 0;

  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg1, 1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN LTDC_Init 2 */



  /* USER CODE END LTDC_Init 2 */



}



/**

  * @brief QUADSPI Initialization Function

  * @param None

  * @retval None

  */

static void MX_QUADSPI_Init(void)

{



  /* USER CODE BEGIN QUADSPI_Init 0 */



  /* USER CODE END QUADSPI_Init 0 */



  /* USER CODE BEGIN QUADSPI_Init 1 */



  /* USER CODE END QUADSPI_Init 1 */

  /* QUADSPI parameter configuration*/

  hqspi.Instance = QUADSPI;

  hqspi.Init.ClockPrescaler = 255;

  hqspi.Init.FifoThreshold = 1;

  hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;

  hqspi.Init.FlashSize = 1;

  hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;

  hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;

  hqspi.Init.FlashID = QSPI_FLASH_ID_1;

  hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;

  if (HAL_QSPI_Init(&hqspi) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN QUADSPI_Init 2 */



  /* USER CODE END QUADSPI_Init 2 */



}



/**

  * @brief RTC Initialization Function

  * @param None

  * @retval None

  */

static void MX_RTC_Init(void)

{



  /* USER CODE BEGIN RTC_Init 0 */



  /* USER CODE END RTC_Init 0 */



  /* USER CODE BEGIN RTC_Init 1 */



  /* USER CODE END RTC_Init 1 */



  /** Initialize RTC Only

  */

  hrtc.Instance = RTC;

  hrtc.Init.HourFormat = RTC_HOURFORMAT_24;

  hrtc.Init.AsynchPrediv = 127;

  hrtc.Init.SynchPrediv = 255;

  hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;

  hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;

  hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;

  hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;

  if (HAL_RTC_Init(&hrtc) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN RTC_Init 2 */



  /* USER CODE END RTC_Init 2 */



}



/**

  * @brief SAI2 Initialization Function

  * @param None

  * @retval None

  */

static void MX_SAI2_Init(void)

{



  /* USER CODE BEGIN SAI2_Init 0 */



  /* USER CODE END SAI2_Init 0 */



  /* USER CODE BEGIN SAI2_Init 1 */



  /* USER CODE END SAI2_Init 1 */

  hsai_BlockA2.Instance = SAI2_Block_A;

  hsai_BlockA2.Init.Protocol = SAI_FREE_PROTOCOL;

  hsai_BlockA2.Init.AudioMode = SAI_MODEMASTER_TX;

  hsai_BlockA2.Init.DataSize = SAI_DATASIZE_8;

  hsai_BlockA2.Init.FirstBit = SAI_FIRSTBIT_MSB;

  hsai_BlockA2.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;

  hsai_BlockA2.Init.Synchro = SAI_ASYNCHRONOUS;

  hsai_BlockA2.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;

  hsai_BlockA2.Init.NoDivider = SAI_MASTERDIVIDER_ENABLE;

  hsai_BlockA2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;

  hsai_BlockA2.Init.AudioFrequency = SAI_AUDIO_FREQUENCY_192K;

  hsai_BlockA2.Init.SynchroExt = SAI_SYNCEXT_DISABLE;

  hsai_BlockA2.Init.MonoStereoMode = SAI_STEREOMODE;

  hsai_BlockA2.Init.CompandingMode = SAI_NOCOMPANDING;

  hsai_BlockA2.Init.TriState = SAI_OUTPUT_NOTRELEASED;

  hsai_BlockA2.Init.PdmInit.Activation = DISABLE;

  hsai_BlockA2.Init.PdmInit.MicPairsNbr = 1;

  hsai_BlockA2.Init.PdmInit.ClockEnable = SAI_PDM_CLOCK1_ENABLE;

  hsai_BlockA2.FrameInit.FrameLength = 8;

  hsai_BlockA2.FrameInit.ActiveFrameLength = 1;

  hsai_BlockA2.FrameInit.FSDefinition = SAI_FS_STARTFRAME;

  hsai_BlockA2.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;

  hsai_BlockA2.FrameInit.FSOffset = SAI_FS_FIRSTBIT;

  hsai_BlockA2.SlotInit.FirstBitOffset = 0;

  hsai_BlockA2.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;

  hsai_BlockA2.SlotInit.SlotNumber = 1;

  hsai_BlockA2.SlotInit.SlotActive = 0x00000000;

  if (HAL_SAI_Init(&hsai_BlockA2) != HAL_OK)

  {

    Error_Handler();

  }

  hsai_BlockB2.Instance = SAI2_Block_B;

  hsai_BlockB2.Init.Protocol = SAI_FREE_PROTOCOL;

  hsai_BlockB2.Init.AudioMode = SAI_MODESLAVE_RX;

  hsai_BlockB2.Init.DataSize = SAI_DATASIZE_8;

  hsai_BlockB2.Init.FirstBit = SAI_FIRSTBIT_MSB;

  hsai_BlockB2.Init.ClockStrobing = SAI_CLOCKSTROBING_FALLINGEDGE;

  hsai_BlockB2.Init.Synchro = SAI_SYNCHRONOUS;

  hsai_BlockB2.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLE;

  hsai_BlockB2.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_EMPTY;

  hsai_BlockB2.Init.SynchroExt = SAI_SYNCEXT_DISABLE;

  hsai_BlockB2.Init.MonoStereoMode = SAI_STEREOMODE;

  hsai_BlockB2.Init.CompandingMode = SAI_NOCOMPANDING;

  hsai_BlockB2.Init.TriState = SAI_OUTPUT_NOTRELEASED;

  hsai_BlockB2.Init.PdmInit.Activation = DISABLE;

  hsai_BlockB2.Init.PdmInit.MicPairsNbr = 1;

  hsai_BlockB2.Init.PdmInit.ClockEnable = SAI_PDM_CLOCK1_ENABLE;

  hsai_BlockB2.FrameInit.FrameLength = 8;

  hsai_BlockB2.FrameInit.ActiveFrameLength = 1;

  hsai_BlockB2.FrameInit.FSDefinition = SAI_FS_STARTFRAME;

  hsai_BlockB2.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW;

  hsai_BlockB2.FrameInit.FSOffset = SAI_FS_FIRSTBIT;

  hsai_BlockB2.SlotInit.FirstBitOffset = 0;

  hsai_BlockB2.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE;

  hsai_BlockB2.SlotInit.SlotNumber = 1;

  hsai_BlockB2.SlotInit.SlotActive = 0x00000000;

  if (HAL_SAI_Init(&hsai_BlockB2) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN SAI2_Init 2 */



  /* USER CODE END SAI2_Init 2 */



}



/**

  * @brief SDMMC1 Initialization Function

  * @param None

  * @retval None

  */

static void MX_SDMMC1_MMC_Init(void)

{



  /* USER CODE BEGIN SDMMC1_Init 0 */



  /* USER CODE END SDMMC1_Init 0 */



  /* USER CODE BEGIN SDMMC1_Init 1 */



  /* USER CODE END SDMMC1_Init 1 */

  hmmc1.Instance = SDMMC1;

  hmmc1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;

  hmmc1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;

  hmmc1.Init.BusWide = SDMMC_BUS_WIDE_8B;

  hmmc1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;

  hmmc1.Init.ClockDiv = 0;

  if (HAL_MMC_Init(&hmmc1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN SDMMC1_Init 2 */



  /* USER CODE END SDMMC1_Init 2 */



}



/**

  * @brief SPI2 Initialization Function

  * @param None

  * @retval None

  */

static void MX_SPI2_Init(void)

{



  /* USER CODE BEGIN SPI2_Init 0 */



  /* USER CODE END SPI2_Init 0 */



  /* USER CODE BEGIN SPI2_Init 1 */



  /* USER CODE END SPI2_Init 1 */

  /* SPI2 parameter configuration*/

  hspi2.Instance = SPI2;

  hspi2.Init.Mode = SPI_MODE_MASTER;

  hspi2.Init.Direction = SPI_DIRECTION_2LINES;

  hspi2.Init.DataSize = SPI_DATASIZE_4BIT;

  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;

  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;

  hspi2.Init.NSS = SPI_NSS_HARD_INPUT;

  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;

  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;

  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

  hspi2.Init.CRCPolynomial = 0x0;

  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

  hspi2.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;

  hspi2.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;

  hspi2.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

  hspi2.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;

  hspi2.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;

  hspi2.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;

  hspi2.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;

  hspi2.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;

  hspi2.Init.IOSwap = SPI_IO_SWAP_DISABLE;

  if (HAL_SPI_Init(&hspi2) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN SPI2_Init 2 */



  /* USER CODE END SPI2_Init 2 */



}



/**

  * @brief USART3 Initialization Function

  * @param None

  * @retval None

  */

static void MX_USART3_UART_Init(void)

{



  /* USER CODE BEGIN USART3_Init 0 */



  /* USER CODE END USART3_Init 0 */



  /* USER CODE BEGIN USART3_Init 1 */



  /* USER CODE END USART3_Init 1 */

  huart3.Instance = USART3;

  huart3.Init.BaudRate = 115200;

  huart3.Init.WordLength = UART_WORDLENGTH_8B;

  huart3.Init.StopBits = UART_STOPBITS_1;

  huart3.Init.Parity = UART_PARITY_NONE;

  huart3.Init.Mode = UART_MODE_TX_RX;

  huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart3.Init.OverSampling = UART_OVERSAMPLING_16;

  huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;

  huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;

  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;

  if (HAL_UART_Init(&huart3) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_UARTEx_SetTxFifoThreshold(&huart3, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_UARTEx_SetRxFifoThreshold(&huart3, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_UARTEx_DisableFifoMode(&huart3) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN USART3_Init 2 */



  /* USER CODE END USART3_Init 2 */



}



/* FMC initialization function */

static void MX_FMC_Init(void)

{



  /* USER CODE BEGIN FMC_Init 0 */



  /* USER CODE END FMC_Init 0 */



  FMC_SDRAM_TimingTypeDef SdramTiming = {0};



  /* USER CODE BEGIN FMC_Init 1 */



  /* USER CODE END FMC_Init 1 */



  /** Perform the SDRAM1 memory initialization sequence

  */

  hsdram1.Instance = FMC_SDRAM_DEVICE;

  /* hsdram1.Init */

  hsdram1.Init.SDBank = FMC_SDRAM_BANK2;

  hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;

  hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;

  hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;

  hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;

  hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_1;

  hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;

  hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_DISABLE;

  hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_DISABLE;

  hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;

  /* SdramTiming */

  SdramTiming.LoadToActiveDelay = 16;

  SdramTiming.ExitSelfRefreshDelay = 16;

  SdramTiming.SelfRefreshTime = 16;

  SdramTiming.RowCycleDelay = 16;

  SdramTiming.WriteRecoveryTime = 16;

  SdramTiming.RPDelay = 16;

  SdramTiming.RCDDelay = 16;



  if (HAL_SDRAM_Init(&hsdram1, &SdramTiming) != HAL_OK)

  {

    Error_Handler( );

  }



  /* USER CODE BEGIN FMC_Init 2 */



  /* USER CODE END FMC_Init 2 */

}



/**

  * @brief GPIO Initialization Function

  * @param None

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};



  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOI_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

  __HAL_RCC_GPIOK_CLK_ENABLE();

  __HAL_RCC_GPIOG_CLK_ENABLE();

  __HAL_RCC_GPIOC_CLK_ENABLE();

  __HAL_RCC_GPIOE_CLK_ENABLE();

  __HAL_RCC_GPIOJ_CLK_ENABLE();

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  __HAL_RCC_GPIOF_CLK_ENABLE();



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LD1_GPIO_Port, LD1_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LCD_RST_GPIO_Port, LCD_RST_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin : PH15 */

  GPIO_InitStruct.Pin = GPIO_PIN_15;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF3_TIM8;

  HAL_GPIO_Init(GPIOH, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_DISPD7_Pin */

  GPIO_InitStruct.Pin = LCD_DISPD7_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(LCD_DISPD7_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pins : PE5 PE4 */

  GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_4;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF10_SAI4;

  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);



  /*Configure GPIO pin : USB_OTG_FS2_ID_Pin */

  GPIO_InitStruct.Pin = USB_OTG_FS2_ID_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(USB_OTG_FS2_ID_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : B1_Pin */

  GPIO_InitStruct.Pin = B1_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : PA8 */

  GPIO_InitStruct.Pin = GPIO_PIN_8;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);



  /*Configure GPIO pin : LD2_Pin */

  GPIO_InitStruct.Pin = LD2_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_INT_Pin */

  GPIO_InitStruct.Pin = LCD_INT_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(LCD_INT_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_BL_Pin */

  GPIO_InitStruct.Pin = LCD_BL_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(LCD_BL_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : OTG_FS2_OverCurrent_Pin */

  GPIO_InitStruct.Pin = OTG_FS2_OverCurrent_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  HAL_GPIO_Init(OTG_FS2_OverCurrent_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : PA6 */

  GPIO_InitStruct.Pin = GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  GPIO_InitStruct.Alternate = GPIO_AF9_TIM13;

  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);



  /*Configure GPIO pin : LD1_Pin */

  GPIO_InitStruct.Pin = LD1_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LD1_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_RST_Pin */

  GPIO_InitStruct.Pin = LCD_RST_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LCD_RST_GPIO_Port, &GPIO_InitStruct);



}



/* USER CODE BEGIN 4 */



/* USER CODE END 4 */



/* USER CODE BEGIN Header_StartDefaultTask */

/**

  * @brief  Function implementing the defaultTask thread.

  * @param  argument: Not used

  * @retval None

  */

/* USER CODE END Header_StartDefaultTask */

void StartDefaultTask(void *argument)

{

  /* init code for USB_DEVICE */

  MX_USB_DEVICE_Init();

  /* USER CODE BEGIN 5 */

  /* Infinite loop */

  for(;;)

  {

    osDelay(1);

  }

  /* USER CODE END 5 */

}



/**

  * @brief  Period elapsed callback in non blocking mode

  * [url=home.php?mod=space&uid=536309]@NOTE[/url]   This function is called  when TIM1 interrupt took place, inside

  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment

  * a global variable "uwTick" used as application time base.

  * @param  htim : TIM handle

  * @retval None

  */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  /* USER CODE BEGIN Callback 0 */



  /* USER CODE END Callback 0 */

  if (htim->Instance == TIM1) {

    HAL_IncTick();

  }

  /* USER CODE BEGIN Callback 1 */



  /* USER CODE END Callback 1 */

}



/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */

  __disable_irq();

  while (1)

  {

  }

  /* USER CODE END Error_Handler_Debug */

}



#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

我们开始编译测试,看到编译成功


这套工具开发非常方便,节省了大量的时间;能够快速进入应用代码开发;真的是工程师的福音!
ui界面开发,下载图形界面开发工具TouchGFX 4.21.0 Designer,最新版本4.21,话不多说,直奔目标在搜索框输入750,开发板就出来了 
新建工程,进入开发界面,异常简单方便,里面有丰富的组件,突然就想起了以前开发MFC的日子了。这个开发工具的图形界面底层使用的C++,点击右下角的生成代码,其实新建工程的时候直接会生成一个完整的工程包,在操作此软件的过程中会把自动生成的C++代码自动添加到工程中,可以加载到IDE中

第一个工程就是图形界面生成的工程主程序代码如下:

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * [url=home.php?mod=space&uid=288409]@file[/url]           : main.c

  * @brief          : Main program body

  ******************************************************************************

  * @attention

  *

  * <h2><center>© Copyright (c) 2020 STMicroelectronics.

  * All rights reserved.</center></h2>

  *

  * This software component is licensed by ST under Ultimate Liberty license

  * SLA0044, the "License"; You may not use this file except in compliance with

  * the License. You may obtain a copy of the License at:

  *                             www.st.com/SLA0044

  *

  ******************************************************************************

  */

/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/

#include "main.h"

#include "cmsis_os.h"

#include "libjpeg.h"

#include "app_touchgfx.h"



/* Private includes ----------------------------------------------------------*/

/* USER CODE BEGIN Includes */

#include "stm32h750b_discovery_qspi.h"

#include "stm32h750b_discovery_sdram.h"

/* USER CODE END Includes */



/* Private typedef -----------------------------------------------------------*/

/* USER CODE BEGIN PTD */



/* USER CODE END PTD */



/* Private define ------------------------------------------------------------*/

/* USER CODE BEGIN PD */

/* USER CODE END PD */



/* Private macro -------------------------------------------------------------*/

/* USER CODE BEGIN PM */



/* USER CODE END PM */



/* Private variables ---------------------------------------------------------*/



CRC_HandleTypeDef hcrc;



DMA2D_HandleTypeDef hdma2d;



JPEG_HandleTypeDef hjpeg;

MDMA_HandleTypeDef hmdma_jpeg_infifo_th;

MDMA_HandleTypeDef hmdma_jpeg_outfifo_th;



LTDC_HandleTypeDef hltdc;



QSPI_HandleTypeDef hqspi;



SDRAM_HandleTypeDef hsdram2;



/* Definitions for defaultTask */

osThreadId_t defaultTaskHandle;

const osThreadAttr_t defaultTask_attributes = {

  .name = "defaultTask",

  .stack_size = 128 * 4,

  .priority = (osPriority_t) osPriorityNormal,

};

/* Definitions for GUITask */

osThreadId_t GUITaskHandle;

const osThreadAttr_t GUITask_attributes = {

  .name = "GUITask",

  .stack_size = 8192 * 4,

  .priority = (osPriority_t) osPriorityNormal,

};

/* Definitions for videoTask */

osThreadId_t videoTaskHandle;

const osThreadAttr_t videoTask_attributes = {

  .name = "videoTask",

  .stack_size = 1000 * 4,

  .priority = (osPriority_t) osPriorityLow,

};

/* USER CODE BEGIN PV */



/* USER CODE END PV */



/* Private function prototypes -----------------------------------------------*/

void SystemClock_Config(void);

static void MPU_Config(void);

static void MX_GPIO_Init(void);

static void MX_MDMA_Init(void);

static void MX_LTDC_Init(void);

static void MX_DMA2D_Init(void);

static void MX_QUADSPI_Init(void);

static void MX_FMC_Init(void);

static void MX_JPEG_Init(void);

static void MX_CRC_Init(void);

void StartDefaultTask(void *argument);

extern void TouchGFX_Task(void *argument);

extern void videoTaskFunc(void *argument);



/* USER CODE BEGIN PFP */



/* USER CODE END PFP */



/* Private user code ---------------------------------------------------------*/

/* USER CODE BEGIN 0 */



/* USER CODE END 0 */



/**

  * @brief  The application entry point.

  * @retval int

  */

int main(void)

{

  /* USER CODE BEGIN 1 */



  /* USER CODE END 1 */



  /* MPU Configuration--------------------------------------------------------*/

  MPU_Config();



  /* Enable I-Cache---------------------------------------------------------*/

  SCB_EnableICache();



  /* Enable D-Cache---------------------------------------------------------*/

  SCB_EnableDCache();



  /* MCU Configuration--------------------------------------------------------*/



  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */

  HAL_Init();



  /* USER CODE BEGIN Init */



  /* USER CODE END Init */



  /* Configure the system clock */

  SystemClock_Config();



  /* USER CODE BEGIN SysInit */

  /* Explicit enabling interrupt to support debugging in CubeIDE when using external flash loader */

  __enable_irq();

  /* USER CODE END SysInit */



  /* Initialize all configured peripherals */

  MX_GPIO_Init();

  MX_MDMA_Init();

  MX_LTDC_Init();

  MX_DMA2D_Init();

  MX_FMC_Init();

  MX_LIBJPEG_Init();

  MX_JPEG_Init();

  MX_CRC_Init();

  MX_TouchGFX_Init();

  /* Call PreOsInit function */

  MX_TouchGFX_PreOSInit();

  /* USER CODE BEGIN 2 */



  /* USER CODE END 2 */



  /* Init scheduler */

  osKernelInitialize();



  /* USER CODE BEGIN RTOS_MUTEX */

  /* add mutexes, ... */

  /* USER CODE END RTOS_MUTEX */



  /* USER CODE BEGIN RTOS_SEMAPHORES */

  /* add semaphores, ... */

  /* USER CODE END RTOS_SEMAPHORES */



  /* USER CODE BEGIN RTOS_TIMERS */

  /* start timers, add new ones, ... */

  /* USER CODE END RTOS_TIMERS */



  /* USER CODE BEGIN RTOS_QUEUES */

  /* add queues, ... */

  /* USER CODE END RTOS_QUEUES */



  /* Create the thread(s) */

  /* creation of defaultTask */

  defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);



  /* creation of GUITask */

  GUITaskHandle = osThreadNew(TouchGFX_Task, NULL, &GUITask_attributes);



  /* creation of videoTask */

  videoTaskHandle = osThreadNew(videoTaskFunc, NULL, &videoTask_attributes);



  /* USER CODE BEGIN RTOS_THREADS */

  /* add threads, ... */

  /* USER CODE END RTOS_THREADS */



  /* USER CODE BEGIN RTOS_EVENTS */

  /* add events, ... */

  /* USER CODE END RTOS_EVENTS */



  /* Start scheduler */

  osKernelStart();



  /* We should never get here as control is now taken by the scheduler */

  /* Infinite loop */

  /* USER CODE BEGIN WHILE */

  while (1)

  {

    /* USER CODE END WHILE */



    /* USER CODE BEGIN 3 */

  }

  /* USER CODE END 3 */

}



/**

  * @brief System Clock Configuration

  * @retval None

  */

void SystemClock_Config(void)

{

  RCC_OscInitTypeDef RCC_OscInitStruct = {0};

  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};



  /** Supply configuration update enable

  */

  HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);



  /** Configure the main internal regulator output voltage

  */

  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);



  while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}



  /** Macro to configure the PLL clock source

  */

  __HAL_RCC_PLL_PLLSOURCE_CONFIG(RCC_PLLSOURCE_HSE);



  /** Initializes the RCC Oscillators according to the specified parameters

  * in the RCC_OscInitTypeDef structure.

  */

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

  RCC_OscInitStruct.HSEState = RCC_HSE_ON;

  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

  RCC_OscInitStruct.PLL.PLLM = 5;

  RCC_OscInitStruct.PLL.PLLN = 160;

  RCC_OscInitStruct.PLL.PLLP = 2;

  RCC_OscInitStruct.PLL.PLLQ = 4;

  RCC_OscInitStruct.PLL.PLLR = 2;

  RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;

  RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;

  RCC_OscInitStruct.PLL.PLLFRACN = 0;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)

  {

    Error_Handler();

  }



  /** Initializes the CPU, AHB and APB buses clocks

  */

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK

                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2

                              |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;

  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

  RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;

  RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;

  RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;

  RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;

  RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;

  RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;



  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)

  {

    Error_Handler();

  }

}



/**

  * @brief CRC Initialization Function

  * @param None

  * @retval None

  */

static void MX_CRC_Init(void)

{



  /* USER CODE BEGIN CRC_Init 0 */



  /* USER CODE END CRC_Init 0 */



  /* USER CODE BEGIN CRC_Init 1 */



  /* USER CODE END CRC_Init 1 */

  hcrc.Instance = CRC;

  hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_ENABLE;

  hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE;

  hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_NONE;

  hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_DISABLE;

  hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;

  if (HAL_CRC_Init(&hcrc) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN CRC_Init 2 */



  /* USER CODE END CRC_Init 2 */



}



/**

  * @brief DMA2D Initialization Function

  * @param None

  * @retval None

  */

static void MX_DMA2D_Init(void)

{



  /* USER CODE BEGIN DMA2D_Init 0 */



  /* USER CODE END DMA2D_Init 0 */



  /* USER CODE BEGIN DMA2D_Init 1 */



  /* USER CODE END DMA2D_Init 1 */

  hdma2d.Instance = DMA2D;

  hdma2d.Init.Mode = DMA2D_M2M;

  hdma2d.Init.ColorMode = DMA2D_OUTPUT_RGB565;

  hdma2d.Init.OutputOffset = 0;

  hdma2d.LayerCfg[1].InputOffset = 0;

  hdma2d.LayerCfg[1].InputColorMode = DMA2D_INPUT_RGB565;

  hdma2d.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA;

  hdma2d.LayerCfg[1].InputAlpha = 0;

  hdma2d.LayerCfg[1].AlphaInverted = DMA2D_REGULAR_ALPHA;

  hdma2d.LayerCfg[1].RedBlueSwap = DMA2D_RB_REGULAR;

  hdma2d.LayerCfg[1].ChromaSubSampling = DMA2D_NO_CSS;

  if (HAL_DMA2D_Init(&hdma2d) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_DMA2D_ConfigLayer(&hdma2d, 1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN DMA2D_Init 2 */



  /* USER CODE END DMA2D_Init 2 */



}



/**

  * @brief JPEG Initialization Function

  * @param None

  * @retval None

  */

static void MX_JPEG_Init(void)

{



  /* USER CODE BEGIN JPEG_Init 0 */



  /* USER CODE END JPEG_Init 0 */



  /* USER CODE BEGIN JPEG_Init 1 */



  /* USER CODE END JPEG_Init 1 */

  hjpeg.Instance = JPEG;

  if (HAL_JPEG_Init(&hjpeg) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN JPEG_Init 2 */



  /* USER CODE END JPEG_Init 2 */



}



/**

  * @brief LTDC Initialization Function

  * @param None

  * @retval None

  */

static void MX_LTDC_Init(void)

{



  /* USER CODE BEGIN LTDC_Init 0 */



  /* USER CODE END LTDC_Init 0 */



  LTDC_LayerCfgTypeDef pLayerCfg = {0};



  /* USER CODE BEGIN LTDC_Init 1 */



  /* USER CODE END LTDC_Init 1 */

  hltdc.Instance = LTDC;

  hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;

  hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;

  hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;

  hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;

  hltdc.Init.HorizontalSync = 39;

  hltdc.Init.VerticalSync = 8;

  hltdc.Init.AccumulatedHBP = 42;

  hltdc.Init.AccumulatedVBP = 11;

  hltdc.Init.AccumulatedActiveW = 522;

  hltdc.Init.AccumulatedActiveH = 283;

  hltdc.Init.TotalWidth = 528;

  hltdc.Init.TotalHeigh = 285;

  hltdc.Init.Backcolor.Blue = 0;

  hltdc.Init.Backcolor.Green = 0;

  hltdc.Init.Backcolor.Red = 0;

  if (HAL_LTDC_Init(&hltdc) != HAL_OK)

  {

    Error_Handler();

  }

  pLayerCfg.WindowX0 = 0;

  pLayerCfg.WindowX1 = 480;

  pLayerCfg.WindowY0 = 0;

  pLayerCfg.WindowY1 = 272;

  pLayerCfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565;

  pLayerCfg.Alpha = 255;

  pLayerCfg.Alpha0 = 0;

  pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;

  pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;

  pLayerCfg.FBStartAdress = 0;

  pLayerCfg.ImageWidth = 480;

  pLayerCfg.ImageHeight = 272;

  pLayerCfg.Backcolor.Blue = 0;

  pLayerCfg.Backcolor.Green = 0;

  pLayerCfg.Backcolor.Red = 0;

  if (HAL_LTDC_ConfigLayer(&hltdc, &pLayerCfg, 0) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN LTDC_Init 2 */



  /* USER CODE END LTDC_Init 2 */



}



/**

  * @brief QUADSPI Initialization Function

  * @param None

  * @retval None

  */

static void MX_QUADSPI_Init(void)

{



  /* USER CODE BEGIN QUADSPI_Init 0 */

  BSP_QSPI_Init_t qspi_initParams ;

  /* USER CODE END QUADSPI_Init 0 */



  /* USER CODE BEGIN QUADSPI_Init 1 */



  /* USER CODE END QUADSPI_Init 1 */

  /* QUADSPI parameter configuration*/

  hqspi.Instance = QUADSPI;

  hqspi.Init.ClockPrescaler = 3;

  hqspi.Init.FifoThreshold = 1;

  hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_NONE;

  hqspi.Init.FlashSize = 26;

  hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_4_CYCLE;

  hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0;

  hqspi.Init.DualFlash = QSPI_DUALFLASH_ENABLE;

  if (HAL_QSPI_Init(&hqspi) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN QUADSPI_Init 2 */

  qspi_initParams.InterfaceMode = MT25TL01G_QPI_MODE;

  qspi_initParams.TransferRate  = MT25TL01G_DTR_TRANSFER ;

  qspi_initParams.DualFlashMode = MT25TL01G_DUALFLASH_ENABLE;

  BSP_QSPI_DeInit(0);

  if (BSP_QSPI_Init(0, &qspi_initParams) != BSP_ERROR_NONE)

  {

    Error_Handler( );

  }

  if(BSP_QSPI_EnableMemoryMappedMode(0) != BSP_ERROR_NONE)

  {

    Error_Handler( );

  }

  /* USER CODE END QUADSPI_Init 2 */



}



/**

  * Enable MDMA controller clock

  */

static void MX_MDMA_Init(void)

{



  /* MDMA controller clock enable */

  __HAL_RCC_MDMA_CLK_ENABLE();

  /* Local variables */



  /* MDMA interrupt initialization */

  /* MDMA_IRQn interrupt configuration */

  HAL_NVIC_SetPriority(MDMA_IRQn, 5, 0);

  HAL_NVIC_EnableIRQ(MDMA_IRQn);



}



/* FMC initialization function */

static void MX_FMC_Init(void)

{



  /* USER CODE BEGIN FMC_Init 0 */



  /* USER CODE END FMC_Init 0 */



  FMC_SDRAM_TimingTypeDef SdramTiming = {0};



  /* USER CODE BEGIN FMC_Init 1 */



  /* USER CODE END FMC_Init 1 */



  /** Perform the SDRAM2 memory initialization sequence

  */

  hsdram2.Instance = FMC_SDRAM_DEVICE;

  /* hsdram2.Init */

  hsdram2.Init.SDBank = FMC_SDRAM_BANK2;

  hsdram2.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;

  hsdram2.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;

  hsdram2.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;

  hsdram2.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;

  hsdram2.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_3;

  hsdram2.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;

  hsdram2.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;

  hsdram2.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;

  hsdram2.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;

  /* SdramTiming */

  SdramTiming.LoadToActiveDelay = 2;

  SdramTiming.ExitSelfRefreshDelay = 7;

  SdramTiming.SelfRefreshTime = 4;

  SdramTiming.RowCycleDelay = 7;

  SdramTiming.WriteRecoveryTime = 5;

  SdramTiming.RPDelay = 2;

  SdramTiming.RCDDelay = 2;



  if (HAL_SDRAM_Init(&hsdram2, &SdramTiming) != HAL_OK)

  {

    Error_Handler( );

  }



  /* USER CODE BEGIN FMC_Init 2 */

  BSP_SDRAM_DeInit(0);

  if(BSP_SDRAM_Init(0) != BSP_ERROR_NONE)

  {

    Error_Handler( );

  }

  /* USER CODE END FMC_Init 2 */

}



/**

  * @brief GPIO Initialization Function

  * @param None

  * @retval None

  */

static void MX_GPIO_Init(void)

{

  GPIO_InitTypeDef GPIO_InitStruct = {0};



  /* GPIO Ports Clock Enable */

  __HAL_RCC_GPIOK_CLK_ENABLE();

  __HAL_RCC_GPIOG_CLK_ENABLE();

  __HAL_RCC_GPIOI_CLK_ENABLE();

  __HAL_RCC_GPIOE_CLK_ENABLE();

  __HAL_RCC_GPIOB_CLK_ENABLE();

  __HAL_RCC_GPIOJ_CLK_ENABLE();

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOF_CLK_ENABLE();

  __HAL_RCC_GPIOH_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOB, FRAME_RATE_Pin|RENDER_TIME_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LCD_DE_GPIO_Port, LCD_DE_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(VSYNC_FREQ_GPIO_Port, VSYNC_FREQ_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin, GPIO_PIN_SET);



  /*Configure GPIO pin Output Level */

  HAL_GPIO_WritePin(GPIOA, LCD_RESET_Pin|MCU_ACTIVE_Pin, GPIO_PIN_RESET);



  /*Configure GPIO pins : FRAME_RATE_Pin RENDER_TIME_Pin */

  GPIO_InitStruct.Pin = FRAME_RATE_Pin|RENDER_TIME_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_DE_Pin */

  GPIO_InitStruct.Pin = LCD_DE_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LCD_DE_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : VSYNC_FREQ_Pin */

  GPIO_InitStruct.Pin = VSYNC_FREQ_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  HAL_GPIO_Init(VSYNC_FREQ_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_BL_CTRL_Pin */

  GPIO_InitStruct.Pin = LCD_BL_CTRL_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LCD_BL_CTRL_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : LCD_RESET_Pin */

  GPIO_InitStruct.Pin = LCD_RESET_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;

  HAL_GPIO_Init(LCD_RESET_GPIO_Port, &GPIO_InitStruct);



  /*Configure GPIO pin : MCU_ACTIVE_Pin */

  GPIO_InitStruct.Pin = MCU_ACTIVE_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Pull = GPIO_NOPULL;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;

  HAL_GPIO_Init(MCU_ACTIVE_GPIO_Port, &GPIO_InitStruct);



}



/* USER CODE BEGIN 4 */



/* USER CODE END 4 */



/* USER CODE BEGIN Header_StartDefaultTask */

/**

  * @brief  Function implementing the defaultTask thread.

  * @param  argument: Not used

  * @retval None

  */

/* USER CODE END Header_StartDefaultTask */

void StartDefaultTask(void *argument)

{

  /* USER CODE BEGIN 5 */

  /* Infinite loop */

  for(;;)

  {

    osDelay(100);

  }

  /* USER CODE END 5 */

}



/* MPU Configuration */



void MPU_Config(void)

{

  MPU_Region_InitTypeDef MPU_InitStruct = {0};



  /* Disables the MPU */

  HAL_MPU_Disable();



  /** Initializes and configures the Region and the memory to be protected

  */

  MPU_InitStruct.Enable = MPU_REGION_ENABLE;

  MPU_InitStruct.Number = MPU_REGION_NUMBER0;

  MPU_InitStruct.BaseAddress = 0x24000000;

  MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;

  MPU_InitStruct.SubRegionDisable = 0x0;

  MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;

  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;

  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;

  MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;

  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;



  HAL_MPU_ConfigRegion(&MPU_InitStruct);



  /** Initializes and configures the Region and the memory to be protected

  */

  MPU_InitStruct.Number = MPU_REGION_NUMBER1;

  MPU_InitStruct.BaseAddress = 0x90000000;

  MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;

  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;



  HAL_MPU_ConfigRegion(&MPU_InitStruct);



  /** Initializes and configures the Region and the memory to be protected

  */

  MPU_InitStruct.Number = MPU_REGION_NUMBER2;

  MPU_InitStruct.Size = MPU_REGION_SIZE_128MB;

  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;

  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;

  MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;



  HAL_MPU_ConfigRegion(&MPU_InitStruct);



  /** Initializes and configures the Region and the memory to be protected

  */

  MPU_InitStruct.Number = MPU_REGION_NUMBER3;

  MPU_InitStruct.BaseAddress = 0xD0000000;

  MPU_InitStruct.Size = MPU_REGION_SIZE_256MB;

  MPU_InitStruct.AccessPermission = MPU_REGION_NO_ACCESS;

  MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_DISABLE;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;

  MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;



  HAL_MPU_ConfigRegion(&MPU_InitStruct);



  /** Initializes and configures the Region and the memory to be protected

  */

  MPU_InitStruct.Number = MPU_REGION_NUMBER4;

  MPU_InitStruct.Size = MPU_REGION_SIZE_32MB;

  MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;

  MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;



  HAL_MPU_ConfigRegion(&MPU_InitStruct);

  /* Enables the MPU */

  HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);



}



/**

  * @brief  Period elapsed callback in non blocking mode

  * [url=home.php?mod=space&uid=536309]@NOTE[/url]   This function is called  when TIM6 interrupt took place, inside

  * HAL_TIM_IRQHandler(). It makes a direct call to HAL_IncTick() to increment

  * a global variable "uwTick" used as application time base.

  * @param  htim : TIM handle

  * @retval None

  */

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

{

  /* USER CODE BEGIN Callback 0 */



  /* USER CODE END Callback 0 */

  if (htim->Instance == TIM6) {

    HAL_IncTick();

  }

  /* USER CODE BEGIN Callback 1 */



  /* USER CODE END Callback 1 */

}



/**

  * @brief  This function is executed in case of error occurrence.

  * @retval None

  */

void Error_Handler(void)

{

  /* USER CODE BEGIN Error_Handler_Debug */

  /* User can add his own implementation to report the HAL error return state */



  /* USER CODE END Error_Handler_Debug */

}



#ifdef  USE_FULL_ASSERT

/**

  * @brief  Reports the name of the source file and the source line number

  *         where the assert_param error has occurred.

  * @param  file: pointer to the source file name

  * @param  line: assert_param error line source number

  * @retval None

  */

void assert_failed(uint8_t *file, uint32_t line)

{

  /* USER CODE BEGIN 6 */

  /* User can add his own implementation to report the file name and line number,

     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* USER CODE END 6 */

}

#endif /* USE_FULL_ASSERT */

点击编译,也是没有任何问题编译成功


加入一个闪屏效果,点击按钮切换屏幕然后自动切换回来;

这个软件还是有改进空间,很多图片格式不支持,转换起来不叫麻烦。

/* USER CODE BEGIN Header */

/**

  ******************************************************************************

  * File Name          : TouchGFXHAL.cpp

  ******************************************************************************

  * This file is generated by TouchGFX Generator 4.20.0.

  ******************************************************************************

  * @attention

  *

  * Copyright (c) 2022 STMicroelectronics.

  * All rights reserved.

  *

  * This software is licensed under terms that can be found in the LICENSE file

  * in the root directory of this software component.

  * If no LICENSE file comes with this software, it is provided AS-IS.

  *

  ******************************************************************************

  */

/* USER CODE END Header */



#include <TouchGFXHAL.hpp>



/* USER CODE BEGIN TouchGFXHAL.cpp */

#include "main.h"

#include "stm32h7xx.h"

#include <touchgfx/hal/OSWrappers.hpp>

#include "FreeRTOS.h"

#include "task.h"



using namespace touchgfx;



LOCATION_PRAGMA("TouchGFX_Framebuffer")

uint32_t animationBuffer[(480 * 272 * 2 + 3) / 4] LOCATION_ATTRIBUTE_NOLOAD("TouchGFX_Framebuffer");



void TouchGFXHAL::initialize()

{

    // Calling parent implementation of initialize().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.

    // Please note, HAL::initialize() must be called to initialize the framework.



    TouchGFXGeneratedHAL::initialize();

    setFrameBufferStartAddresses((void*)frameBuffer0, (void*)frameBuffer1, (void*)animationBuffer);

    instrumentation.init();

    setMCUInstrumentation(&instrumentation);

    enableMCULoadCalculation(true);

}



void TouchGFXHAL::taskEntry()

{

    enableLCDControllerInterrupt();

    enableInterrupts();



    OSWrappers::waitForVSync();

    backPorchExited();



#if defined(LCD_RESET_GPIO_Port) && defined(LCD_RESET_Pin)

    /* Display Enable */

    HAL_GPIO_WritePin(LCD_RESET_GPIO_Port, LCD_RESET_Pin, GPIO_PIN_SET);

#endif

#if defined(LCD_DE_GPIO_Port) && defined(LCD_DE_Pin)

    /* Data Enable */

    HAL_GPIO_WritePin(LCD_DE_GPIO_Port, LCD_DE_Pin, GPIO_PIN_SET);

#endif

#if defined(LCD_BL_CTRL_GPIO_Port) && defined(LCD_BL_CTRL_Pin)

    /* Backlight Enable */

    HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_Port, LCD_BL_CTRL_Pin, GPIO_PIN_SET);

#endif



    for (;;)

    {

        OSWrappers::waitForVSync();

        backPorchExited();

    }

}



/**

 * Gets the frame buffer address used by the TFT controller.

 *

 * [url=home.php?mod=space&uid=266161]@return[/url] The address of the frame buffer currently being displayed on the TFT.

 */

uint16_t* TouchGFXHAL::getTFTFrameBuffer() const

{

    // Calling parent implementation of getTFTFrameBuffer().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    return TouchGFXGeneratedHAL::getTFTFrameBuffer();

}



/**

 * Sets the frame buffer address used by the TFT controller.

 *

 * @param [in] address New frame buffer address.

 */

void TouchGFXHAL::setTFTFrameBuffer(uint16_t* address)

{

    // Calling parent implementation of setTFTFrameBuffer(uint16_t* address).

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    TouchGFXGeneratedHAL::setTFTFrameBuffer(address);

}



/**

 * This function is called whenever the framework has performed a partial draw.

 *

 * @param rect The area of the screen that has been drawn, expressed in absolute coordinates.

 *

 * [url=home.php?mod=space&uid=8537]@see[/url] flushFrameBuffer().

 */

void TouchGFXHAL::flushFrameBuffer(const touchgfx::Rect& rect)

{

    // Calling parent implementation of flushFrameBuffer(const touchgfx::Rect& rect).

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.

    // Please note, HAL::flushFrameBuffer(const touchgfx::Rect& rect) must

    // be called to notify the touchgfx framework that flush has been performed.



    TouchGFXGeneratedHAL::flushFrameBuffer(rect);



    // If the framebuffer is placed in Write Through cached memory (e.g. SRAM) then we need

    // to flush the Dcache to make sure framebuffer is correct in RAM. That's done

    // using SCB_CleanInvalidateDCache().



    SCB_CleanInvalidateDCache();

}



/**

 * Configures the interrupts relevant for TouchGFX. This primarily entails setting

 * the interrupt priorities for the DMA and LCD interrupts.

 */

void TouchGFXHAL::configureInterrupts()

{

    // Calling parent implementation of configureInterrupts().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    TouchGFXGeneratedHAL::configureInterrupts();

}



/**

 * Used for enabling interrupts set in configureInterrupts()

 */

void TouchGFXHAL::enableInterrupts()

{

    // Calling parent implementation of enableInterrupts().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    TouchGFXGeneratedHAL::enableInterrupts();

}



/**

 * Used for disabling interrupts set in configureInterrupts()

 */

void TouchGFXHAL::disableInterrupts()

{

    // Calling parent implementation of disableInterrupts().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    TouchGFXGeneratedHAL::disableInterrupts();

}



/**

 * Configure the LCD controller to fire interrupts at VSYNC. Called automatically

 * once TouchGFX initialization has completed.

 */

void TouchGFXHAL::enableLCDControllerInterrupt()

{

    // Calling parent implementation of enableLCDControllerInterrupt().

    //

    // To overwrite the generated implementation, omit call to parent function

    // and implemented needed functionality here.



    TouchGFXGeneratedHAL::enableLCDControllerInterrupt();

}



extern "C"

{

    portBASE_TYPE IdleTaskHook(void* p)

    {

        if ((int)p) //idle task sched out

        {

            touchgfx::HAL::getInstance()->setMCUActive(true);

        }

        else //idle task sched in

        {

            touchgfx::HAL::getInstance()->setMCUActive(false);

        }

        return pdTRUE;

    }

}



/* USER CODE END TouchGFXHAL.cpp */



/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

 测试开机动画,加界面切换如下:

---------------------
作者:ROSHEN_007
链接:https://bbs.21ic.com/icview-3275200-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

STM32H750单片机开发板基础代码60例实验例程软件工程源码合集: 实验0 新建工程实验 实验1 跑马灯实验 实验10 电容触摸按键实验 实验11 OLED实验 实验12 内存保护(MPU)实验 实验13 TFTLCD(MCU屏)实验 实验14 SDRAM实验 实验15 LTDC LCD(RGB屏)实验 实验16 USMART调试实验 实验17 RTC实验 实验18 硬件随机数实验 实验19 待机唤醒实验 实验2 按键输入实验 实验20 ADC实验 实验21 内部温度传感器实验 实验22 DAC实验 实验23 PWM DAC实验 实验24 DMA实验 实验25 IIC实验 实验26 IO扩展实验 实验27 光环境传感器实验 实验28 SPI实验 实验29 QSPI实验 实验3 串口通信实验 实验30 485实验 实验31 FDCAN实验 实验32 触摸屏实验 实验33 红外遥控器实验 实验34 DS18B20数字温度传感器实验 实验35 DHT11数字温湿度传感器实验 实验36 ICM20608六轴传感器实验 实验37 无线通信实验 实验38 FLASH模拟EEPROM实验 实验39 摄像头实验 实验4 外部中断实验 实验40 内存管理实验 实验41 SD卡实验 实验42 NAND FLASH实验 实验43 FATFS实验 实验44 汉字显示实验 实验45 图片显示实验 实验46 硬件JPEG解码实验 实验47 照相机实验 实验48 音乐播放器实验 实验49 录音机实验 实验5 独立看门狗实验 实验50 SPDIF(光纤音频)实验 实验51 视频播放器实验 实验52 FPU测试(Julia分形)实验 实验53 DSP测试实验 实验54 手写识别实验 实验55 T9拼音输入法实验 实验56 串口IAP实验 实验57 USB读卡器(Slave)实验 实验58 USB声卡(Slave)实验 实验59 USB虚拟串口(Slave)实验 实验6 窗口看门狗实验 实验60 USB U盘(Host)实验 实验61 USB鼠标键盘实验(Host) 实验62 网络通信实验 实验63 UCOSII实验1-任务调度 实验64 UCOSII实验2-信号量和邮箱 实验65 UCOSII实验3-消息队列、信号量集和软件定时器 实验65 综合例程 实验7 定时器中断实验 实验8 PWM输出实验 实验9 输入捕获实验
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值