Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F4xx, работа с FSMC через DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
esaulenka
Ситуация. Есть STM32F4xx с внешней шиной, на которой висят SRAM и NAND.

Вздумалось мне оптимизировать код, и в функции чтения NAND конструкцию
Код
    for (i = 2112/4; i; i--)
        *buffer32 ++ = (*(volatile uint32_t *)(BANK_NAND_ADDR | NAND_DATA_AREA));

заменил работой с DMA (использую DMA2, Stream0)

Всё работает прекрасно, пока буфер находится во внутренней памяти. Но стоит перенести его во внешнюю память, DMA ломается.
Счётчик данных уменьшается на 32 dword'а (я 32-битными данными работаю, адреса выровнены), регистр FIFO сообщает, что FIFO пустое.
А дальше - всё - счётчик данных "тикать" больше не хочет, биты в регистре статуса не устанавливается, enable не сбрасывается.

Это фича такая? Что-то я нигде описания не нашёл...
adnega
Цитата(esaulenka @ Aug 25 2014, 23:16) *
Это фича такая? Что-то я нигде описания не нашёл...

А errata на этот счет что говорит?
У 427 на эту тему (FMC через DMA) ахтунг есть)
esaulenka
errata на статическую память коротенькая, это в более новых камнях с SDRAM треш и угар какой-то...

Методом тыка обнаружил, что отключение burst приводит к нормальной работе.
Документация только требует, чтобы для burst адреса все были выровнены (это я делаю, причём с запасом - там требования к границе 1 килобайт, я выравниваю на мегабайт - в тестовом коде не жалко). Больше никаких требований нету...

Странно всё это. И жалко - burst во внутреннее ОЗУ работает на 10% быстрее.


Update.
Как и следовало ожидать, самдурак.
В документации есть раздел "FIFO threshold and burst configuration" - там многие варианты запрещены. Почему оно работало с внутренним ОЗУ - загадка...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.