DBGMCU (блок отладки MCU в STM32)
Программа остановилась на точке останова, а сторожевой таймер продолжает считать и через секунду перезапускает микроконтроллер — отладка превращается в мучение. В STM32 этим управляет блок DBGMCU: он решает, что из периферии стоит вместе с ядром, и сохраняет связь с отладчиком в режимах сна.
Обновлено Редакция GAW
Содержание
DBGMCU (MCU debug component) — блок STM32, который помогает отладчику: решает, какие таймеры и сторожевые таймеры останавливаются вместе с ядром на точке останова, сохраняет такты отладки в режимах сна и задаёт выводы трассировки. В нём же лежит регистр DBGMCU_IDCODE с кодом изделия и ревизией кристалла (RM0008, разд. 31.16 и 31.6.1).
Регистры
| Регистр | Адрес | Назначение |
|---|---|---|
| DBGMCU_IDCODE | 0xE004 2000 | DEV_ID[11:0] — код изделия, REV_ID[15:0] — ревизия |
| DBGMCU_CR | 0xE004 2004 | отладка Sleep, Stop и Standby; у STM32F1 также заморозка периферии и трассировка |
| DBGMCU_APB1_FZ | 0xE004 2008 | STM32F4: заморозка таймеров, IWDG, WWDG, тайм-аутов I²C и CAN на APB1 |
| DBGMCU_APB2_FZ | 0xE004 200C | STM32F4: заморозка таймеров на APB2 |
По RM0008 (разд. 31.16.3, 31.6.1–31.6.3) и RM0090 (разд. 38.16.3–38.16.5). Все регистры доступны только 32-битными словами и сбрасываются по включению питания, а не системным сбросом, поэтому отладчик может настроить их, удерживая микроконтроллер в сбросе. Код DEV_ID программа и отладчик читают в одном месте. С JTAG ID-кодами его не путают: у STM32F1 их два (RM0008, разд. 31.6.2–31.6.3). ID-код TAP граничного сканирования, например 0x16410041 у STM32F103x8/B ревизии B, содержит тот же DEV_ID 0x410 в битах [23:12] (наш вывод из значений RM0008). А IDCODE порта отладки Cortex-M3 — стандартный код Arm 0x3BA00477, и с DEV_ID он не связан.
Отладка сна
Ядро не позволяет выключить такты FCLK и HCLK во время сеанса отладки, но режимы сна их выключают (RM0008, разд. 31.16.1). Поэтому без DBGMCU отладчик теряет связь, как только программа уходит в Stop. Биты DBGMCU_CR это исправляют:
- DBG_SLEEP — в Sleep шина продолжает тактироваться;
- DBG_STOP — в Stop такты FCLK и HCLK берутся от внутреннего RC-генератора;
- DBG_STANDBY — в Standby цифровая часть не обесточивается, а выход из Standby всё равно идёт через системный сброс.
Наш вывод: раз генератор остаётся включённым, ток во сне в отладочном режиме не соответствует реальному, и измерять потребление нужно без этих битов. Почему отладчик отваливается в Stop — разбор в вопросе «Почему отладчик теряет связь со STM32 в режиме Stop».
Заморозка периферии
На точке останова периферия может продолжать работать или стоять (RM0008, разд. 31.16.2). Сторожевой таймер обычно замораживают, иначе он перезапустит микроконтроллер, пока программист читает переменные. Таймеры замораживают, если важна повторяемость, и оставляют, если они ведут ШИМ. Для таймеров с комплементарными выходами ST предусмотрела защиту: когда счётчик заморожен, выходы отключаются, как при сброшенном MOE. Как отладчик подключается к ядру — в статье «JTAG и SWD».
Частые вопросы
Почему STM32 перезагружается, пока я стою на точке останова?
Потому что сторожевой таймер продолжает считать, когда ядро остановлено. Нужно поставить бит DBG_IWDG_STOP (и DBG_WWDG_STOP для оконного): у STM32F1 он в DBGMCU_CR, у STM32F4 — в DBGMCU_APB1_FZ (RM0008, разд. 31.16.3; RM0090, разд. 38.16.4).
Почему на точке останова пропал ШИМ на мотор?
Скорее всего, таймер заморожен битом DBG_TIMx_STOP. У таймеров с комплементарными выходами RM0008 при этом отключает выходы, как при сброшенном MOE, — это сделано ради безопасности силовых ключей (разд. 31.16.2). Если ШИМ должен идти и на останове, бит сбрасывают; для силовых схем делать это стоит осторожно.
Сбрасывает ли настройки DBGMCU кнопка RESET?
Нет. Регистры DBGMCU сбрасываются только при включении питания (POR), а не системным сбросом (RM0008, разд. 31.16.3; RM0090, разд. 38.16.4). Наш вывод отсюда: если программа однажды поставила биты отладки сна, ток потребления во сне останется повышенным и после нажатия RESET — до выключения питания.
Источники
- STMicroelectronics. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21) — разд. 31.16: DBGMCU поддерживает отладку в режимах пониженного потребления, управляет тактами таймеров, сторожевых таймеров, I2C и bxCAN во время останова и назначением выводов трассировки; 31.16.1: ядро не даёт выключить FCLK и HCLK во время сеанса отладки; DBG_SLEEP подаёт HCLK в Sleep, DBG_STOP оставляет внутренний RC-генератор для FCLK и HCLK в Stop; 31.16.2: таймеры и сторожевые таймеры на точке останова могут продолжать счёт (например, ШИМ мотора) или стоять (сторожевой таймер); у таймеров с комплементарными выходами при остановленном счётчике (DBG_TIMx_STOP = 1) выходы отключаются, как при сброшенном MOE; 31.16.3: DBGMCU_CR по адресу 0xE004 2004, только 32-битный доступ, сбрасывается по POR, а не системным сбросом, отладчик может писать его под сбросом, программа тоже; бит 2 DBG_STANDBY — цифровая часть не обесточивается, при выходе из Standby генерируется системный сброс; бит 8 DBG_IWDG_STOP, бит 9 DBG_WWDG_STOP, биты DBG_TIMx_STOP; TRACE_IOEN и TRACE_MODE — назначение выводов трассировки; разд. 31.6.1: DBGMCU_IDCODE по 0xE004 2000, DEV_ID[11:0] и REV_ID[15:0], доступен по JTAG, SWD и программе даже под системным сбросом; разд. 31.6.2: JTAG ID-код TAP граничного сканирования у medium-density — 0x06410041 (ревизия A) и 0x16410041 (ревизии B, Z, Y); разд. 31.6.3: ID-код TAP Cortex-M3 — неизменённый код Arm 0x3BA00477, доступен только через JTAG
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21) — разд. 38.6.1: DBGMCU_IDCODE по 0xE004 2000, для идентификации инструментам использовать только DEV_ID[11:0]; разд. 38.16.3: DBGMCU_CR; разд. 38.16.4: DBGMCU_APB1_FZ по 0xE004 2008 (бит 12 DBG_IWDG_STOP, бит 21 DBG_I2C1_SMBUS_TIMEOUT, CAN1/CAN2 и таймеры APB1), сбрасывается по POR, а не системным сбросом; разд. 38.16.5: DBGMCU_APB2_FZ по 0xE004 200C — таймеры на APB2
Нашли ошибку?
Смотрите также
- JTAG и SWDTAP из 16 состояний, IR/DR, пакеты SWD, ACK, DP и AP, SWO, VTref
- Точка остановаАдрес, на котором отладчик останавливает выполнение программы
- Сторожевой таймерWatchdog: сброс МК при зависании программы
- Режим StopРежим низкого потребления STM32: такты остановлены, ОЗУ и регистры сохранены
- Почему отладчик теряет связь со STM32, когда тот уходит в режим Stop?В Stop гаснут такты; бит DBG_STOP в DBGMCU_CR оставляет их для отладки