- /* 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****/
测试开机动画,加界面切换如下: