STM32 DoomBoy SDRAM ILI9341

Решил попробовать развести что похожее на STM32F4Discovery. Контроллер STM32F429ZGT в корпусе LQFP-144. Выбрал самый распространенный цветной экран ILI9341. Добавил w25q64 который аналог AT25SF081 также SD-CARD и ES8374
Электрически дисплей подключи так же как для Doom Boy ESP32. Немного не рассчитал отступ слева. Экран сдвинут влево на сантиметр

kldtubjxdqkzhxjeuzygafjxwls.png

Поставил пластиковые втулки по краям плат в места крепления. USB разъем теперь находится на весу и на него ничего не давит когда нажимается кнопка. Постараемся сделать все по красоте в этот раз

zq4a4w9lhkrl29g5prda-pn9blq.jpeg

Connect

16:09:44: Disconnected from device.
16:09:45: ST-LINK SN: 1F4204003212374D434B4E00
16:09:45: ST-LINK FW: V2J33S7
16:09:45: Voltage: 3,28V
16:09:45: SWD freq: 4000 KHz
16:09:45: Connect mode: Normal
16:09:45: Reset mode: Software reset
16:09:45: Device ID: 0×419
16:09:46: UPLOADING OPTION BYTES DATA…
16:09:46: Bank: 0×00
16:09:46: Address: 0×40023c14
16:09:46: Size: 8 Bytes
16:09:46: UPLOADING…
16:09:46: Size: 1024 Bytes
16:09:46: Address: 0×8000000
16:09:46: Read progress:
16:09:46: Data read successfully
16:09:46: Time elapsed during the read operation is: 00:00:00.006

Распаиваем память. Ставим Кварцевый резонатор. Кварцы все еще в пути, преодолевая Шелковый путь, поэтому выпаял из какой-то BT-MP3 платы 24MHz. Настраиваем порт PB13 на выход. Берем код для мигания светодиода из любого примера. Включаем конструкцию, мигаем светодиодом

Хотел поробовать USB BOOT, но не получается. Наверное надо другой кварц. Мой текущий не совсем попадает

For connectivity line USB DFU bootloader, the device first tries the 25 MHz configuration, then, if it fails, the 14.7456 MHz configuration, and finally, if it fails, the 8 MHz configuration. In case of fail, this operation is repeated with a bigger timeout value (the three configurations are tested again). If the second trial fails, a system reset is generated.

Поставил кварц 8MHz добиться устройства ttyUSB не получилось. STM32F429Discovery в режиме загрузчика BOOT0=1 BOOT1=0 видит как UART устройство и позволяет залить прошивку. Но к ней подключен ST-Link V2 на борту. Он и позволяет это сделать

Так что используем старые проверенный вариант от внешней BluePill. На нем и Debug. Подключение через SWDIO, SWCLK, GND. Поскольку питание полаты осуществляется через USB, +3.3V не подключаем!

Схема подключения ILI9341 как у предыдущего проекта ESP32 DoomBoy

Память IS42S16400J
z7rmo4qgqpzcdewtqqmbwokbt8g.png

Контроллер STM32F429ZGT
vlitznubsnwjifevqv2s9iijsa8.png

Потратил 3 вечера чтобы запустить память. Сначала я не инициализировал последовательность. Проинициализировал

image

SDRAM_Initialization_Sequence ()
#define REFRESH_COUNT       ((uint32_t)0x056A)   /* SDRAM refresh counter (90MHz SDRAM clock) */
#define SDRAM_BANK_ADDR     ((uint32_t)0xC0000000)

static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{
  __IO uint32_t tmpmrd =0;
  /* Step 3:  Configure a clock configuration enable command */
  Command->CommandMode 	= FMC_SDRAM_CMD_CLK_ENABLE;
  Command->CommandTarget 	= FMC_SDRAM_CMD_TARGET_BANK1;
  Command->AutoRefreshNumber 	 = 1;
  Command->ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

  /* Step 4: Insert 100 ms delay */
  HAL_Delay(100);

  /* Step 5: Configure a PALL (precharge all) command */
  Command->CommandMode 			 = FMC_SDRAM_CMD_PALL;
  Command->CommandTarget 	     = FMC_SDRAM_CMD_TARGET_BANK1;
  Command->AutoRefreshNumber 	 = 1;
  Command->ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

  /* Step 6 : Configure a Auto-Refresh command */
  Command->CommandMode 			 = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
  Command->CommandTarget 		 = FMC_SDRAM_CMD_TARGET_BANK1;
  Command->AutoRefreshNumber 	 = 4;
  Command->ModeRegisterDefinition = 0;

  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

  /* Step 7: Program the external memory mode register */
  tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_3           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

  Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
  Command->CommandTarget 		 = FMC_SDRAM_CMD_TARGET_BANK1;
  Command->AutoRefreshNumber 	 = 1;
  Command->ModeRegisterDefinition = tmpmrd;

  /* Send the command */
  HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);

  /* Step 8: Set the refresh rate counter */
  /* (15.62 us x Freq) - 20 */
  /* Set the device refresh counter */
  HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
}

Память обнулялась. При попытке записать и считать появлялся мусор. У меня есть STM32F429I-DISC1 и на ней тест проходил нормально. Однако в ней память подключена к второму банку 0xD0000000, я же развел на первый банк 0xC0000000. Разница подключения только в двух сигналах

SDRAM 2 — STM32F429I-DISC1
PB5 <-> FMC_SDCKE1
PB6 <-> FMC_SDNE1

SDRAM 1 — Моя плата
PС3 <-> FMC_SDCKE0
PС2 <-> FMC_SDNE0

image

Последнее что я хотел попробовать это перепаять эту память. На самом деле после этого я собирался расчехлить осциллограф. Сдув предыдущую феном, впаял уже из другой партии IS42S16400J из другого магазина. И о чудо! Я записал и считал одно и тоже значение. Немного поигравшись с частотами, вся память прошла тест на максимальной частоте шины и частоте памяти 90 MHz. (90MHz SDRAM clock). Я не брал за основу референсный дизайн, а разводил сам. Надо будет погонять интенсивнее в будущем.

// #define SDRAM_START_ADR                         ((uint32_t)0xD0000000)
#define SDRAM_START_ADR                         ((uint32_t)0xC0000000)

#define SDRAM_SIZE                              0x400000
    
    uint32_t j32 = 0x12345678;
    uint32_t data32 = 0;

    for (i = SDRAM_START_ADR; i < SDRAM_START_ADR + SDRAM_SIZE; i += 4)
    {
            *(uint32_t*)i = j32;
            data = *(uint32_t*)i;
            if (data != j32){
            	error_happen();
            }
    }

Хороший материал по подключению различных типов памяти и FMC (Flexible Memory Controller) я нашел в webinar формате pdf

Драйвер дисплея взял STM32-ILI9341
Добавил папку с драйверами в свой проект и немного переконфигурировал выводы на SPI1. Тесты запустились и прошли. Дальше планирую портировать LVGL и Doom

Пока не удалось завести FATFS для SD-CARD. Так же не пробовал w25q64

© Habrahabr.ru