Но мне всегда неуютно, когда я не понимаю, как устроено то, чем я пользуюсь. Во многих случаях с этим просто надо смириться и принять таким, какое оно есть (я не знаю, как устроен Windows и вряд ли когда-нибудь это пойму), но ежели речь идёт о программном обеспечении железяки, которую я делаю сам для себя, то такое положение вещей меня не устраивает.
Поэтому щас я переписал свой тестовый -- до боевого ещё ооооочень далеко! -- код, выкинув из него HAL и Cube - остался только CMSIS, ибо в нём расписаны все регистры, биты, номера прерываний и т.п., и т.д., и никакого говна, вложенного в говно говна. Ну, ещё позаимствовал ассемблерный startup и скрипт для линковщика (хотя и до них, наверное, однажды доберусь).
Первым шагом был просто запуск платы (да, опять), но с кодом, который написал я так, как хочу -- пошагово, с комментами самому себе, регистр за регистром включается вся мелочь, без которой вообще ничего не будет работать: тактовые сигналы, память, управление питанием, всё такое.
Помигал лампочкой при помощи прерывания от таймера. Частота ок, потребление ок, всё выглядит так, как ожидалось.
Следующим шагом вкорячил свежескачанный FreeRTOS. Вручную, следуя их инструкциям.
Написал функцию для мигания лампочкой БЕЗ прерывания таймера (во всяком случае, в явном виде -- для формирования периода теперь используется API от FreeRTOS, внутри которого спрятан обработчик Systick), запустил её как задачу... Мигает!
Потом, конечно, всё равно придётся скатиться до использования чужого кода, который работает неизвестно как (хоть его и можно изучить, но это уведёт меня сильно в сторону от решения задачи) - когда я буду запускать Ethernet и USB. Возможно, вместо самопала прикручу какую-нибудь готовую графическую библиотеку (например, uGFX, обещающую лёгкость, надёжность, скорость и всё такое).
В общем, где-то там, вдалеке, забрезжила надежда.