Блокировка конфигурации GPIO (LCKR)
Ошибочный указатель или сбойная ветка кода может переписать регистр режима порта и, например, перевести выход управления силовым ключом во вход. STM32 позволяет заморозить конфигурацию выбранных выводов до следующего сброса — регистром GPIOx_LCKR.
Обновлено Редакция GAW
Блокировка конфигурации GPIO — механизм STM32, который замораживает настройки выбранных выводов порта до следующего сброса. Управляет им регистр GPIOx_LCKR: биты LCK0–LCK15 выбирают выводы, а бит 16 LCKK — ключ, который ставится только особой последовательностью записей (RM0008, разд. 9.1.6 и 9.2.7; RM0090, разд. 8.3.6 и 8.4.8).
Последовательность ключа
По описанию регистра в RM0090 (разд. 8.4.8), все записи 32-битные и с одним и тем же значением в битах 15:0:
- Записать LCKK = 1 вместе с маской LCK[15:0].
- Записать LCKK = 0 с той же маской.
- Записать LCKK = 1 с той же маской.
- Прочитать регистр.
- Прочитать ещё раз и убедиться, что LCKK = 1 — это необязательная проверка.
Если между записями маска изменилась или последовательность нарушена, блокировка не включается. Последовательность лучше выполнять с запрещёнными прерываниями, если обработчики тоже работают с этим портом. В HAL её реализует функция HAL_GPIO_LockPin().
Что замораживается
У STM32F4 — регистры режима и настройки выводов: GPIOx_MODER, OTYPER, OSPEEDR, PUPDR и выбор альтернативной функции в AFRL и AFRH (RM0090, разд. 8.3.6). У STM32F1 каждый бит LCKy замораживает четыре бита своего вывода в регистрах CRL или CRH (RM0008, разд. 9.2.7). Регистр выходных данных не блокируется: вывод GPIO продолжает переключаться через ODR и BSRR.
Зачем
Блокировку ставят на выводы, ошибочная перенастройка которых опасна: затворы силовых ключей, линии разрешения драйверов, выходы аварийного отключения. Если сбойный код переведёт такой вывод во вход, ключ может остаться в неопределённом состоянии. Блокировка не заменяет сторожевой таймер, а дополняет его: таймер перезапускает зависшую программу, а LCKR не даёт программе испортить настройки выводов до этого момента. Режимы выводов STM32, их скорость и токи разобраны в статье «GPIO STM32».
Частые вопросы
Блокирует ли LCKR уровень на выходе?
Нет. Замораживается только конфигурация вывода: режим, тип выхода, скорость, подтяжка и альтернативная функция (RM0090, разд. 8.3.6; у STM32F1 — биты CRL/CRH). Регистр выходных данных ODR и регистр BSRR продолжают работать, так что вывод можно переключать как обычно.
Можно ли снять блокировку программно?
Нет. После правильной последовательности конфигурация остаётся замороженной до следующего сброса микроконтроллера (по RM0090 — также до сброса периферии). Это и есть смысл блокировки: никакой код, в том числе ошибочный, не может её отменить.
Почему блокировка не срабатывает?
Чаще всего нарушена последовательность: между тремя записями изменились биты LCK[15:0], последовательность прервало прерывание, которое тоже обращается к LCKR, или запись шла не 32-битным словом. RM0008 предупреждает, что любая ошибка отменяет блокировку. Проверить результат можно последним чтением: бит LCKK должен читаться как 1.
Источники
- STMicroelectronics. RM0008 Reference manual STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx (Rev 21) — разд. 9.1.6: механизм блокировки замораживает конфигурацию выводов, после последовательности LOCK её нельзя изменить до следующего сброса; разд. 9.2.7: GPIOx_LCKR, смещение 0x18, значение после сброса 0; каждый бит LCKy замораживает 4 бита CRL/CRH своего вывода; бит 16 LCKK — ключ, меняется только последовательностью: записать 1, записать 0, записать 1, прочитать 0, прочитать 1 (последнее чтение необязательно и подтверждает блокировку); во время последовательности LCK[15:0] не должны меняться, любая ошибка отменяет блокировку; биты LCKy записываются только при LCKK = 0
- STMicroelectronics. RM0090 Reference manual STM32F405/415, STM32F407/417, STM32F427/437, STM32F429/439 (Rev 21) — разд. 8.3.6: замораживаются регистры GPIOx_MODER, GPIOx_OTYPER, GPIOx_OSPEEDR, GPIOx_PUPDR, GPIOx_AFRL и GPIOx_AFRH; последовательность выполняется только 32-битным доступом, потому что бит 16 пишется одновременно с битами 15:0; блокировка действует до сброса MCU или сброса периферии; разд. 8.4.8: последовательность WR LCKR[16] = 1 + LCKR[15:0], WR 0 + LCKR[15:0], WR 1 + LCKR[15:0], RD LCKR, RD LCKR[16] = 1 (необязательно); после первой блокировки чтение LCKK возвращает 1 до сброса
Нашли ошибку?
Смотрите также
- GPIO STM32Режимы выводов, регистры F1 и F4, BSRR, AF, скорость, токи, 5 В, код
- GPIOВывод общего назначения: вход и выход, подтяжки, сила выхода, функции
- Альтернативная функция выводаAF: вывод под управлением периферии вместо порта
- Сторожевой таймерWatchdog: сброс МК при зависании программы
- Байты конфигурации (option bytes)Настройки защиты и режимов STM32 во флеш-памяти