Перейти к содержанию

Почему отладчик теряет связь со STM32, когда тот уходит в режим Stop?

Обновлено Редакция GAW

Отладчик Cortex-M общается с кристаллом через порт отладки, а тот работает от тактов ядра и шины. RM0090 прямо пишет: ядро не позволяет выключать эти такты во время отладки. Но режимы низкого потребления устроены именно так, что такты выключаются, — и, если ничего не настроить, в Stop отладчик теряет связь, а среда показывает ошибку или «зависание».

Биты DBGMCU_CR

ST предусмотрела в регистре DBGMCU_CR три бита, которые отладчик должен установить заранее:

БитРежимЕсли 0Если 1
DBG_SLEEPSleepHCLK выключенHCLK тактируется как FCLK
DBG_STOPStopвсе такты выключеныFCLK и HCLK от внутреннего RC-генератора
DBG_STANDBYStandbyцифровая часть обесточенацифровая часть питается, такты от RC, выход — через сброс

По RM0090 их выставляет отладчик до того, как кристалл уйдёт в сон; на время отладки их можно записать и из самой программы в начале main(). Что происходит с кристаллом в каждом режиме, объясняют статьи о режиме Stop и режиме Sleep.

Цена отладки во сне

С DBG_STOP = 1 в Stop работает внутренний RC-генератор, и ток потребления больше, чем в настоящем Stop. Есть и вторая мелочь: Arm в спецификации отладочного интерфейса отмечает, что пока отладчик держит линию SWDIO в нуле, через подтяжку течёт ток — при подтяжке 100 кОм и питании 3,3 В это

I=3,3 В100 кОм=33 мкАI = \frac{3{,}3\ \text{В}}{100\ \text{кОм}} = 33\ \text{мкА}

(наш расчёт) — сравнимо с током некоторых режимов сна. Поэтому ток сна меряют без отладчика: как это сделать, разобрано в ответе «Как измерить ток микроконтроллера в режиме сна».

Если связь уже потеряна

Если программа сразу после старта уходит в Stop и не даёт подключиться, отладчик не успевает выставить биты. Подключайтесь под сбросом — порядок в ответе «Почему ST-LINK перестал подключаться к STM32 после прошивки». Протокол и порты отладки описаны в статье «JTAG и SWD».

Похожие вопросы

Не исказит ли DBG_STOP измерение тока потребления?

Исказит: с этим битом внутренний RC-генератор и такты ядра остаются включёнными, и в Stop кристалл потребляет больше, чем без отладки. Ток сна меряют без отладчика и с DBG_STOP = 0 — например, после отключения отладчика и сброса по питанию.

Меняет ли бит DBG_STOP поведение программы после выхода из Stop?

Нет: по RM0090 после выхода из Stop кристалл тактируется от внутреннего RC-генератора HSI, как после сброса, и с битом DBG_STOP, и без него. Программа в обоих случаях должна заново включить кварц и PLL — отлаженный под отладчиком код будет так же работать и без него.

Можно ли отлаживать выход из Standby?

С битом DBG_STANDBY цифровая часть не обесточивается, но при выходе из Standby всё равно формируется системный сброс — программа начинается сначала, как и без отладчика. Пошагово пройти «сквозь» Standby нельзя, можно только остановиться после сброса.

Источники

  1. ST. RM0090: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439 reference manual (Rev 21) — разд. 38.16.1: ядро не позволяет выключать FCLK и HCLK во время отладки; отладчик должен заранее установить биты DBGMCU_CR — DBG_SLEEP (в Sleep HCLK тактируется так же, как FCLK), DBG_STOP (в Stop FCLK и HCLK тактируются от внутреннего RC-генератора); описание DBGMCU_CR: DBG_STOP = 0 — в Stop выключены все такты, после выхода тактирование как после сброса (HSI), программа должна заново включить PLL и кварц, то же и при DBG_STOP = 1; DBG_STANDBY = 1 — цифровая часть не обесточивается, такты от RC-генератора, при выходе из Standby формируется системный сброс; DBG_SLEEP = 0 — в Sleep HCLK выключен
  2. Arm. Arm Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 (IHI 0031G, ID022122) — разд. B4.3.2: пока отладчик держит линию SWDIO в нуле, через подтяжку течёт небольшой ток; если интерфейс долго подключён, а кристалл в режиме низкого потребления, отладчик должен держать линию в единице или в сбросе

Нашли ошибку?