esaulenka 7 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба Ситуация. Есть 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 11 25 августа, 2014 Опубликовано 25 августа, 2014 · Жалоба Это фича такая? Что-то я нигде описания не нашёл... А errata на этот счет что говорит? У 427 на эту тему (FMC через DMA) ахтунг есть) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 26 августа, 2014 Опубликовано 26 августа, 2014 · Жалоба errata на статическую память коротенькая, это в более новых камнях с SDRAM треш и угар какой-то... Методом тыка обнаружил, что отключение burst приводит к нормальной работе. Документация только требует, чтобы для burst адреса все были выровнены (это я делаю, причём с запасом - там требования к границе 1 килобайт, я выравниваю на мегабайт - в тестовом коде не жалко). Больше никаких требований нету... Странно всё это. И жалко - burst во внутреннее ОЗУ работает на 10% быстрее. Update. Как и следовало ожидать, самдурак. В документации есть раздел "FIFO threshold and burst configuration" - там многие варианты запрещены. Почему оно работало с внутренним ОЗУ - загадка... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться