Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:26

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 13:25 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Всем доброго времени суток.
По работе потребовалось запустить SDRAM память IS42S16400 на плате F429I discovery. IDE keil. Делал всё через регистры и подсматривал всё с инициализации через HAL.

Саму инициализацию FMC положил в system_stm32f4xx.c в SystemInit(), т.к. много где пишут, что она должна быть именно тут. Перед инициализацией FMC положил ещё инициализацию контроллера на 180 Mhz. Частоту проверил - всё завелось. Частота AHB тоже 180 мГц. Отредактировал скрипт линковщика (скаттер файл), добавив туда секцию sdram.

Вроде было всё без ошибок и запустилось, но если создать массив в sdram памяти unsigned char buf[256][256] __attribute__ ((section(".sdram")));, потом заполнить его значением (например, 0xAA), то через некоторое время (сотни мс) все значения уплывают в 0xFF. Всё уже проверил десять раз и не пойму, где проблема.

Привожу инициализацию FMC, самодельный хидер для FCM и скрипт линковщика.
Понимаю, что проблема с самогенерацией, но где? Может кто подскажет?

Ещё зачем то во всех примерах при записи команд CLOCK, PALL и MODERED - везде указывают частоту саморегенерации, хотя она используется только при записи команды AUTOREFRESH.

