Бывает так, что начинающий разработчик под STM32 прошел все препятствия: раздобыл плату, разобрался с китайскими репликами, собрал схему прошивки или докупил ST-Link/JLink, установил среду разработки, включил в ней отладочный сервер, собрал тестовый пример, собрал схему, залил прошивку и увидел что даже что-то работает. Но вот от дошел до отладки - и что же? Отладка не хочет работать. Почему?
Вариантов, почему отладка не работает может быть много. Здесь даны рекомендации при отладке через ST-LINK. Итак, что нужно знать.

Если плата подключена через ST-LINK к 4-х контактному разъему SWD, то слушать "гуру", которые будут утверждать, что если отключен JTAG, то отладка работать не будет - совершенно не стоит. Даже с отключенным JTAG-ом отладка по ST-LINK должна работать.
А первая причина, почему отладка не работает - это то, что в коде отключены прерывания. Обычно вначале программисту интересно, с какой максимальной скоростью работает плата. Он делает "ногодрыг" в бесконечном цикле, и отключает все что возможно, в том числе и прерывания. Ногодрыг действительно работает с максимальной скоростью. Вот только отладка в такой конфигурации работать не будет.
Вторая причина - это то, что брекпоинт не будет работать в том случае, если он поставлен на коде, который размещается в оперативной памяти контроллера (ОЗУ). Вот такая особенность STM32: брекпоинты срабатывают только на коде, размещенном во Flash. Если функция была размещена в ОЗУ, например так:
__attribute__((noinline, section(".ramfunc")))
void ourFunction()
{
...
}
- то поставить брекпоинт внутри такой функции можно, вот только он молча не будет срабатывать.
Возможно есть еще какие-то ситуации, когда брекпоинт не срабатывает. По мере появления новой информации эта статья будет пополняться.