Я для начала беру проект с HAL и работаю с ним. В нем проще чуть подправить числа в инициализации периферии и проверить, правильно ли получилось.
В HAL много лишнего:
Например при вызове стандартной функции инициализации таймера в нее включается перебор всех имеющихся в данном процессоре. Я встречал варианты и с отсутвующими. То есть не корректно прописаны дефайны для различения STM32F100 и STM32F103.
Функции типа SET_BIT в начале производят сравнение на true/false заием пишут в регистр установки или сброса. В результае в 2 раза вырастает размер памяти под такую простую функцию.
В начале нужно проект грубо обтесываю, а потом если "не влазит" по объему или скрости, то перевожу упрощаю часть функций.