Код:
// ====================================================
// FMC
// ====================================================



   register unsigned long tmpreg = 0, timeout = 0xFFFF;
   register unsigned long index;
   
   /*-- GPIOs Configuration -----------------------------------------------------*/
   /*
    +-------------------+--------------------+--------------------+--------------------+
    +                       SDRAM pins assignment                                      +
    +-------------------+--------------------+--------------------+--------------------+
    | PD0  <-> FMC_D2   | PE0  <-> FMC_NBL0  | PF0  <-> FMC_A0    | PG0  <-> FMC_A10   |
    | PD1  <-> FMC_D3   | PE1  <-> FMC_NBL1  | PF1  <-> FMC_A1    | PG1  <-> FMC_A11   |
    | PD8  <-> FMC_D13  | PE7  <-> FMC_D4    | PF2  <-> FMC_A2    | PG4  <-> FMC_BA0   |
    | PD9  <-> FMC_D14  | PE8  <-> FMC_D5    | PF3  <-> FMC_A3    | PG5  <-> FMC_BA1   |
    | PD10 <-> FMC_D15  | PE9  <-> FMC_D6    | PF4  <-> FMC_A4    | PG8  <-> FMC_SDCLK |
    | PD14 <-> FMC_D0   | PE10 <-> FMC_D7    | PF5  <-> FMC_A5    | PG15 <-> FMC_NCAS  |
    | PD15 <-> FMC_D1   | PE11 <-> FMC_D8    | PF11 <-> FMC_NRAS  |--------------------+
    +-------------------| PE12 <-> FMC_D9    | PF12 <-> FMC_A6    |
                   | PE13 <-> FMC_D10   | PF13 <-> FMC_A7    |
                   | PE14 <-> FMC_D11   | PF14 <-> FMC_A8    |
                   | PE15 <-> FMC_D12   | PF15 <-> FMC_A9    |
    +-------------------+--------------------+--------------------+
    | PB5 <-> FMC_SDCKE1|
    | PB6 <-> FMC_SDNE1 |
    | PC0 <-> FMC_SDNWE |
    +-------------------+
   */
   
   
   RCC->AHB1ENR  |= 0x0000007E; // Enable GPIOB, GPIOC, GPIOD, GPIOE, GPIOF, and GPIOG interface clock
   
   GPIOB->AFR[0]  = 0x0CC00000; // Connect PBx pins to FMC Alternate function
   GPIOB->AFR[1]  = 0x00000000; // Connect PBx pins to FMC Alternate function
   GPIOB->MODER   = 0x00002A80; // Configure PBx pins in Alternate function mode
   GPIOB->OSPEEDR = 0x000028C0; // Configure PBx pins speed to 50 MHz
   GPIOB->OTYPER  = 0x00000000; // Configure PBx pins Output type to push-pull
   GPIOB->PUPDR   = 0x00000100; // No pull-up, pull-down for PBx pins

   GPIOC->AFR[0]  = 0x0000000C; // Connect PCx pins to FMC Alternate function
   GPIOC->AFR[1]  = 0x00000000; // Connect PCx pins to FMC Alternate function
   GPIOC->MODER   = 0x00000002; // Configure PCx pins in Alternate function mode
   GPIOC->OSPEEDR = 0x00000002; // Configure PCx pins speed to 50 MHz
   GPIOC->OTYPER  = 0x00000000; // Configure PCx pins Output type to push-pull
   GPIOC->PUPDR   = 0x00000000; // No pull-up, pull-down for PCx pins
      
   GPIOD->AFR[0]  = 0x000000CC; // Connect PDx pins to FMC Alternate function
   GPIOD->AFR[1]  = 0xCC000CCC; // Connect PDx pins to FMC Alternate function
   GPIOD->MODER   = 0xA02A000A; // Configure PDx pins in Alternate function mode
   GPIOD->OSPEEDR = 0xA02A000A; // Configure PDx pins speed to 50 MHz
   GPIOD->OTYPER  = 0x00000000; // Configure PDx pins Output type to push-pull
   GPIOD->PUPDR   = 0x00000000; // No pull-up, pull-down for PDx pins
   
   GPIOE->AFR[0]  = 0xC00000CC; // Connect PEx pins to FMC Alternate function
   GPIOE->AFR[1]  = 0xCCCCCCCC; // Connect PEx pins to FMC Alternate function
   GPIOE->MODER   = 0xAAAA800A; // Configure PEx pins in Alternate function mode
   GPIOE->OSPEEDR = 0xAAAA800A; // Configure PEx pins speed to 50 MHz
   GPIOE->OTYPER  = 0x00000000; // Configure PEx pins Output type to push-pull
   GPIOE->PUPDR   = 0x00000000; // No pull-up, pull-down for PEx pins

   GPIOF->AFR[0]  = 0x00CCCCCC; // Connect PFx pins to FMC Alternate function
   GPIOF->AFR[1]  = 0xCCCCC000; // Connect PFx pins to FMC Alternate function
   GPIOF->MODER   = 0xAA800AAA; // Configure PFx pins in Alternate function mode
   GPIOF->OSPEEDR = 0xAA800AAA; // Configure PFx pins speed to 50 MHz
   GPIOF->OTYPER  = 0x00000000; // Configure PFx pins Output type to push-pull
   GPIOF->PUPDR   = 0x00000000; // No pull-up, pull-down for PFx pins
   
   GPIOG->AFR[0]  = 0x00CC00CC; // Connect PGx pins to FMC Alternate function
   GPIOG->AFR[1]  = 0xC000000C; // Connect PGx pins to FMC Alternate function
   GPIOG->MODER   = 0x80020A0A; // Configure PGx pins in Alternate function mode
   GPIOG->OSPEEDR = 0x80020A0A; // Configure PGx pins speed to 50 MHz
   GPIOG->OTYPER  = 0x00000000; // Configure PGx pins Output type to push-pull
   GPIOG->PUPDR   = 0x00000000; // No pull-up, pull-down for PGx pins


   
   RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN; // Enable the FMC interface clock
   
   // ========================================
   // FMC SDCR REGISTER
   // ========================================
   // FMC_Bank5_6->SDCR[0] = 0x00002800;
   // FMC_Bank5_6->SDCR[1] = 0x000001D4;
   
   FMC_Bank5_6->SDCR[0]  = 0; // CLEAR REGISTER
   FMC_Bank5_6->SDCR[1]  = 0; // CLEAR REGISTER
   
   FMC_Bank5_6->SDCR[0] |= FMC_SDCR_RPIPE_1_HCLK_CLK_DELAY;                 // RPIPE  [14:13] Read pipe delay   * SDCR[1] bits is READ ONLY *
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_RBURST_SINGLE_READ_REQUEST_NOT_MANAGED; // RBURST [12   ] Burst read
   FMC_Bank5_6->SDCR[0] |= FMC_SDCR_SDCLK_CLOCK_2HCLK;                      // SDCLK  [11:10] SDRAM clock configuration   * SDCR[1] bits is READ ONLY *
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_WP_WRITE_ALLOWED;                       // WP     [9    ] Write protection
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_CAS_LATENCY_3_CLK;                      // CAS    [8 :7 ] CAS Latency
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_NB_4_BANKS;                             // NB     [6    ] Number of internal banks
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_MWID_16_BITS;                           // MWID   [5 :4 ] Memory data bus width
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_NR_12_BITS;                             // NR     [3 :2 ] Number of row address bits       
   FMC_Bank5_6->SDCR[1] |= FMC_SDCR_NC_8_BITS;                              // NC     [1 :0 ] Number of column address bits
   
   // ========================================
   // FMC SDTR REGISTER
   // ========================================

   // TWR >= TRAS - TRCD and TWR >= TRC - TRCD - TRP
   // Example: TRAS = 4 cycles, TRCD = 2 cycles.
   // So, TWR >= 2 cycles. TWR must be programmed to 0x1
   
   // FMC_Bank5_6->SDTR[0] = 0x00106000; ??
   // FMC_Bank5_6->SDTR[1] = 0x00010361; ??
   
   
   FMC_Bank5_6->SDTR[0]  = 0; // CLEAR REGISTER
   FMC_Bank5_6->SDTR[1]  = 0; // CLEAR REGISTER
   
   FMC_Bank5_6->SDTR[1] |= FMC_SDTR_TRCD_2_CLK; // TRCD [27:24] Row to column delay
   FMC_Bank5_6->SDTR[0] |= FMC_SDTR_TRP_2_CLK;  // TRP  [23:20] Row precharge delay * SDTR[1] bits are don’t care. *
   FMC_Bank5_6->SDTR[1] |= FMC_SDTR_TWR_2_CLK;  // TWR  [19:16] Recovery delay
   FMC_Bank5_6->SDTR[0] |= FMC_SDTR_TRC_7_CLK;  // TRC  [15:12] Row cycle delay * SDTR[1] bits are don’t care. *
   FMC_Bank5_6->SDTR[1] |= FMC_SDTR_TRAS_4_CLK; // TRAS [11:8 ] Self refresh time
   FMC_Bank5_6->SDTR[1] |= FMC_SDTR_TXSR_7_CLK; // TXSR [7 :4 ] Exit Self-refresh delay
   FMC_Bank5_6->SDTR[1] |= FMC_SDTR_TMRD_2_CLK; // TMRD [3 :0 ] Load Mode Register to Active


   timeout = 0xFFFF;
   while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout-- > 0)) {} // wait while BUSY
   
   // Clock Enable
   FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED |
                        FMC_SDCMR_MODE_CLOCK_CONFIGURATION_ENABLE     |
                   0x20;

   for (index = 0; index < 100000; index++) {}; // Delay
   timeout = 0xFFFF;
   while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout-- > 0)) {} // wait while BUSY
      
   // PALL (“All Bank Precharge”) command
   FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED |
                         FMC_SDCMR_MODE_PALL_COMMAND                   |
                   0x20;

   timeout = 0xFFFF;
   while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout-- > 0)) {} // wait while BUSY
      
   // Auto-refresh command = 4 auto refresh cycles
   FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED |
                       FMC_SDCMR_MODE_AUTO_REFRESH_COMMAND           |
                         FMC_SDCMR_NRFS_AUTO_REFRESH_4_CLK;

   timeout = 0xFFFF;
   while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout-- > 0)) {} // wait while BUSY
      
   // Load Mode Register
   // Mode Register definition = 0x0231
   // FMC_Bank5_6->SDCMR =   0x00046200;
   FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED |
                   FMC_SDCMR_MODE_LOAD_MODE_REGISTER             |
                   SDRAM_MODEREG_BURST_LENGTH_2                  |
                   SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL           |
                   SDRAM_MODEREG_OPERATING_MODE_STANDARD         |
                   SDRAM_MODEREG_CAS_LATENCY_3                   |
                   SDRAM_MODEREG_WRITEBURST_MODE_SINGLE          |
                   0x20;

   timeout = 0xFFFF;
   while((FMC_Bank5_6->SDSR & FMC_SDSR_BUSY) && (timeout-- > 0)) {} // wait while BUSY
      
   // Set refresh count
   // 64 ms / 8192 rows = 7.81us
   // (7.81us * 90 MHz) - 20 = 682.9 (0x2ABUL)
   FMC_Bank5_6->SDRTR |= 0x2ABUL << 1;



