Ох, позвольте излить душу.
Давно пытаюсь погрузиться в дивный мир stm32, попытки, правда, разделены годами. Я пришел в stm32 из мира AVR, минуя arduino. Принципы написания embedded кода хорошо понимаю. А вот с stm32 засада. Итак, ситуация 10 лет назад: вот вам даташит, у нас богатая периферия. Настолько, что голая инициализация чипа занимает два десятка строк на сях. Проходит время, вот вам CMIS библиотеки, которые помогут обернуть ассемблерный код в высокий уровень. Коммьюнити начинает писать код, библиотеки, примеры. Проходит еще пару лет. ST говорит что все, вы писали под устаревшую библиотеку. Вот вам HAL, который самым лучшим образом спрячет ассемблер! А что бы было клево, вот вам CubeMX, который за вас сконфигурирует периферию, сам заполнит длинные структуры для конфигурации.
Оооок. Под HAL начинают писать код.
Потом оказывается, что код HAL охеренно перезамедлен (вроде не велика беда на чипе в 72 мГц, но это кажется: код на HAL написанный в лоб и код на регистрах работают с двадцатикратной разницей в скорости).
Чуваки в ответственных местах юзают доступ к регистрам

Ах да, документации на HAL считай нет.
Дальше вообще пиздец:
На STM32 натягивают arduino IDE. Куча кода теперь работает на платформе STM32, но если ты вне arduino, код не использовать.
Вместе с arduino запиливают сторонние /самые лучшие/ библиотеки типа libopencm3.
Что имеем сегодня:
Куча кодозоопарка. Этот пример на регистрах, этот - CMIS, этот с CubeMX. А этот вовсе от ардуинки.
Новичку ооооочень тяжело разобраться.
теперь о частных случаях.
На stm32f4discovery старом распаян мегабайт sdram. В примерах он очень круто работает как область ОЗУ. В чистом примере из под CubeMX - не работает. В лучшем случае работает код типа «readmemory”.
Начинаю выяснять, где же колдунство в примерах. А там... в недрах сишного инита идет адская работа с регистрами в худших традициях говнокода (типа регистр1 = 0X66666
и вот же ж проблема, под ардуино я бы уже отлаживал поведение прибора, а тут я воюю с морганием светодиода
