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

Почему сторожевой таймер сбрасывает 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:

T=4⋅2PR⋅(RLR+1)fLSIT = \frac{4 \cdot 2^{PR} \cdot (RLR + 1)}{f_\text{LSI}}

Наш расчёт для делителя 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, у клона оказывается меньше худшего времени стирания, и сторожевой таймер срабатывает.

Источники

  1. STMicroelectronics. PM0075 (Doc ID 17863) Rev 2, August 2012. STM32F10xxx Flash memory microcontrollers, programming manual — разд. 1 Overview (с. 9): во время записи во флеш-память любая попытка её чтения останавливает шину, выборка кода и данных невозможна, пока идёт запись или стирание; 2.3.3 — при чтении или записи во время программирования (BSY = 1) процессор стоит до окончания операции
  2. 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
  3. 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 останавливается только сбросом
  4. 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 мкс максимум

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