Код:
#ifndef _STM32F429_SDRAM_H_
#define _STM32F429_SDRAM_H_

// ===============================================================
// IS42S16400 64 mbit = 8 mbyte
// Start address for BANK2 = 0xD0000000
// End   address for BANK2 = 0xD07FFFFF
// Length of BANK2         = 0x800000
// ===============================================================
#define SDRAM_ADDR 0xD0000000
#define SDRAM_SIZE 0x800000

// ===============================================================
// FMC SDCR REGISTERS
// ===============================================================
#define FMC_SDCR_RPIPE_0_HCLK_CLK_DELAY                    (0x0UL << 13)
#define FMC_SDCR_RPIPE_1_HCLK_CLK_DELAY                    (0x1UL << 13)
#define FMC_SDCR_RPIPE_2_HCLK_CLK_DELAY                    (0x2UL << 13)

#define FMC_SDCR_RBURST_SINGLE_READ_REQUEST_NOT_MANAGED    (0x0UL << 12)
#define FMC_SDCR_RBURST_SINGLE_READ_REQUEST_ALWAYS_MANAGED (0x1UL << 12)

#define FMC_SDCR_SDCLK_CLOCK_DISABLED                      (0x0UL << 10)
#define FMC_SDCR_SDCLK_CLOCK_2HCLK                         (0x2UL << 10)
#define FMC_SDCR_SDCLK_CLOCK_3HCLK                         (0x3UL << 10)

#define FMC_SDCR_WP_WRITE_ALLOWED                          (0x0UL <<  9)
#define FMC_SDCR_WP_WRITE_IGNORED                          (0x1UL <<  9)

#define FMC_SDCR_CAS_LATENCY_1_CLK                         (0x1UL <<  7)
#define FMC_SDCR_CAS_LATENCY_2_CLK                         (0x2UL <<  7)
#define FMC_SDCR_CAS_LATENCY_3_CLK                         (0x3UL <<  7)

#define FMC_SDCR_NB_2_BANKS                                (0x0UL <<  6)
#define FMC_SDCR_NB_4_BANKS                                (0x1UL <<  6)

#define FMC_SDCR_MWID_8_BITS                               (0x0UL <<  4)
#define FMC_SDCR_MWID_16_BITS                              (0x1UL <<  4)
#define FMC_SDCR_MWID_32_BITS                              (0x2UL <<  4)

#define FMC_SDCR_NR_11_BITS                                (0x0UL <<  2)
#define FMC_SDCR_NR_12_BITS                                (0x1UL <<  2)
#define FMC_SDCR_NR_13_BITS                                (0x2UL <<  2)

#define FMC_SDCR_NC_8_BITS                                 (0x0UL <<  0)
#define FMC_SDCR_NC_9_BITS                                 (0x1UL <<  0)
#define FMC_SDCR_NC_10_BITS                                (0x2UL <<  0)
#define FMC_SDCR_NC_11_BITS                                (0x3UL <<  0)

