Электрически дисплей подключается так же как для Doom Boy ESP32. Немного не рассчитал отступ слева. Экран сдвинут влево на сантиметр.
Поставил пластиковые втулки по краям плат в места крепления. USB разъем теперь находится на весу и на него ничего не давит когда нажимается кнопка. Постараемся сделать все красиво в этот раз
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: 0x419
16:09:46: UPLOADING OPTION BYTES DATA…
16:09:46: Bank: 0x00
16:09:46: Address: 0x40023c14
16:09:46: Size: 8 Bytes
16:09:46: UPLOADING…
16:09:46: Size: 1024 Bytes
16:09:46: Address: 0x8000000
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:
Контроллер STM32F429ZGT:
Потратил 3 вечера чтобы запустить память. Сначала я не инициализировал последовательность. Проинициализировал:
#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
Последнее что я хотел попробовать это перепаять эту память. На самом деле после этого я собирался расчехлить осциллограф. Сдув предыдущую феном, впаял уже из другой партии 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:
cd00264379-usb-dfu-protocol-used-in-the-stm32-bootloader-stmicroelectronics.pdf
en.radzio.dxp.pl/stm32f429idiscovery/sdram.html
main.lv/writeup/stm32f4_sdram_configuration.md#toc-1
Sdima1357
У меня SD card через их sdio 4 бита заводятся через одну, а вот через SPI -все которые пробовал, даже те которые линух не читает. Даже если SPI делать ручками, через обычные GPIO а не dedicated stm32 SPI. Попробуйте код из моей последней статьи здесь, там же и FAT подключен
app-z Автор
А как SPI делать ручками? ESP32 позволяет через matrix. Про STM32 не встречал подобного
Sdima1357
GPIO единичка, ноль и тд. Там в коде есть пример, потому что на готовой плате ножки уже разведены под sdio и соответственно hardware SPI на них не смапируется
Sdima1357
Это крайний случай. когда ножки уже разведены (в смысле PCB), нет HARD SPI, но ножками дрыгать можно, примерно так: