lift_indicator_suite/bsp/sdram
2026-06-23 15:02:36 +03:00
..
include/bsp # test_display: bsp_display + test_template 2026-05-08 10:50:58 +03:00
src # Added: sdram service test 2026-04-20 20:07:25 +03:00
CMakeLists.txt # Added: sdram service test 2026-04-20 20:07:25 +03:00
README.md # test_buttons: finished, all documentation refactored 2026-06-23 15:02:36 +03:00

bsp_sdram — внешняя SDRAM MT48LC16M16A2 (32 МБ)

Минимальная верификация доступности внешней SDRAM, подключённой к SEMC. Подробное тестирование (паттерны, шина адреса/данных, retention) выполняется в тест-модуле firmware_test/test_sdram.c, который использует константы и API этого модуля.


Аппаратура

Параметр Значение
Чип MT48LC16M16A2
Объём 32 МБ
Ширина шины данных 16 бит
Интерфейс MCU SEMC, регион BR0
Базовый адрес 0x80000000 (BSP_SDRAM_BASE_ADDR)

Карта тестового региона:

Адрес Назначение
0x80000000 Начало SDRAM (SEMC BR0)
0x80200000 BSP_SDRAM_TEST_BASE_ADDR — база тестового региона
0x81E00000 Начало non-cacheable региона (USB DMA, 2 MB)
0x81FFFFFF Конец SDRAM

Тестовая база смещена на 2 МБ от начала — гарантированно выше .data/.bss прошивки и ниже non-cacheable региона.

Важно: SEMC инициализируется через DCD до вызова main(). Этот модуль не настраивает SEMC и не трогает его регистры. Если DCD не отработал — bsp_sdram_init() вернёт ошибку, но исправить ситуацию из модуля нельзя.


API

bsp_status_t bsp_sdram_init(void);

Публичные константы:

#define BSP_SDRAM_BASE_ADDR          0x80000000UL  /* SEMC BR0  */
#define BSP_SDRAM_SIZE_BYTES         0x02000000UL  /* 32 MB     */
#define BSP_SDRAM_TEST_BASE_ADDR     0x80200000UL  /* +2 MB     */
#define BSP_SDRAM_TEST_FAST_SIZE     0x00010000UL  /* 64 KB     */
#define BSP_SDRAM_TEST_FULL_SIZE     0x00100000UL  /* 1 MB      */
#define BSP_SDRAM_TEST_EXTENDED_SIZE 0x01B00000UL  /* 27 MB     */

Константы размеров — для потребителей; bsp_sdram не запускает по ним внутренних проходов.

Поведение bsp_sdram_init():

  1. Ждёт перехода SEMC в IDLE (SEMC->STS0 & SEMC_STS0_IDLE_MASK), таймаут 10 мс.
  2. Записывает 0xA5A5A5A5 по BSP_SDRAM_TEST_BASE_ADDR, делает SCB_CleanDCache_by_Addr + SCB_InvalidateDCache_by_Addr + __DSB(), читает обратно и сверяет.
  3. Повторяет для инверсного паттерна 0x5A5A5A5A.

Коды возврата:

Код Условие
BSP_OK SDRAM доступна, оба паттерна совпали
BSP_ERR_TIMEOUT SEMC не перешёл в IDLE за 10 мс
BSP_ERR_INIT Хотя бы один паттерн не совпал при readback

Быстрый старт

#include "bsp/sdram.h"

if (bsp_sdram_init() != BSP_OK) {
    handle_critical_error();
}

/* Работа с памятью по адресам внутри
   [BSP_SDRAM_BASE_ADDR, BSP_SDRAM_BASE_ADDR + BSP_SDRAM_SIZE_BYTES) */

CMake

target_link_libraries(firmware_test PRIVATE bsp_sdram)

Зависимости модуля:

Зависимость Тип Описание
bsp_status PUBLIC bsp_status_t в публичном API
bsp_tick PRIVATE bsp_tick_get_ms() для таймаута SEMC IDLE
sdk_semc PRIVATE fsl_semc.hSEMC->STS0, SEMC_STS0_IDLE_MASK
bsp_board PRIVATE Общие board-уровневые символы