티스토리 뷰

STM32Fxx

STM32F429 - SDRAM

라이다 2018. 11. 21. 11:57
반응형

21. SDRAM(Synchronous Dynamic RAM)

           -동기식 DRAM이라고도 불리며 빠른 속도로 데이터 입출력이 가능한 메모리이다

           -아래 예제는 SDRAM 메모리를 제어한다

 


STM32F429 Discovery Board에는 External Bank2 위치에 장착되어 있다

현재 장착되어 있는 SDRAM64MBIT 크기다

한 주소번지당 1Byte의 데이터를 가르키므로 주소번지는 8MB , 0xD000 0000 ~ 0xD07F FFFF까지 사용이 가능하다

 

 

 

 

STM32F429 Discovery SDRAM 회로도

위 그림은 STM32F429 Discovery Board의 회로도 이다. SDCKE1, SDNE1자리에 SDRAM이 장착 되어 있기 때문에 CUBE MX에서 SDCKE1, SDNE1 (Internal Bank2)을 선택할 예정이다.



Internal Bank 구성도


CUBE MX 설정



STM32F429-Discovery Board에 있는 SDRAMIS42S16400J-7이므로 Key TIMING PARAMETERS에서 -7을 보면 된다

이번 설정에서는 CAS Latency = 2를 이용할 것이다.

CAS Latency = 2일 경우 최대 clock = 133Mhz 가능하며 현재 이번 설정은 100Mhz/2(SDRAM common clock) = 50Mhz로 사용 가능하다

16-bit byte enable: 미체크시 데이터가 마음대로 바뀜.

Write Protection: 쓰기 금지를 설정 여부

SDRAM common clock: SDRAM에 공급되는 클럭값을 설정한다 현재 2HCLK clock cycles이므로 100Mhz(HCLK) / 2 = 50Mhz의 클럭이 SDRAM에 공급된다

 

SDRAM common burst read: 버스트 읽기 모드를 활성화합니다. SDRAM 컨트롤러는 CAS 대기 시간 동안 다음 읽기 명령을 예상하고 읽기 FIFO 데이터를 저장합니다.
FMC_SDCR2
레지스터의 해당 비트는 상관 없습니다.(해당 기능의 설명 번역)

 

SDRAM common read pipe delay: CAS 대기 시간 데이터를 읽기위한 HCLK 클록 사이클의 지연을 지정합니다.(해당 기능의 설명 번역)



SDRAM CLK Frequency = 50Mhz

SDRAM CLK Period = 20ns

Load mode register to active delay(tMRD): 2

Exit self-refresh delay(tXSR): 4 (20ns*4 > 70ns)

Self-refresh time(tRAS): 3(20ns*3> 42ns)

SDRAM common row cycle delay(tRC): 4 (20ns*4 > 63ns)

Write recovery time(tWR): 2

SDRAM common row precharge delay(tRP): 1 (20ns*1 > 15ns)

Row to column delay(tRCD): 1(20ns*1 > 15ns)

 

소스코드

/* USER CODE BEGIN PV */

/* Private variables ---------------------------------------------------------*/

FMC_SDRAM_CommandTypeDef command;

/* USER CODE END PV */

 

/* USER CODE BEGIN PFP */

/* Private function prototypes -----------------------------------------------*/

static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram,

FMC_SDRAM_CommandTypeDef *Command);

/* USER CODE END PFP */

 

/* USER CODE BEGIN 2 */

  SDRAM_Initialization_Sequence(&hsdram1, &command);

  *(__IO uint32_t*) (0xd0000000) = 0x12345678;

 

/* USER CODE END 2 */

 

/* USER CODE BEGIN 4 */

static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram,

                                          FMC_SDRAM_CommandTypeDef *Command){

       __IO uint32_t tmpmrd = 0;

 

       /* Step 3:  Configure a clock configuration enable command */

       Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;

       Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

       Command->AutoRefreshNumber = 1;

       Command->ModeRegisterDefinition = 0;

      

       /* Send the command */

       HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

 

       /* Step 4: Insert 100 ms delay */

       HAL_Delay(100);

 

       /* Step 5: Configure a PALL (precharge all) command */

       Command->CommandMode = FMC_SDRAM_CMD_PALL;

       Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

       Command->AutoRefreshNumber = 1;

       Command->ModeRegisterDefinition = 0;

 

       /* Send the command */

       HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

 

       /* Step 6 : Configure a Auto-Refresh command */

       Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;

       Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

       Command->AutoRefreshNumber = 4;

       Command->ModeRegisterDefinition = 0;

 

       /* Send the command */

       HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

 

       /* Step 7: Program the external memory mode register */

       // Write burst: single location access

       // Standard operation, CAS latency: 2, Sequential

       // Burst length: 2

       tmpmrd = (uint32_t) 0x00000221;

       Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;

       Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

       Command->AutoRefreshNumber = 1;

       Command->ModeRegisterDefinition = tmpmrd;

 

       /* Send the command */

       HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

 

       /* Step 8: Set the refresh rate counter */

       // refresh rate = refresh period / number of rows

       // refresh rate = 64ms / 4096 = 15.62us

       // refresh count = (refresh rate x SDRAM clock frequency) - 20

       // refresh count = 15.62us x 25MHz - 20 = 369

       HAL_SDRAM_ProgramRefreshRate(hsdram, 369);

}

/* USER CODE END 4 */

 

 

실행 결과

0xD000 0000 주소번지에 0x1234 5678의 값이 저장되어있다.






반응형

'STM32Fxx' 카테고리의 다른 글

STM32F429 - ADC DMA  (0) 2018.11.21
STM32F429 - SPI DMA  (1) 2018.11.10
STM32F429 - UART DMA  (0) 2018.11.10
STM32F429-TIM DMA  (0) 2018.11.08
STM32F429-DMA IT (Direct Memory Access Interrupt)  (0) 2018.11.08
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함