// ===============================================================
// FMC SDTR REGISTERS
// ===============================================================
#define FMC_SDTR_TRCD_1_CLK  (0x0UL << 24)
#define FMC_SDTR_TRCD_2_CLK  (0x1UL << 24)
#define FMC_SDTR_TRCD_3_CLK  (0x2UL << 24)
#define FMC_SDTR_TRCD_4_CLK  (0x3UL << 24)
#define FMC_SDTR_TRCD_5_CLK  (0x4UL << 24)
#define FMC_SDTR_TRCD_6_CLK  (0x5UL << 24)
#define FMC_SDTR_TRCD_7_CLK  (0x6UL << 24)
#define FMC_SDTR_TRCD_8_CLK  (0x7UL << 24)
#define FMC_SDTR_TRCD_9_CLK  (0x8UL << 24)
#define FMC_SDTR_TRCD_10_CLK (0x9UL << 24)
#define FMC_SDTR_TRCD_11_CLK (0xAUL << 24)
#define FMC_SDTR_TRCD_12_CLK (0xBUL << 24)
#define FMC_SDTR_TRCD_13_CLK (0xCUL << 24)
#define FMC_SDTR_TRCD_14_CLK (0xDUL << 24)
#define FMC_SDTR_TRCD_15_CLK (0xEUL << 24)
#define FMC_SDTR_TRCD_16_CLK (0xFUL << 24)

#define FMC_SDTR_TRP_1_CLK  (0x0UL << 20)
#define FMC_SDTR_TRP_2_CLK  (0x1UL << 20)
#define FMC_SDTR_TRP_3_CLK  (0x2UL << 20)
#define FMC_SDTR_TRP_4_CLK  (0x3UL << 20)
#define FMC_SDTR_TRP_5_CLK  (0x4UL << 20)
#define FMC_SDTR_TRP_6_CLK  (0x5UL << 20)
#define FMC_SDTR_TRP_7_CLK  (0x6UL << 20)
#define FMC_SDTR_TRP_8_CLK  (0x7UL << 20)
#define FMC_SDTR_TRP_9_CLK  (0x8UL << 20)
#define FMC_SDTR_TRP_10_CLK (0x9UL << 20)
#define FMC_SDTR_TRP_11_CLK (0xAUL << 20)
#define FMC_SDTR_TRP_12_CLK (0xBUL << 20)
#define FMC_SDTR_TRP_13_CLK (0xCUL << 20)
#define FMC_SDTR_TRP_14_CLK (0xDUL << 20)
#define FMC_SDTR_TRP_15_CLK (0xEUL << 20)
#define FMC_SDTR_TRP_16_CLK (0xFUL << 20)

#define FMC_SDTR_TWR_1_CLK  (0x0UL << 16)
#define FMC_SDTR_TWR_2_CLK  (0x1UL << 16)
#define FMC_SDTR_TWR_3_CLK  (0x2UL << 16)
#define FMC_SDTR_TWR_4_CLK  (0x3UL << 16)
#define FMC_SDTR_TWR_5_CLK  (0x4UL << 16)
#define FMC_SDTR_TWR_6_CLK  (0x5UL << 16)
#define FMC_SDTR_TWR_7_CLK  (0x6UL << 16)
#define FMC_SDTR_TWR_8_CLK  (0x7UL << 16)
#define FMC_SDTR_TWR_9_CLK  (0x8UL << 16)
#define FMC_SDTR_TWR_10_CLK (0x9UL << 16)
#define FMC_SDTR_TWR_11_CLK (0xAUL << 16)
#define FMC_SDTR_TWR_12_CLK (0xBUL << 16)
#define FMC_SDTR_TWR_13_CLK (0xCUL << 16)
#define FMC_SDTR_TWR_14_CLK (0xDUL << 16)
#define FMC_SDTR_TWR_15_CLK (0xEUL << 16)
#define FMC_SDTR_TWR_16_CLK (0xFUL << 16)

#define FMC_SDTR_TRC_1_CLK  (0x0UL << 12)
#define FMC_SDTR_TRC_2_CLK  (0x1UL << 12)
#define FMC_SDTR_TRC_3_CLK  (0x2UL << 12)
#define FMC_SDTR_TRC_4_CLK  (0x3UL << 12)
#define FMC_SDTR_TRC_5_CLK  (0x4UL << 12)
#define FMC_SDTR_TRC_6_CLK  (0x5UL << 12)
#define FMC_SDTR_TRC_7_CLK  (0x6UL << 12)
#define FMC_SDTR_TRC_8_CLK  (0x7UL << 12)
#define FMC_SDTR_TRC_9_CLK  (0x8UL << 12)
#define FMC_SDTR_TRC_10_CLK (0x9UL << 12)
#define FMC_SDTR_TRC_11_CLK (0xAUL << 12)
#define FMC_SDTR_TRC_12_CLK (0xBUL << 12)
#define FMC_SDTR_TRC_13_CLK (0xCUL << 12)
#define FMC_SDTR_TRC_14_CLK (0xDUL << 12)
#define FMC_SDTR_TRC_15_CLK (0xEUL << 12)
#define FMC_SDTR_TRC_16_CLK (0xFUL << 12)

