Перейти к содержанию
    

STM32H747 + SDRAM

К контроллеру STM32H747 подключена SDRAM IS42S16400J. Нужна помощь в инициализации FMC. Инициализация куба не работает. Так же необходимо правильно определиться с регистрами FMC_SDCRx и FMC_SDTRx. Прошу помочь, может кто уже делал это. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инициализировать получилось. Отладчик память видит. Возник вопрос как теперь объяснить кейлу, что у программы есть эта память и как объявить расположенный в ней массив? Если указывать ее как внешнюю, то виснет на старте. При этом если указать размер 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);
}

 

set1.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, smk сказал:

Возник вопрос как теперь объяснить кейлу, что у программы есть эта память и как объявить расположенный в ней массив?

Смотреть в сторону настройки линкера, для начала, прописывать соотв. секцию...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В линкер-скрипте создать регион и разместить в нем именованную секцию.
Объявить массив с атрибутом размещения в той самой секции. Но тут как бы нюансы.
Если массив должен быть инициализирован, то настройку SDRAM нужно перетащить в место до вызова __main().
Если нет, то достаточно пометить регион как неинициализируемый (NOINIT), настроить SDRAM и, собственно, пользоваться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот так похоже работает:

static uint32_t Cadr[CADR_SIZE] __attribute__((section(".ARM.__at_0xD0000000")));

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

53 минуты назад, smk сказал:

Вот так похоже работает:


static uint32_t Cadr[CADR_SIZE] __attribute__((section(".ARM.__at_0xD0000000")));

 

Неверный быдлокодерский путь. Как правильно - Вам уже сказал ув. Arlleex.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, jcxz сказал:

Неверный быдлокодерский путь...

В целом да. В мануале на ARM Compiler 6 (весь тулчейн), правда, пишут, что так делать можно, но есть ряд но.
И работоспособность зависит от некоторых дополнительных ключей компиляции, правил автоматического размещения и т.д.

Проще и надежнее через скрипт.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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")));

сделать правильно. Инициализировать не нужно. Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В скрипте

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")));

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...