Skip to main content
ranran
Senior
January 7, 2019
Solved

NOR flash and Ethernet interfere each other in MPU ?

  • January 7, 2019
  • 2 replies
  • 648 views

Hello,

I have some strange behaviour:

After adding external flash configuration to my application, the Ethernet stopped working (no ping).

I validated that the following added code is responsible for this failure, but I don't understand why these configuration should interfere with each other:

#define NOR_BANK_ADDR ((uint32_t)0x60000000)
#define PROGRAM_TIMEOUT ((uint32_t)0x00004400) /* NOR program timeout */
#define ERASE_TIMEOUT ((uint32_t)0x00A00000) /* NOR erase timeout */
 
static void MPU_Config(void)
{
 MPU_Region_InitTypeDef MPU_InitStruct;
 
 /* Disable the MPU */
 HAL_MPU_Disable();
 
 /* Configure the MPU attributes as Device not cacheable 
 for ETH DMA descriptors */
 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
 MPU_InitStruct.BaseAddress = 0x30040000;
 MPU_InitStruct.Size = MPU_REGION_SIZE_256B;
 MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
 MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;
 MPU_InitStruct.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
 MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
 MPU_InitStruct.Number = MPU_REGION_NUMBER0;
 MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
 MPU_InitStruct.SubRegionDisable = 0x00;
 MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
 
 HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
 /* Configure the MPU attributes as Cacheable write through 
 for LwIP RAM heap which contains the Tx buffers */
 MPU_InitStruct.Enable = MPU_REGION_ENABLE;
 MPU_InitStruct.BaseAddress = 0x30044000;
 MPU_InitStruct.Size = MPU_REGION_SIZE_16KB;
 MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
 MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
 MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
 MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
 MPU_InitStruct.Number = MPU_REGION_NUMBER1;
 MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
 MPU_InitStruct.SubRegionDisable = 0x00;
 MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
 
 HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
 
 /* Configure the MPU attributes as WT for NOR */
+ MPU_InitStruct.Enable = MPU_REGION_ENABLE;
+ MPU_InitStruct.BaseAddress = NOR_BANK_ADDR;
+ MPU_InitStruct.Size = MPU_REGION_SIZE_16MB;
+ MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
+ MPU_InitStruct.IsBufferable = MPU_ACCESS_NOT_BUFFERABLE;
+ MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;
+ MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;
+ MPU_InitStruct.Number = MPU_REGION_NUMBER0;
+ MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL0;
+ MPU_InitStruct.SubRegionDisable = 0x00;
+ MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;
 
+ HAL_MPU_ConfigRegion(&MPU_InitStruct);
 
 
 /* Enable the MPU */
 HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);
}

Thank you for any idea,

ran

This topic has been closed for replies.
Best answer by Piranha

Your NOR configuration is reconfiguring the same MPU_REGION_NUMBER0 which is used for ETH descriptors.

2 replies

Piranha
PiranhaBest answer
Principal III
January 7, 2019

Your NOR configuration is reconfiguring the same MPU_REGION_NUMBER0 which is used for ETH descriptors.

ranran
ranranAuthor
Senior
January 7, 2019

Right, silly me.