Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
3555
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

Управление Flash-памятью

558

Если это так, мы не можем потерять асинхронные события (например, прерывание, которое уведомляет нас о передаче данных), потому что микроконтроллер остановлен (stalled), ожидая выполнение текущей операции. Если это так, то лучше всего переместить код в SRAM (и, в конечном итоге, также переместить и таблицу векторов).

21.3. Байты конфигурации

Байты конфигурации (Option bytes) – это два или более байт, биты которых являются специальными значениями конфигурации. Концепция байтов конфигурации аналогична той, что встречается в других архитектурах микроконтроллеров, например, fuse-битов в серии AVR от Atmel или битов конфигурации (Configuration Bits), заложенных в микроконтроллерах PIC от Microchip.

Каждый отдельный бит этих специальных байтов в области информационного блока (Information Block) имеет особое значение. Количество и тип параметров конфигурации зависят от конкретного микроконтроллера STM32. Наиболее распространенные параметры конфигурации:

BOOT: в большинстве микроконтроллеров STM32 два бита конфигурации позволяют выбрать источник начальной загрузки (FLASH, системная память или

SRAM).

RDP (англ. read protection): эти биты устанавливают уровень защиты от чтения Flash-памяти, и мы более подробно проанализируем их позже в данной главе.

BOR_LEVEL: эти биты содержат порог уровня напряжения питания, который активирует/освобождает сброс. Они могут быть записаны для программирования нового уровня BOR. По умолчанию BOR отключен. Когда напряжение питания (VDD) падает ниже выбранного уровня BOR, генерируется сброс устройства.

Поведение микроконтроллера при переходе в некоторые режимы понижен-

ного энергопотребления: почти во всех микроконтроллерах STM32 можно сконфигурировать микроконтроллер таким образом, чтобы он генерировал сброс при переходе в режим останова или спящий режим.

Аппаратный сторожевой таймер: в некоторых микроконтроллерах STM32 существует один или два бита, используемых для конфигурирования WWDG и IWDG в «аппаратном режиме», то есть они автоматически запускаются после сброса микроконтроллера.

Защита от записи во Flash-память: эти биты позволяют индивидуально защищать от записи некоторые секторы/страницы Flash-памяти, предотвращая запись в них, даже если Flash-память разблокирована. Если для заданного бита установлено значение «1», то соответствующий сектор/страница не защищен от записи; если, напротив, бит установлен в «0», то сектор/страница защищен от записи.

Для программирования байтов конфигурации существуют специальные процедуры, которые не зависят от процедур программирования всей Flash-памяти. Поэтому CubeHAL предоставляет специальные процедуры для использования.

Прежде всего, данную область необходимо разблокировать, вызвав функцию:

HAL_StatusTypeDef HAL_FLASH_OB_Unlock(void);

Далее, заданный байт конфигурации целиком программируется с помощью функции:

Управление Flash-памятью

559

HAL_StatusTypeDef HAL_FLASHEx_OBProgram(FLASH_OBProgramInitTypeDef *pOBInit);

Значение байта конфигурации автоматически изменяется, сначала стирая информационный блок, а затем программируя все байты конфигурации значениями, передаваемыми в процедуру HAL_FLASHEx_OBProgram(). Функция принимает экземпляр структуры Си FLASH_OBProgramInitTypeDef, поля которой представляют собой содержимое заданного байта конфигурации. Для получения дополнительной информации о точном типе и количестве полей обратитесь к исходному коду CubeHAL.

Точно так же, чтобы извлечь содержимое заданного байта конфигурации, мы используем функцию:

HAL_FLASHEx_OBGetConfig(FLASH_OBProgramInitTypeDef *pOBInit);

После изменения байта конфигурации мы должны заставить микроконтроллер перезагрузить свой контент, используя функцию:

HAL_StatusTypeDef HAL_FLASH_OB_Launch(void);

