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

Процесс начальной загрузки

578

При изменении содержимого регистра VTOR важно учитывать, что:

 

Регистр VTOR недоступен в микроконтроллере на базе Cortex-M0, и, следовательно, невозможно переместить таблицу векторов без использования физического перераспределения памяти (способ обойти это ограничение существует, как мы увидим позже).

В микроконтроллерах STM32F1, основанных на ревизии r1p0 ядра Cortex-M3, биты [31:30] регистра VTOR зарезервированы (см. рисунок 2), и, следовательно, можно переместить таблицу векторов только в область кода (0x0000 0000) и в

SRAM (0x2000 0000).

Спецификация ARM предлагает использовать инструкцию dmb (Data Memory Barrier – «Барьер памяти данных») перед обновлением содержимого регистра VTOR

и инструкцию dsb (Data Synchronization Barrier – «Барьерная синхронизация дан-

ных») после обновления. Обратитесь к Примеру 6 в Главе 20 за полным примером.

Перед изменением содержимого регистра VTOR убедитесь, что минимальная таблица векторов для вашего приложения уже находится в новом расположении.

Если приложение использует периферийные прерывания, приостановите все прерывания перед началом процедуры перемещения.

22.1.3.Запуск микропрограммы из SRAM с помощью инструментария GNU MCU Eclipse

Иногда бывает полезно загрузить бинарную микропрограмму в SRAM и загрузиться с нее. Это требует специальной поддержки отладчика и выполнения следующих шагов:

1.Выводы BOOT (или соответствующий бит в области байтов конфигурации) должны быть сконфигурированы так, чтобы микроконтроллер загружался из SRAM (оба вывода подключаются к VDD в большинстве микроконтроллеров STM32).

2.Скрипт компоновщика должен быть изменен так, чтобы область FLASH отображалась на начальный адрес 0x0000 0000 (или на адрес 0x2000 0000, который соответствует той же памяти, если SRAM выбрано в качестве начального адреса (origin) начальной загрузки).

3.OpenOCD должен быть правильно проинструктирован для установки начального значения счетчика команд на начальный адрес (origin) SRAM плюс 4 Байта.

Первый шаг может быть легко выполнен в платах Nucleo, подключив как вывод BOOT0 (который соответствует выводу 7 в Morpho-разъеме CN7), так и вывод BOOT1 (то есть вывод PB2 почти во всех микроконтроллерах STM32 с корпусом LQFP-48, и который соответствует выводу 22 в Morpho-разъеме CN10) к VDD, как показано на рисунке 3.

Второй шаг обычно может быть ограничен изменением начального адреса (origin) Flash-памяти в скрипте компоновщика (файл mem.ld в инструментарии Eclipse GNU MCU), установкой ее начального адреса (origin) в 0x0000 0000 (или адрес 0x2000 0000, который также соответствует памяти SRAM). Если эта процедура звучит для вас в новинку, вам следует лучше изучить Главу 20.

Наконец, нам нужно дать команду OpenOCD, чтобы он установил в счетчике команд (Program Counter, PC) базовый адрес памяти SRAM. Это можно просто сделать, изменив конфигурацию отладки для нашего проекта, перейдя в раздел Startup, а затем устано-

вив флажок на записи Debug from RAM и сняв флажок с Pre-run/Restart reset. Эти настройки также приведут к тому, что микропрограмма будет каждый раз загружаться