#define FMC_SDTR_TRAS_1_CLK  (0x0UL << 8)
#define FMC_SDTR_TRAS_2_CLK  (0x1UL << 8)
#define FMC_SDTR_TRAS_3_CLK  (0x2UL << 8)
#define FMC_SDTR_TRAS_4_CLK  (0x3UL << 8)
#define FMC_SDTR_TRAS_5_CLK  (0x4UL << 8)
#define FMC_SDTR_TRAS_6_CLK  (0x5UL << 8)
#define FMC_SDTR_TRAS_7_CLK  (0x6UL << 8)
#define FMC_SDTR_TRAS_8_CLK  (0x7UL << 8)
#define FMC_SDTR_TRAS_9_CLK  (0x8UL << 8)
#define FMC_SDTR_TRAS_10_CLK (0x9UL << 8)
#define FMC_SDTR_TRAS_11_CLK (0xAUL << 8)
#define FMC_SDTR_TRAS_12_CLK (0xBUL << 8)
#define FMC_SDTR_TRAS_13_CLK (0xCUL << 8)
#define FMC_SDTR_TRAS_14_CLK (0xDUL << 8)
#define FMC_SDTR_TRAS_15_CLK (0xEUL << 8)
#define FMC_SDTR_TRAS_16_CLK (0xFUL << 8)

#define FMC_SDTR_TXSR_1_CLK  (0x0UL << 4)
#define FMC_SDTR_TXSR_2_CLK  (0x1UL << 4)
#define FMC_SDTR_TXSR_3_CLK  (0x2UL << 4)
#define FMC_SDTR_TXSR_4_CLK  (0x3UL << 4)
#define FMC_SDTR_TXSR_5_CLK  (0x4UL << 4)
#define FMC_SDTR_TXSR_6_CLK  (0x5UL << 4)
#define FMC_SDTR_TXSR_7_CLK  (0x6UL << 4)
#define FMC_SDTR_TXSR_8_CLK  (0x7UL << 4)
#define FMC_SDTR_TXSR_9_CLK  (0x8UL << 4)
#define FMC_SDTR_TXSR_10_CLK (0x9UL << 4)
#define FMC_SDTR_TXSR_11_CLK (0xAUL << 4)
#define FMC_SDTR_TXSR_12_CLK (0xBUL << 4)
#define FMC_SDTR_TXSR_13_CLK (0xCUL << 4)
#define FMC_SDTR_TXSR_14_CLK (0xDUL << 4)
#define FMC_SDTR_TXSR_15_CLK (0xEUL << 4)
#define FMC_SDTR_TXSR_16_CLK (0xFUL << 4)

#define FMC_SDTR_TMRD_1_CLK  (0x0UL << 0)
#define FMC_SDTR_TMRD_2_CLK  (0x1UL << 0)
#define FMC_SDTR_TMRD_3_CLK  (0x2UL << 0)
#define FMC_SDTR_TMRD_4_CLK  (0x3UL << 0)
#define FMC_SDTR_TMRD_5_CLK  (0x4UL << 0)
#define FMC_SDTR_TMRD_6_CLK  (0x5UL << 0)
#define FMC_SDTR_TMRD_7_CLK  (0x6UL << 0)
#define FMC_SDTR_TMRD_8_CLK  (0x7UL << 0)
#define FMC_SDTR_TMRD_9_CLK  (0x8UL << 0)
#define FMC_SDTR_TMRD_10_CLK (0x9UL << 0)
#define FMC_SDTR_TMRD_11_CLK (0xAUL << 0)
#define FMC_SDTR_TMRD_12_CLK (0xBUL << 0)
#define FMC_SDTR_TMRD_13_CLK (0xCUL << 0)
#define FMC_SDTR_TMRD_14_CLK (0xDUL << 0)
#define FMC_SDTR_TMRD_15_CLK (0xEUL << 0)
#define FMC_SDTR_TMRD_16_CLK (0xFUL << 0)

// ===============================================================
// FMC SDCMR REGISTER
// ===============================================================
#define FMC_SDCMR_NRFS_AUTO_REFRESH_1_CLK  (0x0UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_2_CLK  (0x1UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_3_CLK  (0x2UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_4_CLK  (0x3UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_5_CLK  (0x4UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_6_CLK  (0x5UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_7_CLK  (0x6UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_8_CLK  (0x7UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_9_CLK  (0x8UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_10_CLK (0x9UL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_11_CLK (0xAUL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_12_CLK (0xBUL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_13_CLK (0xCUL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_14_CLK (0xDUL << 5)
#define FMC_SDCMR_NRFS_AUTO_REFRESH_15_CLK (0xEUL << 5)

#define FMC_SDCMR_CTB1_COMMAND_TARGET_BANK_1_NOT_SELECTED (0x0UL << 4)
#define FMC_SDCMR_CTB1_COMMAND_TARGET_BANK_1_SELECTED     (0x1UL << 4)

#define FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_NOT_SELECTED (0x0UL << 3)
#define FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED     (0x1UL << 3)

#define FMC_SDCMR_MODE_NORMAL_MODE                (0x0UL << 0)
#define FMC_SDCMR_MODE_CLOCK_CONFIGURATION_ENABLE (0x1UL << 0)
#define FMC_SDCMR_MODE_PALL_COMMAND               (0x2UL << 0)
#define FMC_SDCMR_MODE_AUTO_REFRESH_COMMAND       (0x3UL << 0)
#define FMC_SDCMR_MODE_LOAD_MODE_REGISTER         (0x4UL << 0)
#define FMC_SDCMR_MODE_SELF_REFRESH_COMMAND       (0x5UL << 0)
#define FMC_SDCMR_MODE_POWER_DOWN_COMMAND         (0x6UL << 0)


// ===============================================================
// DEFINITION FOR MODE REGISTER IN SDRAM !!!!
// ===============================================================
#define SDRAM_MODEREG_BURST_LENGTH_1             (0x0000UL << 9)
#define SDRAM_MODEREG_BURST_LENGTH_2             (0x0001UL << 9)
#define SDRAM_MODEREG_BURST_LENGTH_4             (0x0002UL << 9)
#define SDRAM_MODEREG_BURST_LENGTH_8             (0x0004UL << 9)
#define SDRAM_MODEREG_BURST_FULL_PAGE            (0x0007UL << 9)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      (0x0000UL << 9)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     (0x0008UL << 9)
#define SDRAM_MODEREG_CAS_LATENCY_2              (0x0020UL << 9)
#define SDRAM_MODEREG_CAS_LATENCY_3              (0x0030UL << 9)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    (0x0000UL << 9)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED (0x0000UL << 9)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     (0x0200UL << 9)

void init_sdram (void);

#endif


Код:
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
 
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
 
  RW_RAM1 0xD0000000 UNINIT 0x00800000  {  ; SDRAM (8M) the name is arbitrary
   startup_stm32f429xx.o (HEAP) ; Name of Object matching your startup_xxx.s name
   *(.sdram) ; All sections tagged as .sdram from All objects
  }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 17:47 
Старожил

Зарегистрирован: 19 апр 2016, 11:59
Сообщения: 444
Yoda писал(а):
заполнить его значением (например, 0xAA), то через некоторое время (сотни мс) все значения уплывают в 0xFF. Всё уже проверил десять раз и не пойму, где проблема.
Память динамическая. Ее нужно регенерировать через определенные интервалы времени, которые указаны в даташите.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 17:50 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
Подсматривать надо не в HAL, а в МАНУАЛ! Че вы, блин, все боитесь заглядывать в мануалы, как будто это книга дьявола с заклинаниями.
Инит SDRAM вообще без разницы, куда класть и когда вызывать, лишь бы он был до первого обращения к SDRAM. Вот реально - вообще по барабану.

Регенерировать вручную ничего не нужно - контроллер FMC сам всё делает, достаточно указать интервалы регенерации. В мануале прописано. Читаем мануал на микросхему SDRAM и на модуль FMC.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 20:53 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Так я регенерацию (4 цикла) прописал в коде. Или вы код не смотрели?

Код:
FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB2_COMMAND_TARGET_BANK_2_SELECTED | FMC_SDCMR_MODE_AUTO_REFRESH_COMMAND | FMC_SDCMR_NRFS_AUTO_REFRESH_4_CLK;

И ещё таймер регенерации:

Код:
FMC_Bank5_6->SDRTR |= 0x2ABUL << 1;

Но данные слетают. Регистры все проверил в отладчике, всё по ним ок. Где может быть косяк?


Последний раз редактировалось Yoda 13 сен 2019, 21:02, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 20:58 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
Нет, не смотрели, многа букав. А, да, write protection установлена. Я ж грю - че вы, блин, ссыте в мануалы смотреть то?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 13 сен 2019, 21:05 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
BusMaster писал(а):
Нет, не смотрели, многа букав. А, да, write protection установлена. Я ж грю - че вы, блин, ссыте в мануалы смотреть то?
Write protection тут причём? Она снята в строчке:
Код:
FMC_Bank5_6->SDCR[1] |= FMC_SDCR_WP_WRITE_ALLOWED;                       // WP     [9    ] Write protection

Если бы стояла защита, то я бы не смог ничего записать в память и было бы всегда и везде 0xFF. Мануал по FMC я до дыр зачитал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 14 сен 2019, 10:52 
Старожил
Аватара пользователя

Зарегистрирован: 12 июн 2018, 15:04
Сообщения: 422
BusMaster писал(а):
Нет, не смотрели, многа букав. А, да, write protection установлена. Я ж грю - че вы, блин, ссыте в мануалы смотреть то?


Да, в мануалах порой интересное попадается. Датахолд на FMC не регулируется вообще и равен фиксированному 1 CLK. А между прочим, попадаются устройства, которые требуют длинный дата-холд. Приходится снижать тактовую частоту или использовать FMC в режиме NAND (там дата холд регулируется к счастью).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 14 сен 2019, 11:12 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1785
Откуда: Донецк, ДНР
Могу поделиться 100% рабочим кодом для чипа MT48LC32M16A2 64 метра памяти. На Ф439 работает всё - LTDC, прямая запись по указателям, всякие там memcpy и секции линкера.
Делал изначально на SPL, потом перенёс на регистры. Вроде даже оба варианта есть.

Там двухэтапная инициализация - сперва пины+FMC, потом настройка непосредственно чипа через регистр команд FMC. О датахолдах вообще не задумывался никогда.

