smk 0 8 января, 2021 Опубликовано 8 января, 2021 · Жалоба К контроллеру STM32H747 подключена SDRAM IS42S16400J. Нужна помощь в инициализации FMC. Инициализация куба не работает. Так же необходимо правильно определиться с регистрами FMC_SDCRx и FMC_SDTRx. Прошу помочь, может кто уже делал это. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 11 января, 2021 Опубликовано 11 января, 2021 · Жалоба Инициализировать получилось. Отладчик память видит. Возник вопрос как теперь объяснить кейлу, что у программы есть эта память и как объявить расположенный в ней массив? Если указывать ее как внешнюю, то виснет на старте. При этом если указать размер 0х8000, то все нормально. Реально она же больше. Как правильно ее описать кейлу? Как объявить массив в ней? Спасибо. Ну и привожу инициализацию на 120 МГц. Может кому пригодится. Думаю, ноги инициализировать не будет проблемой. void FMC (void) { unsigned int i; /* Включаем тактирование FMC */ /* For 2.7 V<VDD<3.6 V, FMC_CLK = 125 MHz at 20 pF */ /* Для работы с IS42S16400J-5TL 120 MHz устанавливается в SystemClock_Config() */ RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN; FMC_Bank1_R->BTCR[0] |= FMC_BCR1_FMCEN; FMC_Bank5_6_R->SDCMR |= FMC_SDCMR_CTB2; FMC_Bank5_6_R->SDCR[0] |= FMC_SDCRx_RPIPE_1; FMC_Bank5_6_R->SDCR[0] |= FMC_SDCRx_SDCLK_1; FMC_Bank5_6_R->SDCR[1] &= ~FMC_SDCRx_WP; FMC_Bank5_6_R->SDCR[1] &= ~FMC_SDCRx_CAS; FMC_Bank5_6_R->SDCR[1] |= FMC_SDCRx_CAS_1; FMC_Bank5_6_R->SDCR[1] |= FMC_SDCRx_NB; FMC_Bank5_6_R->SDCR[1] &= ~FMC_SDCRx_MWID; FMC_Bank5_6_R->SDCR[1] |= FMC_SDCRx_MWID_0; FMC_Bank5_6_R->SDCR[1] &= ~FMC_SDCRx_NR; FMC_Bank5_6_R->SDCR[1] |= FMC_SDCRx_NR_0; FMC_Bank5_6_R->SDCR[1] &= ~FMC_SDCRx_NC; FMC_Bank5_6_R->SDTR[1] = 0; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TRCD_0; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TRP_0; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TWR_0; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TRC_1 | FMC_SDTRx_TRC_2; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TRAS_2; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TXSR_0 | FMC_SDTRx_TXSR_1 | FMC_SDTRx_TXSR_2; FMC_Bank5_6_R->SDTR[1] |= FMC_SDTRx_TMRD_0; FMC_Bank5_6_R->SDCMR |= FMC_SDCMR_MODE_0 | FMC_SDCMR_CTB2; //Mode 001 i = 96000; while(i--) __NOP(); FMC_Bank5_6_R->SDCMR &= ~FMC_SDCMR_MODE; FMC_Bank5_6_R->SDCMR |= FMC_SDCMR_MODE_1 | FMC_SDCMR_CTB2; //Mode 010 FMC_Bank5_6_R->SDCMR |= FMC_SDCMR_NRFS_0 | FMC_SDCMR_NRFS_1 | FMC_SDCMR_NRFS_2 | FMC_SDCMR_MODE_0 | FMC_SDCMR_MODE_1 | FMC_SDCMR_CTB2;//Mode 011 FMC_Bank5_6_R->SDCMR &= ~FMC_SDCMR_MODE; FMC_Bank5_6_R->SDCMR |= (0x220 << FMC_SDCMR_MRD_Pos) | FMC_SDCMR_MODE_2 | FMC_SDCMR_CTB2; FMC_Bank5_6_R->SDRTR |= (1855 << FMC_SDRTR_COUNT_Pos); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 33 11 января, 2021 Опубликовано 11 января, 2021 · Жалоба 1 час назад, smk сказал: Возник вопрос как теперь объяснить кейлу, что у программы есть эта память и как объявить расположенный в ней массив? Смотреть в сторону настройки линкера, для начала, прописывать соотв. секцию... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 11 января, 2021 Опубликовано 11 января, 2021 · Жалоба В линкер-скрипте создать регион и разместить в нем именованную секцию. Объявить массив с атрибутом размещения в той самой секции. Но тут как бы нюансы. Если массив должен быть инициализирован, то настройку SDRAM нужно перетащить в место до вызова __main(). Если нет, то достаточно пометить регион как неинициализируемый (NOINIT), настроить SDRAM и, собственно, пользоваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба Вот так похоже работает: static uint32_t Cadr[CADR_SIZE] __attribute__((section(".ARM.__at_0xD0000000"))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба 53 минуты назад, smk сказал: Вот так похоже работает: static uint32_t Cadr[CADR_SIZE] __attribute__((section(".ARM.__at_0xD0000000"))); Неверный быдлокодерский путь. Как правильно - Вам уже сказал ув. Arlleex. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба 21 минуту назад, jcxz сказал: Неверный быдлокодерский путь... В целом да. В мануале на ARM Compiler 6 (весь тулчейн), правда, пишут, что так делать можно, но есть ряд но. И работоспособность зависит от некоторых дополнительных ключей компиляции, правил автоматического размещения и т.д. Проще и надежнее через скрипт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба Ну тогда подсказывай как это делается. Раньше не делал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба Примеров на форуме полно. Вот тут, например. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба 21 час назад, Arlleex сказал: В линкер-скрипте создать регион и разместить в нем именованную секцию. Объявить массив с атрибутом размещения в той самой секции. Но тут как бы нюансы. Почитал хелп от кейла. С ходу не могу понять как что делать. Поскольку никогда раньше такого не делал можно попросить подсказать как это сделать правильно? Вот скаттер-фай, что создал кейл: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x38000000 0x00010000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Внешнее ОЗУ стартует от 0xD0000000 и имеет размер 0x800000. Научите как вот это: static uint32_t Cadr[1315840] __attribute__((section(".ARM.__at_0xD0000000"))); сделать правильно. Инициализировать не нужно. Спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 12 января, 2021 Опубликовано 12 января, 2021 · Жалоба В скрипте LR_IROM1 0x08000000 0x00080000 { ER_IROM1 0x08000000 0x00080000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x38000000 0x00010000 { .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } RW_SDRAM 0xD0000000 UNINIT 0x00800000 { *.o (.bss.sdram) } } В исходнике static uint32_t Cadr[1315840] __attribute__((section(".bss.sdram"))); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smk 0 13 января, 2021 Опубликовано 13 января, 2021 · Жалоба Благодарю. Теперь понятнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться