Почему сторожевой таймер сбрасывает STM32 или GD32 во время стирания флеш-памяти?
Обновлено Редакция GAW
Независимый сторожевой таймер IWDG считает от своего генератора LSI и ждёт, что программа вовремя запишет в него ключ перезагрузки. Программа же во время стирания флеш-памяти стоит: по PM0075 любая попытка читать флеш, пока идёт запись или стирание, останавливает шину, а значит, и выборку команд.
Сколько длится остановка
| Операция | STM32F103x8/B (DS5319, табл. 28) | GD32F103x8/B (Rev 3.3, табл. 4-27) |
|---|---|---|
| стирание страницы 1 КБ | 20–40 мс | 50 мс типично, до 400 мс |
| программирование 16 или 32 бит | 40 / 52,5 / 70 мкс (мин. / тип. / макс.) | 37,5 мкс типично, до 105 мкс |
| стирание всей памяти | 20–40 мс | 64 КБ: 1,2 с типично, до 12 с |
Значения DS5319 даны для −40…+105 °C, GD32 — для −40…+85 °C.
Расчёт таймаута
Таймаут IWDG:
Наш расчёт для делителя 32 (PR = 3) и RLR = 249 — 8000 тактов LSI. При типичных 40 кГц это 200 мс, но LSI у STM32F103 бывает и 60 кГц, и тогда таймаут всего 133 мс. Для STM32F103 со стиранием до 40 мс запаса хватает, для GD32F103 с 400 мс — нет. Значения PR и RLR для своего таймаута подберёт калькулятор сторожевых таймеров.
Что делать
- Выбрать таймаут больше худшего стирания — по максимуму из даташита и при наибольшей частоте LSI. Для GD32F103 это больше 400 мс.
- Стирать по одной странице и сбрасывать таймер между операциями, а не стирать сразу всю область.
- Выполнять ожидание из ОЗУ, если таймаут увеличить нельзя.
Где сбрасывать таймер и как контролировать задачи, разобрано в статье «Сторожевой таймер». Отличия GD32F103 от оригинала — на странице GD32F103, а хранение настроек во флеш-памяти, где стирание как раз и нужно, — в ответе «Есть ли у STM32F103 EEPROM?».
Похожие вопросы
Можно ли сбрасывать IWDG прямо во время стирания?
Только если код, который это делает, выполняется не из флеш-памяти — например, функция ожидания размещена в ОЗУ. Тогда чтение флеш не нужно, и ядро может продолжать работать. Но и функция, и всё, что она вызывает, а также таблица векторов для прерываний должны быть вне флеш.
Не проще ли выключить сторожевой таймер на время записи?
Нельзя: запущенный IWDG останавливает только сброс, это свойство самого таймера. Поэтому либо таймаут заранее выбирают больше самой долгой операции, либо стирают по одной странице и сбрасывают таймер между страницами.
Почему с STM32 работало, а с GD32 перестало?
По даташитам стирание страницы у GD32F103 может длиться до 400 мс, а у STM32F103 — до 40 мс. Таймаут, подобранный с запасом для STM32, у клона оказывается меньше худшего времени стирания, и сторожевой таймер срабатывает.
Источники
- STMicroelectronics. PM0075 (Doc ID 17863) Rev 2, August 2012. STM32F10xxx Flash memory microcontrollers, programming manual — разд. 1 Overview (с. 9): во время записи во флеш-память любая попытка её чтения останавливает шину, выборка кода и данных невозможна, пока идёт запись или стирание; 2.3.3 — при чтении или записи во время программирования (BSY = 1) процессор стоит до окончания операции
- STMicroelectronics. STM32F103x8, STM32F103xB Datasheet, DS5319 Rev 20, 2025 — табл. 25 — частота LSI от 30 до 60 кГц, типично 40 кГц; табл. 28 — программирование 16 бит tprog 40 / 52,5 / 70 мкс, стирание страницы 1 КБ tERASE 20–40 мс, стирание всей памяти tME 20–40 мс, −40…+105 °C
- STMicroelectronics. RM0008 Reference Manual STM32F101/102/103/105/107, Rev 21, 2021 — глава IWDG: счёт от LSI через делитель 4 · 2^PR (PR от 0 до 6, то есть /4 … /256), 12-битное значение перезагрузки RLR, ключ 0xAAAA перезагружает счётчик, 0xCCCC запускает таймер; запущенный IWDG останавливается только сбросом
- GigaDevice. GD32F103xx Arm Cortex-M3 32-bit MCU Datasheet, Revision 3.3 — табл. 4-27 (GD32F103x4/6/8/B) — стирание страницы tERASE: типично 50 мс, максимум 400 мс; стирание всей памяти 64 КБ — 1,2 с типично, 12 с максимум; программирование слова — 37,5 мкс типично, 105 мкс максимум
Нашли ошибку?
Смотрите также
- Сторожевой таймерWDT AVR, IWDG и WWDG STM32, таймаут, окно, контроль задач, причина сброса
- Сторожевые таймеры STM32PR и RLR у IWDG, WDGTB, счётчик и окно у WWDG, разброс LSI, код
- GD32F103Cortex-M3 108 МГц: выводы против STM32F103, нумерация с нуля, питание, АЦП
- Есть ли у STM32F103 EEPROM?Нет: флеш-страница, резервные регистры или внешняя EEPROM