cancel
Showing results for 
Search instead for 
Did you mean: 

STM32H7B3I-DK OctoSPI Memory Mapped Mode disable/enable problem

Tomasz Ozon
Associate III

I've created a project using STM32H7B3I-DK eval board with all settings default, unmodified, taken from TouchGFX. UI menu is working fine with some resources stored in OSPI Flash memory.

Now I wish to store some data in this OSPI memory. The procedure should be to disable Memory Mapped Mode, erase, write and enable Memory Mapped Mode again. All this I do with task switch disabled so that TouchGFX doesn't access OSPI Flash during the process.

I have problems with switching from Memory Mapped Mode to Indirect Mode and returning to MMP again.

I have modified MX_OCTOSPI1_Init() function by adding a test loop at the end to use it as a test procedure (memory settings are not modified).

static void MX_OCTOSPI1_Init(void)

{

 /* USER CODE BEGIN OCTOSPI1_Init 0 */

 /* USER CODE END OCTOSPI1_Init 0 */

 /* USER CODE BEGIN OCTOSPI1_Init 1 */

 /* USER CODE END OCTOSPI1_Init 1 */

 /* OCTOSPI1 parameter configuration*/

 hospi1.Instance = OCTOSPI1;

 hospi1.Init.FifoThreshold = 1;

 hospi1.Init.DualQuad = HAL_OSPI_DUALQUAD_DISABLE;

 hospi1.Init.MemoryType = HAL_OSPI_MEMTYPE_MICRON;

 hospi1.Init.DeviceSize = 26;

 hospi1.Init.ChipSelectHighTime = 2;

 hospi1.Init.FreeRunningClock = HAL_OSPI_FREERUNCLK_DISABLE;

 hospi1.Init.ClockMode = HAL_OSPI_CLOCK_MODE_0;

 hospi1.Init.WrapSize = HAL_OSPI_WRAP_NOT_SUPPORTED;

 hospi1.Init.ClockPrescaler = 3;

 hospi1.Init.SampleShifting = HAL_OSPI_SAMPLE_SHIFTING_NONE;

 hospi1.Init.DelayHoldQuarterCycle = HAL_OSPI_DHQC_DISABLE;

 hospi1.Init.ChipSelectBoundary = 0;

 hospi1.Init.ClkChipSelectHighTime = 0;

 hospi1.Init.DelayBlockBypass = HAL_OSPI_DELAY_BLOCK_BYPASSED;

 hospi1.Init.MaxTran = 0;

 hospi1.Init.Refresh = 0;

 if (HAL_OSPI_Init(&hospi1) != HAL_OK)

 {

   Error_Handler();

 }

 /* USER CODE BEGIN OCTOSPI1_Init 2 */

 BSP_OSPI_NOR_Init_t Flash;

 Flash.InterfaceMode = BSP_OSPI_NOR_OPI_MODE;

 Flash.TransferRate = BSP_OSPI_NOR_DTR_TRANSFER;

 BSP_OSPI_NOR_DeInit(0);

 int32_t RetVal = BSP_OSPI_NOR_Init(0, &Flash);

 if(RetVal != BSP_ERROR_NONE)

 {

   Error_Handler();

 }

 RetVal = BSP_OSPI_NOR_EnableMemoryMappedMode(0);

 if(RetVal != BSP_ERROR_NONE)

 {

   Error_Handler();

 }

//test loop

 #define BLOCK_SIZE 4096

 static uint8_t blockBuf[BLOCK_SIZE];

 for(int i = 5; i < 15; i++)

 {

   bool ok = true;

   if(BSP_OSPI_NOR_DisableMemoryMappedMode(0) != BSP_ERROR_NONE) ok = false;

   if(BSP_OSPI_NOR_Erase_Block(0, 0, MX25LM51245G_ERASE_4K) != BSP_ERROR_NONE) ok = false;

   if(BSP_OSPI_NOR_EnableMemoryMappedMode(0) != BSP_ERROR_NONE) ok = false;

   memcpy(blockBuf, (uint8_t*)0x90000000, BLOCK_SIZE);

   //now I expect to see 0xff... in the buffer

   if(BSP_OSPI_NOR_DisableMemoryMappedMode(0) != BSP_ERROR_NONE) ok = false;

   memset(blockBuf, i, BLOCK_SIZE); //put some data to the buffer

   if(BSP_OSPI_NOR_Write(0, blockBuf, 0, BLOCK_SIZE) != BSP_ERROR_NONE) ok = false;

   memset(blockBuf, 0, BLOCK_SIZE); //clear buffer

   if(BSP_OSPI_NOR_EnableMemoryMappedMode(0) != BSP_ERROR_NONE) ok = false;

   memcpy(blockBuf, (uint8_t*)0x90000000, BLOCK_SIZE);

   //now I expect to see data in the buffer, but I see 0xff...

 }

 /* USER CODE END OCTOSPI1_Init 2 */

}

I can see memory block being erased, but not written. If I remove Memory Mapped Mode enter/exit functions memory erase and write works fine.

Do you know a reason for that?

12 REPLIES 12
GChau.2
Associate II

I do not know how to insert project, if you need it do not hesitate to contact me.

Hi,

I was having the same issue and the only solution I found is to Deinit and Re Init the perpheral again but force it to indirect mode!

    HAL_OSPI_DeInit(&hospi1);

    HAL_OSPI_Init(&hospi1);

I don't know why Abort function doesn't work in OSPI while it is working perfectly in QSPI periph. Really biiig question???

Inside HAL_OSPI_Init, you should set this instruction:

/* Go to Indirect mode. Always Init as Indirect Mode */

   MODIFY_REG(hospi->Instance->CR, (OCTOSPI_CR_TCEN | OCTOSPI_CR_FMODE),

      (0x00 | 0x00));

I am using it for XIP but doesn't work with big frequencies as the switch takes place many times.

javqui
Associate II

Have the same issue here.
The HAL_OSPI_Abort is not doing the right thing.
The quick workaround in my case was just reinitialize the OctoSPI. Is a big penalty resource in terms of time to execute it.