Николандр 0 21 августа, 2018 Опубликовано 21 августа, 2018 (изменено) · Жалоба Добрый день, форумчане! Мы перешли на наших платах с STM32F429 на STM32H743. Сейчас пытаюсь оживить SDRAM (MT48LC16M16A2). Ввиду того, что регистры у FMC аналогичны (за исключением двух вещей: нет статусного сигнала BUSY и необходимо после настройки включать FMC в регистре FMC_BCR1), перетянул настройку SDRAM с контроллера STM32F4. Внутреннюю частоту (120 МГц) и частоту SDRAM (60 МГц) настроил точно также как и STM32F4. Повторюсь, снял с платы F4 и поставил H7 для освоения. Пишу по 16 бит без burst режима. Ремап не делал. Пишу по адресу 0xC0000000 (банк 1 SDRAM) и добавляю смещение. Но вот почему-то не хочет запускаться нормально FMC. Обнаружил осциллографом: 1. Нет сигналов BA0, BA1 и UDQM, LDQM. Хотя пишу в каждый банк. 2. Сигналы RAS и CAS не имеют сдвига друг относительно друга. но может так и должно быть не знаю. Экспериментально обнаружил, что если писать в 0х60000000 то сигналы появляются (кроме BA0), но всё равно не записать в SDRAM данные. В примерах на HAL вижу, что настраивают они банк2 минуя банк 1. Может там что-то не так с ним. Кто-нибудь уже разбирался с темой STM32H7 и SDRAM? Буду признателен за любую помощь! #define SDRAM_START_ADDR ((uint32_t) 0xC0000000) // SDRAM bank1 area start address static void fmc_SDRAM_Config(void) { FMC_Bank1->BTCR[0] &= ~(1 << FMC_BCR1_FMCEN_Pos); FMC_Bank5_6->SDCR[0] = FMC_SDCR1_SDCLK_1 | FMC_SDCR1_CAS_1 | FMC_SDCR1_NB | FMC_SDCR1_MWID_0 | FMC_SDCR1_NR_1 | FMC_SDCR1_NC_0; uint8_t TMRD, TXSR, TRAS, TRC, TWR, TRP, TRCD; TMRD = 2; TXSR = 5; TRAS = 5; TRC = 4; TWR = 4; TRP = 2; TRCD = 2; FMC_Bank5_6->SDTR[0] = (uint32_t) (((TMRD - 1) << FMC_SDTR1_TMRD_Pos) | ((TXSR - 1) << FMC_SDTR1_TXSR_Pos) | ((TRC - 1) << FMC_SDTR1_TRC_Pos) | ((TRAS - 1) << FMC_SDTR1_TRAS_Pos) | ((TRP - 1) << FMC_SDTR1_TRP_Pos) | ((TWR - 1) << FMC_SDTR1_TWR_Pos) | ((TRCD - 1) << FMC_SDTR1_TRCD_Pos)); FMC_Bank1->BTCR[0] |= (1 << FMC_BCR1_FMCEN_Pos); } static void fmc_SDRAM_Initialization_Sequence(void) { /* STEP 1: Clock enable command */ FMC_Bank5_6->SDCMR = (uint32_t)((FMC_MODE_CLOCKCONFIG << FMC_SDCMR_MODE_Pos) |\ (1 << FMC_SDCMR_CTB1_Pos) |\ ((1 - 1) << FMC_SDCMR_NRFS_Pos) |\ (0 << FMC_SDCMR_MRD_Pos)); /* Delay = 1000 mks */ HAL_Delay(1); /* STEP 2: All Bank Precharge command */ FMC_Bank5_6->SDCMR = (uint32_t)((FMC_MODE_PALL << FMC_SDCMR_MODE_Pos) |\ (1 << FMC_SDCMR_CTB1_Pos) |\ ((1 - 1) << FMC_SDCMR_NRFS_Pos) |\ (0 << FMC_SDCMR_MRD_Pos)); /* STEP 3: Auto refresh command (NRFS = TRC in SDCR1 register) */ FMC_Bank5_6->SDCMR = (uint32_t)((FMC_MODE_AUTOREFRESH << FMC_SDCMR_MODE_Pos) |\ (1 << FMC_SDCMR_CTB1_Pos) |\ ((8 - 1) << FMC_SDCMR_NRFS_Pos) |\ (0 << FMC_SDCMR_MRD_Pos)); /* STEP 4: MRD register program: Mode Register = 0b0000 0100 0100 0 (CL = 2; M9 - Single Location Access) */ uint32_t tmpmrd = (uint32_t)0x220; FMC_Bank5_6->SDCMR = (uint32_t)((FMC_MODE_LOADMODEREG << FMC_SDCMR_MODE_Pos) |\ (1 << FMC_SDCMR_CTB2_Pos) |\ ((1 - 1) << FMC_SDCMR_NRFS_Pos) |\ (tmpmrd << FMC_SDCMR_MRD_Pos)); /* STEP 5: Set refresh count */ FMC_Bank5_6->SDRTR = (FMC_Bank5_6->SDRTR & FMC_SDRTR_REIE) | (0x000001EF << 1); } void fmc_SDRAM_Init(void) { RCC->D1CCIPR |= (RCC->D1CCIPR & RCC_D1CCIPR_FMCSEL) | RCC_D1CCIPR_FMCSEL_1; // FMC kernel clock source = per_pll2 = 120 MHz RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN; // Enable the FMC interface clock fmc_SDRAM_GPIOConfig(); fmc_SDRAM_Config(); fmc_SDRAM_Initialization_Sequence(); } int main(void) { Init_SoftwareModules(); fmc_SDRAM_Init(); uint32_t Address, Pattern; while(1) { Address = SDRAM_START_ADDR; Pattern = 0xAAAA; MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit); Address = SDRAM_START_ADDR + 0x4000; Pattern = 0xAAAA; MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit); Address = SDRAM_START_ADDR + 0x8000; Pattern = 0xAAAA; MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit); Address = SDRAM_START_ADDR + 0xC000; Pattern = 0xAAAA; MemTest_WriteReadSDRAM(Address, Pattern, dbw16Bit); } } Изменено 21 августа, 2018 пользователем IgorKossak [codebox] для длинного кода. [code]-для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
hd44780 0 22 августа, 2018 Опубликовано 22 августа, 2018 · Жалоба Сам не делал, т.к. на моей плате NUCLEO-H743ZI SDRAM нет, но Вы можете глянуть, какие настройки производятся кубом. Я понимаю нелюбовь многих к этой софтине, но деваться некуда, других примеров просто нет. Кроме того, в кубе есть примеры для платы STM32H743I_EVAL, на которой есть SDRAM чип. Можно там что-то подсмотреть. Я тоже сижу, раскуриваю разные примеры по кубу и тамошним платам... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aner 4 22 августа, 2018 Опубликовано 22 августа, 2018 · Жалоба Процы сильно разные как по командам так и по архитектуре, замена пин то пин не пройдёт. Читайте изучайте даташит и различие архитектур, команд. Все похоже, но разное вплоть до длины команд их, ширины ригистров, адресации и тд. если у вас F4 и H7. Коррекций много, тупой заменой кода не пройдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 35 12 сентября, 2018 Опубликовано 12 сентября, 2018 · Жалоба Совместимость по пинам есть, по крайней мере H743 TQFP работает на плате F429 discovery. Но вот разводка SDRAM не позволяет получить не то что 133 мгц, а и 100Мгц тактовой. А теперь вопрос- где можно посмотреть разводку TQFP H743 + SDRAM, работоспособную на 133 мгц, желательно в 4 слоях? BGA варианты не интересуют, т.к гербера BGA доступны у ST. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Sagittarius 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба Делел проект на STM32F746G с SDRAM и видео выходом. SDRAM инитил куском либы из примеров, идущих с кубом-мх. Конкретно файл stm32746g_discovery_sdram.c (17 013 байт) но, как уже говорили, 133 там никак не получалось, и когда читал доку на H7xx то как запомнилось, выше 100 частоту SDRAM на нем тоже поднять нельзя. У меня на 100МГц плата в 4 слоя без особых ухищрений, единственно на что смотрели - чтоб длина проводника тактовой была не менее максимального из остальных адресов/данных/команд. Из доки на F746 === SDRAM waveforms and timings • CL = 30 pF on data and address lines. CL = 10 pF on FMC_SDCLK unless otherwise specified. In all timing tables, the THCLK is the HCLK clock period. – For 3.0 V≤VDD≤3.6 V, maximum FMC_SDCLK= 100 MHz at CL=20 pF (on FMC_SDCLK) === да, про куб - на прямую проект им сгенеренный с SDRAM у меня не заработал, только с другими файлами из примеров от этого же куба. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Николандр 0 17 сентября, 2018 Опубликовано 17 сентября, 2018 · Жалоба Сам не делал, т.к. на моей плате NUCLEO-H743ZI SDRAM нет, но Вы можете глянуть, какие настройки производятся кубом. Я понимаю нелюбовь многих к этой софтине, но деваться некуда, других примеров просто нет. Кроме того, в кубе есть примеры для платы STM32H743I_EVAL, на которой есть SDRAM чип. Можно там что-то подсмотреть. Как раз благодаря Кубовским примерам на эту плату я и обнаружил, что они используют эту команду после записи. Но мне вот хотелось понять почему именно так. На данный момент могу объяснить это только тем, что у Cortex-m4 трех этапный конвейер процессора, а Cortex-m7 он уже шести этапный. Во всех остальных принципах оптимизации процессоры идентичны. Так что пока вот так. Небольшое уточнение к предыдущему сообщению. Запись в SDRAM нужно сопровождать командой DSB (это я имел в виду). Данная команда выжидает пока процессор полностью выполнит все операции до этой команды и затем идет дальше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 17 сентября, 2018 Опубликовано 17 сентября, 2018 (изменено) · Жалоба используют эту команду после записи О какой команде речь? upd: увидел комментарий... Если Вам требуется вытолкнуть кэш (например перед запуском DMA) то для этого другие другие средства. Изменено 17 сентября, 2018 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Николандр 0 18 сентября, 2018 Опубликовано 18 сентября, 2018 · Жалоба О какой команде речь? upd: увидел комментарий... Если Вам требуется вытолкнуть кэш (например перед запуском DMA) то для этого другие другие средства. Это лишь моё объяснение, почему в Кубовских примерах на работу с SDRAM они используют команду DSB после записи. Может быть я ошибаюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 19 сентября, 2018 Опубликовано 19 сентября, 2018 · Жалоба Совместимость по пинам есть, по крайней мере H743 TQFP работает на плате F429 discovery. Но вот разводка SDRAM не позволяет получить не то что 133 мгц, а и 100Мгц тактовой. А теперь вопрос- где можно посмотреть разводку TQFP H743 + SDRAM, работоспособную на 133 мгц, желательно в 4 слоях? BGA варианты не интересуют, т.к гербера BGA доступны у ST. Вы запаяли H743 в F429 Discovery? SDRAM удалось запустить ? На какой частоте? Инициализация по сравнению с 429 сильно разнится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 35 19 сентября, 2018 Опубликовано 19 сентября, 2018 · Жалоба Вы запаяли H743 в F429 Discovery? SDRAM удалось запустить ? На какой частоте? Инициализация по сравнению с 429 сильно разнится? Не я. Информация отсюда http://www.cqham.ru/forum/showthread.php?3...3%EC%FF-STM32H7 пост №4 А я посмотрел на гербера 429 дискавери и попытался переразвести нормально и наткнулся на проблемы с частотой и разводкой. Ссылки на код в теме есть- оттуда можно взять инициализацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 20 сентября, 2018 Опубликовано 20 сентября, 2018 (изменено) · Жалоба А я посмотрел на гербера 429 дискавери и попытался переразвести нормально и наткнулся на проблемы с частотой и разводкой. Наверное возможно и на этой плате произвести такую замену ... http://starterkit.ru/html/index.php?name=s...view&id=120 Поспешил. H7 нет в таких корпусах. Изменено 20 сентября, 2018 пользователем nanorobot Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба BGA варианты не интересуют, т.к гербера BGA доступны у ST. А меня интересуют. Но я не представляю как можно воспользоваться гербер файлами. Сделать по ним клон отладочной платы? Подсмотреть приемы разводки? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 35 24 сентября, 2018 Опубликовано 24 сентября, 2018 · Жалоба Но я не представляю как можно воспользоваться гербер файлами. В первом приближении именно клон. Схема контроллер плюс SDRAM один в один от дискавери, гербера импортируются и обрезаются. Остальные цепи контроллера можно разводить в соответствии с новой схемой. А иначе только вдумчивое курение AN4803: High-speed SI simulations using IBIS and board-level simulations using HyperLynx SI on STM32 32-bit ARM® Cortex® MCUs Скачивание IBIS модели контроллера и памяти и разводка с выравниванием длины в соответствии с моделями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nanorobot 3 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба В первом приближении именно клон. Попытался заказать плату в Тенхосвязь Екатеринбург. Не берутся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
khach 35 28 сентября, 2018 Опубликовано 28 сентября, 2018 · Жалоба Попытался заказать плату в Тенхосвязь Екатеринбург. Не берутся. Ну да, в BGA оно намного дороже получается. Поэтому хотелось бы найти рабочую разводку на TQFP, хотя бы на 100 МГц. И еще непонятно как верифицировать разводку в железе. Гонять сутками тест памяти? Вот если бы шину SDRAM сделали 36 битную с контролем по Хеммингу с выпадание в трап по несовпадению кодов... Кто нибудь встречал такой АРМ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться