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

Почему STM32H743 зависает в настройке питания на ACTVOSRDY?

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

STM32H743 стартует с минимальным напряжением ядра и в ограниченном режиме Run*: пока программа не сообщит, как питается ядро, запись в ОЗУ запрещена и уровень напряжения менять нельзя. Сообщают это записью в регистр PWR_CR3 — и у этой записи есть особенность, которая превращает простую ошибку в «кирпич».

Что допускает RM0433

LDOENBYPASSКонфигурация
10ядро питается от встроенного LDO (как после включения)
01Bypass: напряжение ядра подаётся снаружи на VCAP
00недопустимо — запись игнорируется
11недопустимо — запись игнорируется

Младший байт PWR_CR3 записывается один раз после включения питания. Если записать недопустимую пару, данные не запишутся, механизм однократной записи заблокирует регистр, а флаг ACTVOSRDY в PWR_CSR1 так и будет показывать неверные уровни напряжения. Цикл while (!(PWR->CSR1 & PWR_CSR1_ACTVOSRDY)) в функции инициализации никогда не закончится.

// STM32H743 with the internal LDO (RM0433, 6.4.1, 6.8.4)
PWR->CR3 = (PWR->CR3 & ~(PWR_CR3_BYPASS | PWR_CR3_SCUEN)) | PWR_CR3_LDOEN;
while (!(PWR->CSR1 & PWR_CSR1_ACTVOSRDY)) { }   // only now RAM writes and VOS change

Что проверить

  • Конфигурация в коде совпадает со схемой платы. У STM32H742, H743 и H750 нет импульсного стабилизатора SMPS, поэтому вызовы с SMPS из проектов для других линеек сюда не подходят (STM32H7).
  • Первая запись PWR_CR3 стоит раньше смены VOS и частоты — дальнейшая настройка описана в ответе «Как настроить PLL1 STM32H743 на 480 МГц».
  • В режиме Bypass внешнее напряжение ядра держится выше 1,1 В, пока программа не выключила LDO.

После неудачной записи помогает только выключение питания: PWR_CR3 сбрасывается только по сбросу по питанию. Если отладчик уже не подключается, порядок восстановления — в ответе «ST-Link не видит STM32 после прошивки». Как питание делится на домены D1–D3, описано в термине «Домены питания», уровни VOS — в термине «Масштабирование напряжения».

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

Почему не помогает сброс кнопкой RESET?

PWR_CR3 по RM0433 сбрасывается только сбросом по питанию — ни вывод NRST, ни выход из Standby его не очищают. После неудачной записи регистр остаётся заблокированным с прежней конфигурацией, и только полное выключение питания даёт записать новую.

Плата заблокировалась после прошивки чужого проекта. Как её восстановить?

Выключить питание, удерживая BOOT0 в высоком уровне, включить — тогда ошибочная прошивка не стартует и не заблокирует PWR_CR3, — и стереть флеш-память программатором. Затем прошить проект с правильной конфигурацией питания. Общий порядок восстановления описан в ответе о потерянном ST-Link после прошивки.

Откуда берётся неправильная конфигурация в проекте?

Часто проект переносят с двухъядерного STM32H747 или с STM32H7A3, у которых есть импульсный стабилизатор SMPS и свои варианты питания, на STM32H743, где SMPS нет. Функция инициализации пишет в PWR_CR3 конфигурацию, недопустимую для этой микросхемы, и ждёт ACTVOSRDY вечно.

Источники

  1. STMicroelectronics. RM0433 Reference manual STM32H742, STM32H743/753 and STM32H750 Value line, Rev 9 — разд. 6.4, табл. 34: конфигурации питания — LDO (LDOEN = 1, BYPASS = 0), Bypass с внешним VCORE (LDOEN = 0, BYPASS = 1), комбинации 00 и 11 недопустимы — запись игнорируется; разд. 6.4.1: после включения уровень VOS3 (1,0 В), ядро стартует в режиме Run*, программа задаёт конфигурацию в PWR_CR3 и ждёт ACTVOSRDY в PWR_CSR1; пока ACTVOSRDY не установлен, запись в ОЗУ запрещена и VOS менять нельзя; после Standby конфигурация сохраняется, но ACTVOSRDY всё равно ждут; в режиме Bypass внешнее VCORE должно быть выше 1,1 В, пока LDO не отключён программой; разд. 6.8.4: PWR_CR3 сбрасывается только по POR, младший байт пишется один раз до смены VOS или частоты; неверная пара LDOEN/BYPASS блокирует регистр, ACTVOSRDY показывает недопустимые уровни, нужен повторный цикл питания; SCUEN — бит 2, LDOEN — бит 1, BYPASS — бит 0
  2. STMicroelectronics. cmsis-device-h7, Include/stm32h743xx.h (commit 81db1ec) — PWR_CR3_SCUEN — бит 2, PWR_CR3_LDOEN — бит 1, PWR_CR3_BYPASS — бит 0; PWR_CSR1_ACTVOSRDY — бит 13 (0x2000)

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