PS. Щас парюсь с этим же чипом на H743.. Пока глухо :( .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 14 сен 2019, 11:20 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Память не та, но скиньте, если не сложно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 14 сен 2019, 13:03 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 742
http://en.radzio.dxp.pl/stm32f429idiscovery/sdram.html
http://badembed.ru/rabotaem-s-sdram-is4 ... 9-timeout/
http://microsin.net/programming/arm/an4 ... stm32.html
Код:
///Install SDRAM
FMC_Bank5_6 -> SDCR[0] = FMC_SDCR1_NC_10bits
                        |FMC_SDCR1_NR_13bits
                        |FMC_SDCR1_MWID_16bits
                        |FMC_SDCR1_NB_4banks
                        |FMC_SDCR1_CAS_2cycle
                        //|FMC_SDCR1_SDCLK_3x
                        |FMC_SDCR1_SDCLK_2x
                        |FMC_SDCR1_RBURST
                        |FMC_SDCR1_WP
                        |FMC_SDCR1_RPIPE_2delay; //FMC_SDCR1_RPIPE_1delay FMC_SDCR1_RPIPE_3delay

FMC_Bank5_6->SDTR[0] = (0x00000001)        /// TMRD время между записью в MODE-REGISTER и ACTIVATE/1  /2
                      |(0x00000006 << 4)   /// TXSR время между SELF-REFRESHING и ACTIVATE (exit self-refresh mode)/5  /7
                      |(0x00000004 << 8)   /// TRAS минимальное время активности строки
                      |(0x00000006 << 12)  /// TRC  минимальное время между активацией строк одного банка
                      |(0x00000002 << 16)  /// TWR  время записи данных
                      |(0x00000002 << 20)  /// TRP  минимальное время закрытия строки
                      |(0x00000002 << 24); /// TRCD время между подачей команды ACTIVATE и появлением данных на шинеС/1  /2
///TWR>=TRAS-TRCD and TWR>=TRC-TRCD-TRP  TRC=TRAS+TRP
  FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Config_Enable; // 0x00000011;
  tmp = 15;
  timeout = 0xFFFF;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }

delay(100000);
/// PALL command
  FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_PALL; //0x00000012;
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
/// Auto refresh command
  FMC_Bank5_6->SDCMR = (0x00000003 << 5) | FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Self_refresh; //0x00000073; FMC_SDCMR_MODE_Self_refresh  FMC_SDCMR_MODE_Auto_refresh
/// Количество рефлеш минимум 2
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
/// MRD register program
  tmp = ((108000)*64)/8192; // 48тактов
  FMC_Bank5_6->SDCMR = (tmp << 9) | FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Load_Mode ;
/// 64mc/(размер блока Row Addresses(8192)) * (тактовая частота чипа)
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
  tmp = (((108000 * 64)/8192)<<1) | FMC_Bank5_6->SDRTR;
  FMC_Bank5_6->SDRTR = tmp | 1<<14 ; // время регена + вкл регена
/// Refresh rate = (COUNT) * SDRAM clock frequency
/// SDRAM refresh period = 64 mc
/// COUNT = (SDRAM refresh period / Number of rows )
/// Refresh rate = 0.064 / (8192rows + 4) ) * 84000000 , ~ 656 ( 0x290 )

  FMC_Bank5_6->SDCR[0] &= (~FMC_SDCR1_WP);// снятие защиты от записи
  timeout =0;

  uint32_t tmp3 = 0xc0000000;
  do{*((uint32_t *)tmp3++) = 0;} while(tmp3 != 0xC3FFFFFC);

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 14 сен 2019, 14:25 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1785
Откуда: Донецк, ДНР
Yoda писал(а):
Память не та, но скиньте, если не сложно.


Вложения:
LTDC_SDRAM.zip [14.94 Кб]
Скачиваний: 27
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 13:51 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Все эти ссылки я давно уже видел. У меня всё сделано по аналогии.

AVI-crak писал(а):
http://en.radzio.dxp.pl/stm32f429idiscovery/sdram.html
http://badembed.ru/rabotaem-s-sdram-is4 ... 9-timeout/
http://microsin.net/programming/arm/an4 ... stm32.html
Код:
///Install SDRAM
FMC_Bank5_6 -> SDCR[0] = FMC_SDCR1_NC_10bits
                        |FMC_SDCR1_NR_13bits
                        |FMC_SDCR1_MWID_16bits
                        |FMC_SDCR1_NB_4banks
                        |FMC_SDCR1_CAS_2cycle
                        //|FMC_SDCR1_SDCLK_3x
                        |FMC_SDCR1_SDCLK_2x
                        |FMC_SDCR1_RBURST
                        |FMC_SDCR1_WP
                        |FMC_SDCR1_RPIPE_2delay; //FMC_SDCR1_RPIPE_1delay FMC_SDCR1_RPIPE_3delay

FMC_Bank5_6->SDTR[0] = (0x00000001)        /// TMRD время между записью в MODE-REGISTER и ACTIVATE/1  /2
                      |(0x00000006 << 4)   /// TXSR время между SELF-REFRESHING и ACTIVATE (exit self-refresh mode)/5  /7
                      |(0x00000004 << 8)   /// TRAS минимальное время активности строки
                      |(0x00000006 << 12)  /// TRC  минимальное время между активацией строк одного банка
                      |(0x00000002 << 16)  /// TWR  время записи данных
                      |(0x00000002 << 20)  /// TRP  минимальное время закрытия строки
                      |(0x00000002 << 24); /// TRCD время между подачей команды ACTIVATE и появлением данных на шинеС/1  /2
///TWR>=TRAS-TRCD and TWR>=TRC-TRCD-TRP  TRC=TRAS+TRP
  FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Config_Enable; // 0x00000011;
  tmp = 15;
  timeout = 0xFFFF;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }

delay(100000);
/// PALL command
  FMC_Bank5_6->SDCMR = FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_PALL; //0x00000012;
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
/// Auto refresh command
  FMC_Bank5_6->SDCMR = (0x00000003 << 5) | FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Self_refresh; //0x00000073; FMC_SDCMR_MODE_Self_refresh  FMC_SDCMR_MODE_Auto_refresh
