Skip to main content
Lsy.1
Associate
July 29, 2021
Solved

[Solved]Writing external SRAM cause Hardfault - 32L496GDiscovery

  • July 29, 2021
  • 1 reply
  • 2210 views

By learning from example STM32Cube_FW_L4_V1.15.1\Projects\32L496GDISCOVERY\Examples\FMC\FMC_SRAM, I tried to setup a simple SRAM program in STM32CubeIDE 1.7.0.

When I was asked if I want to init peripheral or not , I select YES. Then I changed Clock and FMC settings according to the example.

My current setup looks like this:

Writing the SRAM (just before the while(1) loop in main()):

#define SRAM_BANK_ADDR ((uint32_t)0x64000000)
*(__IO uint16_t *)(SRAM_BANK_ADDR) = (uint16_t)0x0A0B;
while(1) {}

Config System Clock:

void SystemClock_Config(void)
{
 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
 
 /** Initializes the RCC Oscillators according to the specified parameters
 * in the RCC_OscInitTypeDef structure.
 */
 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_MSI;
 RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
 RCC_OscInitStruct.MSIState = RCC_MSI_ON;
 RCC_OscInitStruct.MSICalibrationValue = 0;
 RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
 RCC_OscInitStruct.PLL.PLLM = 1;
 RCC_OscInitStruct.PLL.PLLN = 40;
 RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
 RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV4;
 RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
 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_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
 RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
 
 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
 {
 Error_Handler();
 }
 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_USART2
 |RCC_PERIPHCLK_LPUART1|RCC_PERIPHCLK_SAI1
 |RCC_PERIPHCLK_I2C1|RCC_PERIPHCLK_I2C2
 |RCC_PERIPHCLK_DFSDM1|RCC_PERIPHCLK_USB
 |RCC_PERIPHCLK_SDMMC1|RCC_PERIPHCLK_ADC;
 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
 PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
 PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1;
 PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;
 PeriphClkInit.I2c2ClockSelection = RCC_I2C2CLKSOURCE_PCLK1;
 PeriphClkInit.Sai1ClockSelection = RCC_SAI1CLKSOURCE_PLLSAI1;
 PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1;
 PeriphClkInit.Dfsdm1ClockSelection = RCC_DFSDM1CLKSOURCE_PCLK;
 PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
 PeriphClkInit.Sdmmc1ClockSelection = RCC_SDMMC1CLKSOURCE_HSI48;
 PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI;
 PeriphClkInit.PLLSAI1.PLLSAI1M = 1;
 PeriphClkInit.PLLSAI1.PLLSAI1N = 20;
 PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV2;
 PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2;
 PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2;
 PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_SAI1CLK|RCC_PLLSAI1_ADC1CLK;
 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
 {
 Error_Handler();
 }
 /** Configure the main internal regulator output voltage
 */
 if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
 {
 Error_Handler();
 }
}

Config FMC:

static void MX_FMC_Init(void)
{
 
 /* USER CODE BEGIN FMC_Init 0 */
 
 /* USER CODE END FMC_Init 0 */
 
 FMC_NORSRAM_TimingTypeDef Timing = {0};
 
 /* USER CODE BEGIN FMC_Init 1 */
 
 /* USER CODE END FMC_Init 1 */
 
 /** Perform the SRAM1 memory initialization sequence
 */
 hsram1.Instance = FMC_NORSRAM_DEVICE;
 hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
 /* hsram1.Init */
 hsram1.Init.NSBank = FMC_NORSRAM_BANK2;
 hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
 hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
 hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
 hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
 hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
 hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
 hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_DISABLE;
 hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
 hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
 hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
 hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
 hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
 hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
 hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
 /* Timing */
 Timing.AddressSetupTime = 5;
 Timing.AddressHoldTime = 1;
 Timing.DataSetupTime = 3;
 Timing.BusTurnAroundDuration = 1;
 Timing.CLKDivision = 2;
 Timing.DataLatency = 2;
 Timing.AccessMode = FMC_ACCESS_MODE_A;
 /* ExtTiming */
 
 if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
 {
 Error_Handler( );
 }
 
 /** Perform the SRAM2 memory initialization sequence
 */
 hsram2.Instance = FMC_NORSRAM_DEVICE;
 hsram2.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
 /* hsram2.Init */
 hsram2.Init.NSBank = FMC_NORSRAM_BANK1;
 hsram2.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
 hsram2.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
 hsram2.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
 hsram2.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
 hsram2.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
 hsram2.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
 hsram2.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
 hsram2.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
 hsram2.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
 hsram2.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
 hsram2.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
 hsram2.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
 hsram2.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
 hsram2.Init.PageSize = FMC_PAGE_SIZE_NONE;
 /* Timing */
 Timing.AddressSetupTime = 15;
 Timing.AddressHoldTime = 15;
 Timing.DataSetupTime = 255;
 Timing.BusTurnAroundDuration = 15;
 Timing.CLKDivision = 16;
 Timing.DataLatency = 17;
 Timing.AccessMode = FMC_ACCESS_MODE_A;
 /* ExtTiming */
 
 if (HAL_SRAM_Init(&hsram2, &Timing, NULL) != HAL_OK)
 {
 Error_Handler( );
 }
 
 /* USER CODE BEGIN FMC_Init 2 */
 
 /* USER CODE END FMC_Init 2 */
}

Everything else is automatically generated by STM32CubeIDE. I have tried to change FMC_MEMORY_TYPE_SRAM to PSRAM because the schematic said it is a PSRAM but nothing changed. I have compared my code with the example but failed to find any significant difference. So I am here for some help.

This topic has been closed for replies.
Best answer by Lsy.1

I have solved my problem by changing FMC_WRITE_OPERATION_DISABLE to FMC_WRITE_OPERATION_ENABLE.

1 reply

Lsy.1
Lsy.1AuthorBest answer
Associate
July 29, 2021

I have solved my problem by changing FMC_WRITE_OPERATION_DISABLE to FMC_WRITE_OPERATION_ENABLE.