summaryrefslogblamecommitdiff
path: root/stm32-sdram.c
blob: 16386e8d8a688866e90b72cb3703c803eec5ca7e (plain) (tree)









































































































                                                                                                                                                                                                          
//-----------------------------------------------------------------------------
// stm32-sdram.c
//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
// Headers
//-----------------------------------------------------------------------------
#include "stm32f4xx_hal.h"
#include "stm32-sdram.h"


//-----------------------------------------------------------------------------
int sdram_init(SDRAM_HandleTypeDef *sdram1, SDRAM_HandleTypeDef *sdram2)
//-----------------------------------------------------------------------------
{
	HAL_StatusTypeDef ok;						// status
	FMC_SDRAM_CommandTypeDef cmd;		// command

	
		//
		// enable clocking
		//
	cmd.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
	cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
	cmd.AutoRefreshNumber = 1;
	cmd.ModeRegisterDefinition = 0;
	
	HAL_Delay(1);
	ok = HAL_SDRAM_SendCommand(sdram1, &cmd, 1);
	if (ok != HAL_OK) return 0;
	
		//
		// precharge all banks
		//
	cmd.CommandMode = FMC_SDRAM_CMD_PALL;
	cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
	cmd.AutoRefreshNumber = 1;
	cmd.ModeRegisterDefinition = 0;
	
	HAL_Delay(1);
	ok = HAL_SDRAM_SendCommand(sdram1, &cmd, 1);
	if (ok != HAL_OK) return 0;
	
	
		//
		// send two auto-refresh commands in a row
		//
	cmd.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
	cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
	cmd.AutoRefreshNumber = 1;
	cmd.ModeRegisterDefinition = 0;
		
	ok = HAL_SDRAM_SendCommand(sdram1, &cmd, 1);
	if (ok != HAL_OK) return 1;
		
	ok = HAL_SDRAM_SendCommand(sdram1, &cmd, 1);
	if (ok != HAL_OK) return 1;	
	
		
		//
		// load mode register
		//
	cmd.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
	cmd.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;
	cmd.AutoRefreshNumber = 1;
	cmd.ModeRegisterDefinition = 	SDRAM_MODEREG_BURST_LENGTH_1					|
																SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL		|
																SDRAM_MODEREG_CAS_LATENCY_2						|
																SDRAM_MODEREG_OPERATING_MODE_STANDARD	|
																SDRAM_MODEREG_WRITEBURST_MODE_SINGLE	;

	ok = HAL_SDRAM_SendCommand(sdram1, &cmd, 1);
	if (ok != HAL_OK) return 1;


		//
		// set number of consequtive auto-refresh commands
		// and program refresh rate
		//

		//
		// RefreshRate = 64 ms / 8192 cyc = 7.8125 us/cyc
		//
		// RefreshCycles = 7.8125 us * 90 MHz = 703
		//
		// According to the formula on p.1665 of the reference manual,
		// we also need to subtract 20 from the value, so the target
		// refresh rate is 703 - 20 = 683.
		//
		
	ok = HAL_SDRAM_SetAutoRefreshNumber(sdram1, 8);
	if (ok != HAL_OK) return 1;

	HAL_SDRAM_ProgramRefreshRate(sdram1, 683);
	if (ok != HAL_OK) return 1;
	
	
		// done
	return 1;
}


//-----------------------------------------------------------------------------
// End-of-File
//-----------------------------------------------------------------------------