Отладка показала, что отладчик отваливается при инициализации GPIO порта. Инициализировались два порта. Если я отключал инициализацию первого, второй инициализировался без проблем. Проблема возникала в команде, которая задаёт направление данных -- ввод или вывод. Когда мой предшественник ставил у первого порта все ножки на вывод (было нужно только некоторые, но почему-то настройка задавалась на все), тогда-то и происходило зависание.
Я залез в регистры блока GPIO и стал менять их ручками. Оказалось, что биты направления у двух ножек стояли в "10". А должны были стоять в "00" ("ввод" -- по-умолчанию). Я стал менять разные биты на "01" ("вывод" -- то, что мне надо). Обнаружилось, что биты всех ножек меняются хорошо, кроме тех двух ножек, у которых "10". Именно их изменение приводило к зависанию.
00 это ввод, 01 это вывод. А что же такое 10? Это так называемая "альтернативная функция". Большая часть ножек микроконтроллера стартует в режиме GPIO на ввод. Если вы хотите что-то особенное (например, работа со встроенными АЦП, ЦАП, передача данных по UART), то надо перевести ножку в режим альтернативной функции. И эти ножки находились в этом режиме с самого начала. Какая же у них была альтернативная функция?
Я уже догадывался, но решил удостовериться. Мои подозрения подтвердились. Эти ножки заведовали за SWD, то есть, за подключение к отладчику.
Задавая ножкам режим работы "на вывод" автор собственноручно отключал отладчик. Поэтому связь с компьютером и прерывалась.