Почему STM32H743 зависает в настройке питания на ACTVOSRDY?
Обновлено Редакция GAW
STM32H743 стартует с минимальным напряжением ядра и в ограниченном режиме Run*: пока программа не сообщит, как питается ядро, запись в ОЗУ запрещена и уровень напряжения менять нельзя. Сообщают это записью в регистр PWR_CR3 — и у этой записи есть особенность, которая превращает простую ошибку в «кирпич».
Что допускает RM0433
| LDOEN | BYPASS | Конфигурация |
|---|---|---|
| 1 | 0 | ядро питается от встроенного LDO (как после включения) |
| 0 | 1 | Bypass: напряжение ядра подаётся снаружи на VCAP |
| 0 | 0 | недопустимо — запись игнорируется |
| 1 | 1 | недопустимо — запись игнорируется |
Младший байт 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 вечно.
Источники
- 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
- 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)
Нашли ошибку?
Смотрите также
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки
- Домены питания D1, D2 и D3 (STM32H7)Три части ядра STM32H7 со своими режимами работы и сна
- Масштабирование напряжения ядра (VOS)Выбор напряжения ядра стабилизатором STM32 под нужную частоту
- Почему ST-LINK перестал подключаться к STM32 после прошивки?Программа заняла SWD или ушла в сон — подключаться под сбросом
- Как настроить PLL1 STM32H743 на 480 МГц?HSE 25 МГц / 5 = 5 МГц, × 192 = 960 МГц VCO, / 2 = 480 МГц