Обратите внимание, что изменение некоторых битов конфигурации в отдельных микроконтроллерах STM32 может привести к сбросу микросхемы.

В конце концов, отладчик ST-LINK и связанный с ним STM32CubeProgrammer предоставляют возможность легко изменять байты конфигурации. Как только вы подключили отладчик ST-LINK к целевому микроконтроллеру, нажмите на значок Option bytes (третий зеленый значок слева). Появится раздел Option bytes, как показано на рисунке 1. Тот же инструмент STM32CubeProgrammer также позволяет стирать выбранные сектора/страницы Flash-памяти.

Рисунок 1: Диалоговое окно Option Bytes configuration в STM32CubeProgrammer

Управление Flash-памятью

560

21.3.1. Защита от чтения Flash-памяти

Прочитайте внимательно

Некоторые процедуры, описанные в данном параграфе, могут сделать ваш микроконтроллер «кирпичом», навсегда не позволяющим вам программировать и стирать его. Внимательно прочитайте содержание этого параграфа и избегайте выполнения операций, если они вам не совсем понятны.

Один байт конфигурации (называемый RDP) заслуживает отдельного параграфа: байт конфигурации, касающийся защиты от чтения Flash-памяти. Во избежание нежелательного доступа к Flash-памяти через интерфейс отладки, можно временно или навсегда отключить доступ к чтению этой памяти из внешнего мира (очевидно, что доступ из ядра ЦПУ и контроллеров DMA всегда возможен). Существует три уровня защиты, которые соответствуют трем различным значениям для хранения в байте конфигурации:

Уровень 0 (без защиты от чтения): когда уровень защиты от чтения установлен на Уровень 0 записью 0xAA в байт конфигурации защиты от чтения (RDP), все операции чтения/записи (если защита от записи не установлена) из/во Flashпамяти или резервного SRAM возможны во всех конфигурациях начальной загрузки (пользовательская начальная загрузка из Flash-памяти, отладка или начальная загрузка из ОЗУ).

Уровень 1 (защита от чтения включена): это уровень защиты от чтения по умолчанию после стирания байтов конфигурации (которое автоматически выполняется процедурой HAL_FLASHEx_OBProgram()). Уровень 1 защиты от чтения ак-

тивируется записью любого значения (кроме 0xAA и 0xCC, используемых для установки Уровня 0 и Уровня 2 соответственно) в байт конфигурации RDP. При установленном Уровне 1 защиты от чтения доступ (чтение, стирание, программирование) к Flash-памяти или резервному SRAM не может быть выполнен при подключенном отладчике или выполнении начальной загрузки из ОЗУ или из загрузчика системной памяти. В случае запроса чтения генерируется исключение отказа шины BusFault. И, напротив, при загрузке из Flash-памяти разрешается доступ (чтение, стирание, программирование) к Flash-памяти и резервному SRAM из пользовательского кода. Когда Уровень 1 активен, программирование байта конфигурации защиты от чтения (RDP) до Уровня 0 приводит к массовому стиранию Flash-памяти и резервного SRAM. В результате область пользовательского кода очищается перед снятием защиты от чтения. Массовое стирание стирает только область пользовательского кода. Другие байты конфигурации, включая защиту от записи, остаются без изменений до операции массового стирания. Область памяти OTP не подвержена массовому стиранию и остается неизменной. Массовое стирание выполняется только тогда, когда активен Уровень 1 и запрошен Уровень 0. При увеличении уровня защиты от чтения (0→1, 1→2, 0→2), массового стирания не происходит.

Уровень 2 (!!!отладка/защита от чтения микросхемы навсегда отключена!!!):

Уровень 2 защиты от чтения активируется записью 0xCC в байт конфигурации RDP. Когда установлен Уровень 2 защиты от чтения:

Все средства защиты, предусмотренные Уровнем 1, активны.

Начальная загрузка из ОЗУ больше не разрешена.