Урок 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). В регистр режимов ничего не заносим.
Давайте поставим на данную задержку точку останова, скомпилируем код, зайдём в отладку, запустим на выполнение и после остановки в данной точке посмотрим статус
Всё нормально!
Давайте посмотрим данный регистр режимов. Он умеет очень многое, конечно все его возможности мы в рамках данного занятия разбирать не будем, так как нам они ни к чему. У нас задача засчет 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
Данный регистр умеет хранить в себе определённые настройки, глядя на которые, 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
Смотреть ВИДЕОУРОК (нажмите на картинку)
Добавить комментарий