Невыровненный доступ к SDRAM на STM32F746
Добавлено: Сб авг 02, 2025 11:45:19
Приветствую.
Отладочная плата STM32F746 Disco, с 32-битной SDRAM MT48LC4M32B2, которая подключена по 16-битной шине данных.
И вот такая засада выясняется - при выполнении записи в SDRAM в размерности uint16_t или uint32_t по НЕЧЕТНОМУ адресу вываливается с ошибкой "невыровненный доступ". (чтение выполняется нормально). И ладно бы, было бы понятно, но на отладочной плате STM32F469 с такой же SDRAM, но подключенной по 32-битной шине данных этой проблемы нет ни в каком виде. Так же этой проблемы нет и на STM32F429 с 16-битоной SDRAM.
Начал разбираться че да как, в пошаговой отладке выяснил, что виновата инструкция 16-битного сохранения strh. Причем, при включении оптимизации -03 эта инструкция не используется, вместо нее - strb (побайтное сохранение). Однако, пошаговая отладка на -03, мягко говоря, некомфортна, если не сказать больше.
Вроде бы, по описанию из мануала, FMC в режиме SDRAM должен обеспечивать выбор любого байта сигналами DQM.
И поэтому у меня родилась догадка, что из-за подключения только части шины - 16 бит из 32 возможных, возникла такая проблема. Хотя я и не уверен, что именно в этом дело. По идее, в 32-битной SDRAM при 16-битном подключении вторая половина 32-битной ячейки просто не используется.
А вопрос вот в связи с чем - в проекте буду использовать STM32H743 с 32-битной SDRAM MT48LC4M32B2 на 32-битной шине. И поэтому вопрос - будет ли такая же проблема с невыровненным доступом там?
Проверить сейчас не могу - печатная плата не изготовлена, а отладочная с H743XI имеет только 16-битную SDRAM.
PS. Варианты решения "не используй невыровненный доступ" - не подходят, потому как массив переменных типа RGB888 не имеет выравнивания элементов по четным адресам.
PS2. Инит FMC - строго по мануалу, проверял раз на -дцать, в том числе и пошагово.
PS3. При заполнении через DMA2D работает без проблем в любых вариантах.
PS4. Если пиксельный буфер разместить во внутренней SRAM, то так же проблем не возникает ни в каком варианте. То есть, проблема чисто на стыке "FMC - микросхема SDRAM"
Отладочная плата STM32F746 Disco, с 32-битной SDRAM MT48LC4M32B2, которая подключена по 16-битной шине данных.
И вот такая засада выясняется - при выполнении записи в SDRAM в размерности uint16_t или uint32_t по НЕЧЕТНОМУ адресу вываливается с ошибкой "невыровненный доступ". (чтение выполняется нормально). И ладно бы, было бы понятно, но на отладочной плате STM32F469 с такой же SDRAM, но подключенной по 32-битной шине данных этой проблемы нет ни в каком виде. Так же этой проблемы нет и на STM32F429 с 16-битоной SDRAM.
Начал разбираться че да как, в пошаговой отладке выяснил, что виновата инструкция 16-битного сохранения strh. Причем, при включении оптимизации -03 эта инструкция не используется, вместо нее - strb (побайтное сохранение). Однако, пошаговая отладка на -03, мягко говоря, некомфортна, если не сказать больше.
Вроде бы, по описанию из мануала, FMC в режиме SDRAM должен обеспечивать выбор любого байта сигналами DQM.
И поэтому у меня родилась догадка, что из-за подключения только части шины - 16 бит из 32 возможных, возникла такая проблема. Хотя я и не уверен, что именно в этом дело. По идее, в 32-битной SDRAM при 16-битном подключении вторая половина 32-битной ячейки просто не используется.
А вопрос вот в связи с чем - в проекте буду использовать STM32H743 с 32-битной SDRAM MT48LC4M32B2 на 32-битной шине. И поэтому вопрос - будет ли такая же проблема с невыровненным доступом там?
Проверить сейчас не могу - печатная плата не изготовлена, а отладочная с H743XI имеет только 16-битную SDRAM.
PS. Варианты решения "не используй невыровненный доступ" - не подходят, потому как массив переменных типа RGB888 не имеет выравнивания элементов по четным адресам.
PS2. Инит FMC - строго по мануалу, проверял раз на -дцать, в том числе и пошагово.
PS3. При заполнении через DMA2D работает без проблем в любых вариантах.
PS4. Если пиксельный буфер разместить во внутренней SRAM, то так же проблем не возникает ни в каком варианте. То есть, проблема чисто на стыке "FMC - микросхема SDRAM"

