/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file octospi.c * @brief This file provides code for the configuration * of the OCTOSPI instances. ****************************************************************************** * @attention * * Copyright (c) 2025 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 "octospi.h" /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ OSPI_HandleTypeDef hospi2; /* OCTOSPI2 init function */ void MX_OCTOSPI2_Init(void) { /* USER CODE BEGIN OCTOSPI2_Init 0 */ /* USER CODE END OCTOSPI2_Init 0 */ OSPIM_CfgTypeDef OSPIM_Cfg_Struct = {0}; OSPI_HyperbusCfgTypeDef sHyperBusCfg = {0}; /* USER CODE BEGIN OCTOSPI2_Init 1 */ /* USER CODE END OCTOSPI2_Init 1 */ hospi2.Instance = OCTOSPI2; hospi2.Init.FifoThreshold = 4; hospi2.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE; hospi2.Init.MemoryType = HAL_OSPI_MEMTYPE_HYPERBUS; hospi2.Init.DeviceSize = 24; hospi2.Init.ChipSelectHighTime = 5; hospi2.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE; hospi2.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0; hospi2.Init.ClockPrescaler = 1; hospi2.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE; hospi2.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_ENABLE; hospi2.Init.ChipSelectBoundary = 25; hospi2.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_USED; if (HAL_OSPI_Init(&hospi2) != HAL_OK) { Error_Handler(); } OSPIM_Cfg_Struct.ClkPort = 2; OSPIM_Cfg_Struct.DQSPort = 2; OSPIM_Cfg_Struct.NCSPort = 2; OSPIM_Cfg_Struct.IOLowPort = HAL_OSPIM_IOPORT_2_LOW; OSPIM_Cfg_Struct.IOHighPort = HAL_OSPIM_IOPORT_2_HIGH; if (HAL_OSPIM_Config(&hospi2, &OSPIM_Cfg_Struct, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { Error_Handler(); } sHyperBusCfg.RWRecoveryTime = 5; sHyperBusCfg.AccessTime = 6; sHyperBusCfg.WriteZeroLatency = HAL_OSPI_LATENCY_ON_WRITE; sHyperBusCfg.LatencyMode = HAL_OSPI_FIXED_LATENCY; if (HAL_OSPI_HyperbusCfg(&hospi2, &sHyperBusCfg, HAL_OSPI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) { Error_Handler(); } /* USER CODE BEGIN OCTOSPI2_Init 2 */ /* USER CODE END OCTOSPI2_Init 2 */ } void HAL_OSPI_MspInit(OSPI_HandleTypeDef* ospiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; if(ospiHandle->Instance==OCTOSPI2) { /* USER CODE BEGIN OCTOSPI2_MspInit 0 */ /* USER CODE END OCTOSPI2_MspInit 0 */ /** Initializes the peripherals clock */ PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_OSPI; PeriphClkInit.OspiClockSelection = RCC_OSPICLKSOURCE_SYSCLK; if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) { Error_Handler(); } /* OCTOSPI2 clock enable */ __HAL_RCC_OSPIM_CLK_ENABLE(); __HAL_RCC_OSPI2_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); HAL_PWREx_EnableVddIO2(); /**OCTOSPI2 GPIO Configuration PI10 ------> OCTOSPIM_P2_IO1 PI9 ------> OCTOSPIM_P2_IO2 PI6 ------> OCTOSPIM_P2_CLK PH12 ------> OCTOSPIM_P2_IO7 PI11 ------> OCTOSPIM_P2_IO0 PG15 ------> OCTOSPIM_P2_DQS PH9 ------> OCTOSPIM_P2_IO4 PI5 ------> OCTOSPIM_P2_NCS PH10 ------> OCTOSPIM_P2_IO5 PH11 ------> OCTOSPIM_P2_IO6 PH8 ------> OCTOSPIM_P2_IO3 */ GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_6|GPIO_PIN_11 |OCTOSPI2_NCS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_OCTOSPIM_P2; HAL_GPIO_Init(GPIOI, &GPIO_InitStruct); GPIO_InitStruct.Pin = OCTOSPI2_IO7_Pin|OCTOSPI2_IO4_Pin|OCTOSPI2_IO5_Pin|OCTOSPI2_IO6_Pin |GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_OCTOSPIM_P2; HAL_GPIO_Init(GPIOH, &GPIO_InitStruct); GPIO_InitStruct.Pin = OCTOSPI2_DQS_Pin; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_OCTOSPIM_P2; HAL_GPIO_Init(OCTOSPI2_DQS_GPIO_Port, &GPIO_InitStruct); /* OCTOSPI2 interrupt Init */ HAL_NVIC_SetPriority(OCTOSPI2_IRQn, 0, 0); HAL_NVIC_EnableIRQ(OCTOSPI2_IRQn); /* USER CODE BEGIN OCTOSPI2_MspInit 1 */ /* USER CODE END OCTOSPI2_MspInit 1 */ } } void HAL_OSPI_MspDeInit(OSPI_HandleTypeDef* ospiHandle) { if(ospiHandle->Instance==OCTOSPI2) { /* USER CODE BEGIN OCTOSPI2_MspDeInit 0 */ /* USER CODE END OCTOSPI2_MspDeInit 0 */ /* Peripheral clock disable */ __HAL_RCC_OSPIM_CLK_DISABLE(); __HAL_RCC_OSPI2_CLK_DISABLE(); /**OCTOSPI2 GPIO Configuration PI10 ------> OCTOSPIM_P2_IO1 PI9 ------> OCTOSPIM_P2_IO2 PI6 ------> OCTOSPIM_P2_CLK PH12 ------> OCTOSPIM_P2_IO7 PI11 ------> OCTOSPIM_P2_IO0 PG15 ------> OCTOSPIM_P2_DQS PH9 ------> OCTOSPIM_P2_IO4 PI5 ------> OCTOSPIM_P2_NCS PH10 ------> OCTOSPIM_P2_IO5 PH11 ------> OCTOSPIM_P2_IO6 PH8 ------> OCTOSPIM_P2_IO3 */ HAL_GPIO_DeInit(GPIOI, GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_6|GPIO_PIN_11 |OCTOSPI2_NCS_Pin); HAL_GPIO_DeInit(GPIOH, OCTOSPI2_IO7_Pin|OCTOSPI2_IO4_Pin|OCTOSPI2_IO5_Pin|OCTOSPI2_IO6_Pin |GPIO_PIN_8); HAL_GPIO_DeInit(OCTOSPI2_DQS_GPIO_Port, OCTOSPI2_DQS_Pin); /* OCTOSPI2 interrupt Deinit */ HAL_NVIC_DisableIRQ(OCTOSPI2_IRQn); /* USER CODE BEGIN OCTOSPI2_MspDeInit 1 */ /* USER CODE END OCTOSPI2_MspDeInit 1 */ } } /* USER CODE BEGIN 1 */ /* USER CODE END 1 */