Как известно, чтобы что-то собрать под STM32 нужен linker script для соответствующего микроконтроллера. Можно, конечно, открыть даташит и написать вручную, но это слишком скучно. Можно тырить из чужих проектов готовые скрипты, но это тоже не мой метод.
В конце-концов linker script для всех STM32 одинаковы почти полностью, отличаются только размерами ROM и RAM (а ещё у некоторых STM32 есть несколько блоков RAM). А у меня есть железное правило - «если у тебя в программе дважды встречается один и тот же код - вынеси его в отдельную функцию, чтобы он встречался один раз». В данном случае можно написать шаблон linker script с символьными именами вместо чисел (типа RAM_SIZE, FLASH_SIZE и т. д.), а затем уже при компиляции прогонять шаблон через cpp, объявив нужные параметры МК.
Вопрос в том, где эти параметры взять. Ну не вручную же вести БД в 21-ом веке! Первое что пришло в голову - у STMicroelectronics есть сайт. Там есть онлайн каталог с характеристиками микроконтроллеров. Немного времени и я уже могу скачать в JSON-формате список микроконтроллеров с их характеристиками в локальный файл (чтобы не качать его при каждой компиляции проекта). А ещё написал утилиту, которая парсит этот файл и выдаёт все нужные мне характеристики - Flash, RAM, и версию ядра ARM (чтобы делать параметры компиляции типа -mcpu=cortex-m3).
А в итоге получил непонятный баг - тестовая программа делала HardFault при любом обращении к стеку. В итоге оказалось, что у старших моделей STM32 память состоит из двух регионов - нормальная и CCM (с меньшим временем ожидания чтения, зато недоступная для DMA). Скажем, у STM32F407 первый регион 128 КБ и начинается с адреса 0x20000000 (как и у всех других STM32), второй регион начинается с адреса 0x10000000 и длится 64 КБ. А в каталоге, разумеется, указываются общий размер ОЗУ. И получилось, что я объявил в linker script, что RAM у меня 192 КБ, а не 128, что не было верно. А стек, как известно, находится в конце RAM. Ну и получил обращение по несуществующему адресу.
Проблема осложняется тем, что размер CCM не указан в каталоге, который я использовал, а также нет какого-либо явного закона (типа CCM_SIZE = 1/3 * RAM_SIZE, если у нас STM32F4 - CCM имеют не все STM32F4, зато его же имеют и некоторые STM32F3).
Решение проблемы - нужен другой каталог микроконтроллеров. Где его взять?
Пока на примете есть только эта штука - https://github.com/libopencm3/libopencm3/blob/master/ld/devices.data
Насколько хорошим решением будет использовать данный каталог? Что насчёт лицензии и использования в своём проекте? Возможно, вы знаете более хорошие машиночитаемые каталоги характеристик микроконтроллеров?