/// Количество рефлеш минимум 2
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
/// MRD register program
  tmp = ((108000)*64)/8192; // 48тактов
  FMC_Bank5_6->SDCMR = (tmp << 9) | FMC_SDCMR_CTB1 | FMC_SDCMR_MODE_Load_Mode ;
/// 64mc/(размер блока Row Addresses(8192)) * (тактовая частота чипа)
  timeout = 0xFFFF; tmp = 10;
  while((tmp != 0) && (timeout > 0))
  {
    tmp = FMC_Bank5_6->SDSR & 0x00000020; timeout-- ;
  }
  tmp = (((108000 * 64)/8192)<<1) | FMC_Bank5_6->SDRTR;
  FMC_Bank5_6->SDRTR = tmp | 1<<14 ; // время регена + вкл регена
/// Refresh rate = (COUNT) * SDRAM clock frequency
/// SDRAM refresh period = 64 mc
/// COUNT = (SDRAM refresh period / Number of rows )
/// Refresh rate = 0.064 / (8192rows + 4) ) * 84000000 , ~ 656 ( 0x290 )

  FMC_Bank5_6->SDCR[0] &= (~FMC_SDCR1_WP);// снятие защиты от записи
  timeout =0;

  uint32_t tmp3 = 0xc0000000;
  do{*((uint32_t *)tmp3++) = 0;} while(tmp3 != 0xC3FFFFFC);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 14:46 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 742
Yoda писал(а):
Все эти ссылки я давно уже видел. У меня всё сделано по аналогии.

В аналогии должны совпадать последовательность действий и смысл.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 15:36 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
hd44780, У вас память подключена получается к банку №5 ? Это не плата 429I discovery?

И почему у вас установка авторегенерации без указания количества циклов? Значение ноль = 1 цикл? Такая у вас память?
Код:
   // Initialization step 6
   while(FMC_Bank5_6->SDSR & FMC_SDSR_BUSY);
   FMC_Bank5_6->SDCMR = 3 | FMC_SDCMR_CTB1;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 17:32 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Yoda, Все давно разжевано http://en.radzio.dxp.pl/stm32f429idiscovery/sdram.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 17:43 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Я эту ссылку уже видел. Сейчас повторно тупо скопировал оттуда весь код, кроме инициализации gpio. Всё осталось по старому. Через сотню другую мс весь массив памяти sdram заполняется 0xFF.
Инициализацию gpio проверил уже побайтово. Всё с ней хорошо.

Архив LTDC_SDRAM.zip не помогает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 18:29 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Yoda, у меня сей код прекрасно работает на 429ой дискаверине.

https://dropmefiles.com/XoE7D


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 19:05 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Может как-то влияет, что я дисплей отпаял у этой платы?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 19:15 
Старожил
Аватара пользователя

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 3643
Да нет, не влияет. Главное, чтобы вы там ниче не повредили и не замкнули. Досикус дал код именно для этой платы. С этим кодом не работает?
Запишите несколько байт с начала адресов для этого банка (я щас на память не помню, в каком банке на этой плате стоит SDRAM. Сверьтесь с мануалом). А потом прочитайте эти байты. Не создавайте массив, просто запишите и прочитайте по указателю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 19:49 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Так, запустил проект dosikus_2. Если записать по указателю и потом прочесть, то всё работает. Проблема всплывает, когда я создаю массив 1024х1024 байт в sdram.

Цитата:
unsigned char buf[1024][1024] __attribute__ ((section(".sdram")));

Естественно, такое описание требует добавление секции в скрипт линкера.

Код:
;
*************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************

LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
 
   RW_RAM1 0xD0000000 UNINIT 0x00800000  {  ; SDRAM (8M) the name is arbitrary
   *(.sdram) ; All sections tagged as .sdram from All objects
  }
 
  RW_IRAM1 0x20000000 0x00030000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

Галочку use memory layout from target dialog убрал.

Дальше заполняю массив значением. Например, вот так:
Код:
   for (x = 0; x < 1024; x++)
   {
      for (y = 0; y < 1024; y++)
      {
         buf[x][y] = 0x30;
      }
   }

Если в отладчике пройтись по памяти, то видно, что заполнена лишь первая строка массива [0][0]. В остальном массиве мусор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 20:10 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1785
Откуда: Донецк, ДНР
Yoda, под какой линкер вы писали?
Я так писал:
Код:
/* Specify the memory areas */
MEMORY
{
......
/*
* 0x02000000 = 32 MB
* 0x04000000 = 64 MB
* SDRAM region address: 0xC0000000, LENGTH = 0x04000000
*/   
sdram (xrw) : ORIGIN = 0xC0000000, LENGTH = 0x02000000   
}

/* Define output sections */
SECTIONS
{
    .sdram_data (NOLOAD):
    {
        *(.sdram_data)
    } >sdram
................


Работает в кокосе и в атоллике.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 20:15 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
Это кейл


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 20:22 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Там часть памяти отведена под LDTC ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 20:29 
Заглядывает иногда

Зарегистрирован: 14 апр 2014, 11:41
Сообщения: 63
Откуда: Минск Беларусь
dosikus_2 писал(а):
Там часть памяти отведена под LDTC ...
Я закомментировал всё, кроме инициализации SDRAM.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: И снова STM32 + SDRAM
СообщениеДобавлено: 16 сен 2019, 20:30 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Инит тактовой мой или свой прикрутили?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB