STM Урок 62. FMC SDRAM. Часть 3

 

 

 

 

Урок 62

 

Часть 3

 

FMC SDRAM

 

 

В прошлой части нашего занятия мы настроили наш контроллер FMC, сгенерировали и настроили проект, а также проверили заготовку проекта на мигание светодиода.

Теперь начнём инициализацию нашего FMC, так как любая периферия в этом обязательно нуждается.

Добавим функцию инициализации в файл MT48LC4M32B2.c

 

void MT48LC4M32B2_Init(SDRAM_HandleTypeDef *hsdram)

{


}

 

Сделаем ей прототип и вызовем в main()

 

  /* USER CODE BEGIN 2 */

 MT48LC4M32B2_Init(&hsdram1);

 

Также в в файле MT48LC4M32B2.c добавим глобальную переменную для команды FMC ещё одну для статуса возврата из функций HAL

 

#include "MT48LC4M32B2.h"

FMC_SDRAM_CommandTypeDef command;


HAL_StatusTypeDef hal_stat;

 

Теперь можно начинать писать функцию инициализации.

Создадим там неоптимизируемую локальную переменную и отправим первую команду в FMC

 

void MT48LC4M32B2_Init(SDRAM_HandleTypeDef *hsdram)

{

 __IO uint32_t tmpmrd =0;

  command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;

  command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;

  command.AutoRefreshNumber = 1;

  command.ModeRegisterDefinition = 0;

  hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT);

  HAL_Delay(1);

}

 

Задержка нужна для того, чтобы команда выполнилась, а также она будет нам удобна для того, чтобы на неё встал указатель выполнения кода при отладке, чтобы посмотреть статус.

В данной команде мы включаем тактирование, обращение именно к 1 банку памяти, одно автообновление (бывает от 1 до 16). В регистр режимов ничего не заносим.

 

Давайте поставим на данную задержку точку останова, скомпилируем код, зайдём в отладку, запустим на выполнение и после остановки в данной точке посмотрим статус

 

image21

 

Всё нормально!

Давайте посмотрим данный регистр режимов. Он умеет очень многое, конечно все его возможности мы в рамках данного занятия разбирать не будем, так как нам они ни к чему. У нас задача засчет FMC сделать память плоскою для того, чтобы к ней было удобно обращаться для записи и чтения

 

Defines the number of consecutive auto refresh command issued

                                              in auto refresh mode.

                                              This parameter can be a value between Min_Data = 1 and Max_Data = 16

 

image20

 

Данный регистр умеет хранить в себе определённые настройки, глядя на которые, SDRAM в определённых условиях ведёт себя тем или иным образом.

 

 

Здесь настраивается режим и тип BRUST, длина пакета, латентность, режим операции.

Вот такой вот, вообщем, регистр. К нему мы ещё вернёмся.

Отправим следующую команду в функции инициализации

 

  HAL_Delay(1);

  command.CommandMode = FMC_SDRAM_CMD_PALL;

  command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;

  command.AutoRefreshNumber = 1;

  command.ModeRegisterDefinition = 0;

  hal_stat = HAL_SDRAM_SendCommand(hsdram, &command, SDRAM_TIMEOUT);

  HAL_Delay(1);

 

Здесь задержка в принципе не нужна и мы её используем только в целях посмотреть статус возврата.

Здесь мы отправляем уже другую команду FMC_SDRAM_CMD_PALL, которая деактивирует все банки памяти перед регенеацией (PALL — precharged all).

Также соберем код и проверим статус в отладке.

Так как команд у нас будет ещё много, то займёмся мы этим делом в следующей части нашего урока.

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

Техническая документация на микросхему SDRAM MT48LC4M32B2

 

 

Отладочную плату можно приобрести здесь 32F746G-DISCOVERY

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

STM32 FMC SDRAM

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*