Серия «STM32F429IGT6 noname boards»

0

STM32F429IGT6 noname boards (3)⁠⁠

Серия STM32F429IGT6 noname boards

После прошлых частей, тестирование:

Подключаем STM32F429IGT6 noname boards USB<>Type-C к ПК

Что на картинке)... После запуска, необходимо перейти на вкладку View(1) -> Live Watch(2) (появится область где можно онлайн смотреть переменные, их надо добавить, то есть прописать(4)), далее View -> Memory -> Memory 1 -> в области Go to прописать 0xD0000000

После чего жмакаем) (6)

Расшифровка: 55 aa мы тестово прописали в коде данные значения теперь они физически работают для SDRAM (FSMC). Динамические переменные правые данные это уже область работы NAND флешки, Maker_id и Devoce_id вроде у всех должны быть именно такие. Статусы HAL_OK (0) говорят, что все успешно работает.

Нафига?)

Первое: поиски в "инете" особо не помогли

Второе: отличная шпаргалка

Третье: при всем этом, почти готовая платформа LTDC (ЖКИ RGB888, RGB565 и еже с ними)

Вот и всё

Послесловие: ИИ по коду лучше меня объяснит, что?как?почему?

https://github.com/Rikidevice/stm32f429igt6_fsmc_NAND_devboa...

Показать полностью 2
0

STM32F429IGT6 noname boards (2)⁠⁠

Серия STM32F429IGT6 noname boards

В прошлой части остановились по сборке проекта, в этой части программный код.

И так у нас готовый проект, согласованный с CubeMX

переходим в файл main.c (данный файл сформирован под настройки первой части, это надо для согласования CubeMX и IAR)

находим область в main.c

/* USER CODE BEGIN PV */

"(здесь код пользователя)"

/* USER CODE END PV */

копируем код (ctrl-c):

NAND_IDTypeDef g_nand_id;

volatile HAL_StatusTypeDef g_erase_status = HAL_ERROR;

volatile HAL_StatusTypeDef g_read_status = HAL_ERROR;

volatile HAL_StatusTypeDef g_write_status = HAL_ERROR;

NAND_AddressTypeDef g_erase_addr;

uint8_t g_write_buf[2048];

uint8_t g_read_buf[2048];

/* Адреса областей FMC NAND Bank3 */

const uint32_t g_data_area = 0x80000000u;

const uint32_t g_cmd_area = 0x80000000u | 0x00010000u; /* 0x80010000 */

const uint32_t g_addr_area = 0x80000000u | 0x00020000u; /* 0x80020000 */

вставляем копированный код (ctrl-v) в область

/* USER CODE BEGIN PV */

>>> ctrl-v <<<

/* USER CODE END PV */

ниже в файле main.c находим

/* USER CODE BEGIN 0 */

"(здесь код пользователя)"

/* USER CODE END 0 */

копируем код (ctrl-c):

/* Ожидание готовности NAND по линии R/B# (PB13). */

static HAL_StatusTypeDef NAND_WaitReady(uint32_t timeout_ms)

{

uint32_t start = HAL_GetTick();

while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET)

{

if ((HAL_GetTick() - start) > timeout_ms)

{

return HAL_TIMEOUT;

}

}

return HAL_OK;

}

/* Чтение байта статуса NAND (команда 0x70) */

static uint8_t NAND_ReadStatusByte(void)

{

*(volatile uint8_t *)g_cmd_area = 0x70;

return *(volatile uint8_t *)g_data_area;

}

вставляем копированный код (ctrl-v) в область

/* USER CODE BEGIN 0 */

>>> ctrl-v <<<

/* USER CODE END 0 */

ниже в файле main.c находим

/* USER CODE BEGIN 2 */

"(здесь код пользователя)"

/* USER CODE END 2 */

копируем код (ctrl-c):

/* ================= SDRAM INITIALIZATION SEQUENCE ================= */

FMC_SDRAM_CommandTypeDef Command;

uint32_t tmpmrd = 0;

Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;

Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1_2;

Command.AutoRefreshNumber = 1;

Command.ModeRegisterDefinition = 0;

(void)HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);

HAL_Delay(1);

Command.CommandMode = FMC_SDRAM_CMD_PALL;

Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

Command.AutoRefreshNumber = 1;

(void)HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);

Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;

Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

Command.AutoRefreshNumber = 8;

(void)HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);

tmpmrd = (uint32_t)(0u << 0) | (uint32_t)(0u << 3) |

(uint32_t)(3u << 4) | (uint32_t)(1u << 9);

Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;

Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;

Command.AutoRefreshNumber = 1;

Command.ModeRegisterDefinition = tmpmrd;

(void)HAL_SDRAM_SendCommand(&hsdram1, &Command, 0xFFFF);

(void)HAL_SDRAM_ProgramRefreshRate(&hsdram1, 1385);

HAL_Delay(10);

/* ================= SDRAM TEST ================= */

{

volatile uint16_t *sdram_ptr = (volatile uint16_t *)0xD0000000u;

*sdram_ptr = 0xAA55u;

volatile uint16_t sdram_rd = *sdram_ptr;

(void)sdram_rd;

}

/* ================= NAND: инициализация адреса ================= */

