Почему отладчик теряет связь со STM32, когда тот уходит в режим Stop?
Обновлено Редакция GAW
Отладчик Cortex-M общается с кристаллом через порт отладки, а тот работает от тактов ядра и шины. RM0090 прямо пишет: ядро не позволяет выключать эти такты во время отладки. Но режимы низкого потребления устроены именно так, что такты выключаются, — и, если ничего не настроить, в Stop отладчик теряет связь, а среда показывает ошибку или «зависание».
Биты DBGMCU_CR
ST предусмотрела в регистре DBGMCU_CR три бита, которые отладчик должен установить заранее:
| Бит | Режим | Если 0 | Если 1 |
|---|---|---|---|
| DBG_SLEEP | Sleep | HCLK выключен | HCLK тактируется как FCLK |
| DBG_STOP | Stop | все такты выключены | FCLK и HCLK от внутреннего RC-генератора |
| DBG_STANDBY | Standby | цифровая часть обесточена | цифровая часть питается, такты от RC, выход — через сброс |
По RM0090 их выставляет отладчик до того, как кристалл уйдёт в сон; на время отладки их можно записать и из самой программы в начале main(). Что происходит с кристаллом в каждом режиме, объясняют статьи о режиме Stop и режиме Sleep.
Цена отладки во сне
С DBG_STOP = 1 в Stop работает внутренний RC-генератор, и ток потребления больше, чем в настоящем Stop. Есть и вторая мелочь: Arm в спецификации отладочного интерфейса отмечает, что пока отладчик держит линию SWDIO в нуле, через подтяжку течёт ток — при подтяжке 100 кОм и питании 3,3 В это
(наш расчёт) — сравнимо с током некоторых режимов сна. Поэтому ток сна меряют без отладчика: как это сделать, разобрано в ответе «Как измерить ток микроконтроллера в режиме сна».
Если связь уже потеряна
Если программа сразу после старта уходит в 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 нельзя, можно только остановиться после сброса.
Источники
- 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 выключен
- Arm. Arm Debug Interface Architecture Specification ADIv5.0 to ADIv5.2 (IHI 0031G, ID022122) — разд. B4.3.2: пока отладчик держит линию SWDIO в нуле, через подтяжку течёт небольшой ток; если интерфейс долго подключён, а кристалл в режиме низкого потребления, отладчик должен держать линию в единице или в сбросе
Нашли ошибку?
Смотрите также
- JTAG и SWDTAP из 16 состояний, IR/DR, пакеты SWD, ACK, DP и AP, SWO, VTref
- Режим StopРежим низкого потребления STM32: такты остановлены, ОЗУ и регистры сохранены
- Режимы снаSleep mode: Idle, Power-down, пробуждение и ток
- Почему ST-LINK перестал подключаться к STM32 после прошивки?Программа заняла SWD или ушла в сон — подключаться под сбросом
- Как измерить ток микроконтроллера в режиме сна?Нужен микроамперный предел или шунт, и шунт закорачивают при пробуждении