g_erase_addr.Plane = 0;

g_erase_addr.Block = 0;

g_erase_addr.Page = 0;

for (int i = 0; i < 2048; i++)

{

g_write_buf[i] = (uint8_t)(i & 0xFF);

}

/* ================= NAND TEST ================= */

HAL_NAND_Reset(&hnand1);

HAL_Delay(10);

HAL_StatusTypeDef nand_status = HAL_NAND_Read_ID(&hnand1, &g_nand_id);

if (nand_status == HAL_OK)

{

volatile uint32_t maker = g_nand_id.Maker_Id;

volatile uint32_t device = g_nand_id.Device_Id;

volatile uint32_t third = g_nand_id.Third_Id;

volatile uint32_t fourth = g_nand_id.Fourth_Id;

(void)maker; (void)device; (void)third; (void)fourth;

}

else

{

volatile uint32_t err = 1;

(void)err;

}

/* ================= NAND: стирание блока 0 ================= */

*(volatile uint8_t *)g_cmd_area = 0x60;

*(volatile uint8_t *)g_addr_area = (uint8_t)((g_erase_addr.Block >> 8) & 0xFF);

*(volatile uint8_t *)g_addr_area = (uint8_t)( g_erase_addr.Block & 0xFF);

*(volatile uint8_t *)g_cmd_area = 0xD0;

/* tWB: NAND должен успеть «дёрнуть» R/B# вниз */

for (volatile int d = 0; d < 1000; d++);

HAL_StatusTypeDef erase_wait = NAND_WaitReady(100);

if (erase_wait != HAL_OK)

{

g_erase_status = HAL_TIMEOUT;

}

else

{

uint8_t st = NAND_ReadStatusByte();

g_erase_status = ((st & 0x01u) == 0u) ? HAL_OK : HAL_ERROR;

}

/* ================= NAND: запись страницы 0 блока 0 ================= */

*(volatile uint8_t *)g_cmd_area = 0x80;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

for (int i = 0; i < 2048; i++)

{

*(volatile uint8_t *)g_data_area = g_write_buf[i];

}

*(volatile uint8_t *)g_cmd_area = 0x10;

for (volatile int d = 0; d < 1000; d++);

HAL_StatusTypeDef prog_wait = NAND_WaitReady(50);

if (prog_wait != HAL_OK)

{

g_write_status = HAL_TIMEOUT;

}

else

{

uint8_t st = NAND_ReadStatusByte();

g_write_status = ((st & 0x01u) == 0u) ? HAL_OK : HAL_ERROR;

}

/* ================= NAND: чтение страницы 0 блока 0 ================= */

*(volatile uint8_t *)g_cmd_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_addr_area = 0x00;

*(volatile uint8_t *)g_cmd_area = 0x30;

/* tWB: критически важно, иначе NAND не успеет перевести R/B# в низкий уровень */

for (volatile int d = 0; d < 5000; d++);

/* tR: по даташиту W29N01HV максимум 25 мкс, 1 мс с большим запасом */

HAL_Delay(1);

/* Чтение данных: никакой команды 0x70 здесь быть не должно */

for (int i = 0; i < 2048; i++)

{

g_read_buf[i] = *(volatile uint8_t *)g_data_area;

}

/* Сравнение: только по содержимому, без статусного байта */

uint32_t mismatch = 0;

for (int i = 0; i < 2048; i++)

{

if (g_read_buf[i] != g_write_buf[i])

{

mismatch++;

}

}

g_read_status = (mismatch == 0) ? HAL_OK : HAL_ERROR;

вставляем копированный код (ctrl-v) в область

/* USER CODE BEGIN 2 */

>>> ctrl-v <<<

/* USER CODE END 2 */

Далее собираем проект

В следующей части, запуск и тестирование, что в итоге получилось.

Показать полностью 2
8

STM32F429IGT6 noname boards (1)⁠⁠

Серия STM32F429IGT6 noname boards

Задача: запустить по минималке.

Дано: stm32f429igt6 noname board, на борту есть SDRAM память W9825G6KH-6 = 256 Мбит, NAND Flash W29N01HVSINA = 1 Гбит, программатор ST-LINK/V2 (disco), схемы наверное есть (лично я не нашел и особо не искал)

Покупал в маркетплейсе, не дорого.

ПО для работы:

  • Stm32 CubeMX (6.10.0 и выше)

  • локальная библиотека под камни F4 (CubeMX)

  • IAR (9.30.1)

Измерительные приборы:

  • Мультиметр

  • Шнур USB<>Type-C

Начнём:

Запускаем CubeMX

File->New Project ... (Ctrl+n) (Создание нового проекта)

Почему именно локальные библиотеки?!, ответ: доступ закрыт...

Если всё получилось правильно, после генерации кода, находим собственную папку с проектом, запускаем проект IAR, находим main.c

собираем проект, должно получится без ошибок, далее обязательные шаги надстройки IAR

вот тут надстройка не обязательна, просто бывает глючит JTAG,поменял на SWD

конец первой части.

UPD:

https://github.com/Rikidevice/stm32f429igt6_fsmc_NAND_devboa...

Показать полностью 15
Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества