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

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

598

Flash-памяти не будет содержать значение 0xAABBCCDD (скоро об этом будет рассказано). Затем MSP устанавливается на конец SRAM (это действие должно быть ненужным, но на всякий случай…), и выполняется физическое перераспределение памяти (строка 167). Затем управление передается основной микропрограмме.

Существует несколько моментов, на которые стоит обратить внимание. Прежде всего, чтобы упростить процесс копирования и избежать перезаписи таблицы векторов растущим стеком, таблица векторов копируется в SRAM, начиная с ее начала, а остальные данные приложения (сформированные секции .data, .bss, куча и стек) размещаются далее (см. рисунок 7). Для этого необходимо, чтобы скрипт компоновщика основной микропрограммы был правильно сконфигурирован, как показано ниже:

MEMORY {

FLASH (rx) : ORIGIN = 0x08002C00, LENGTH = 64K - 10K

RAM (xrw) : ORIGIN = 0x200000B8, LENGTH = 8K - 0xB8

Во-вторых, нам нужен способ узнать, где заканчиваются таблицы векторов. Поскольку не все IRQ обычно разрешены в приложении, мы можем поместить значение «часового» 0xAABBCCDD в запись первого же вектора, идущего сразу после последнего использованного IRQ. Например, предполагая, что наша основная микропрограмма использует USART2 в режиме прерываний, можно увидеть, что этот IRQ является 46-й записью в таблице векторов. Мы можем разместить значение «часового» в 47-ю запись. Это можно легко сделать, изменив файл startup_stm32f0xxx.S, как показано ниже.

 

Имя файла: src/startup_stm32f030x8.S

 

 

 

 

 

 

180

.word SPI1_IRQHandler

/* SPI1

*/

181

.word SPI2_IRQHandler

/* SPI2

*/

182

.word USART1_IRQHandler

/* USART1

*/

183

.word USART2_IRQHandler

/* USART2

*/

184

.word 0xAABBCCDD

/* Зарезервировано

*/

185

.word 0

/* Зарезервировано

*/

186

.word 0

/* Зарезервировано

*/

 

 

 

 

Таким образом, у нас есть универсальный и конфигурируемый способ установки конца таблицы векторов. Взглянув на предыдущий фрагмент скрипта компоновщика, можно увидеть, что мы вычитаем из объема памяти SRAM значение 0xB8, которое составляет 184 в десятичной системе счисления. Разделив 184 на 4 Байта, получим 46, что соответствует последней записи таблицы векторов.

Наконец, обратите внимание, что SYSCFG является периферийным устройством, отделенным от ядра Cortex-M, и нам нужно включить его, вызвав __HAL_RCC_SYSCFG_CLK_ENABLE().

22.3.2. Как использовать инструмент flasher.py

Как было сказано ранее, вы можете найти скрипт Python с именем flasher.py в файлах с исходным кодом книги для этой главы. Данный инструмент просто позволяет загружать в микроконтроллер микропрограмму, созданную в виде бинарного формата Intel HEX – спецификации для бинарных файлов, разработанной Intel несколько лет назад и до сих пор широко распространенной, особенно на недорогих встроенных платформах. Исходный код этого скрипта здесь не показан, но очень легко понять, как он сделан. Для

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

599

этого скрипта требуются три дополнительных модуля: библиотеки pyserial, IntelHex и pycrypto18.

Пользователи Linux и Mac могут легко установить их с помощью команды pip:

$ sudo pip install intelhex crypto pyserial

Вместо этого пользователи Windows могут установить модули pyserial и IntelHex с помощью команды pip:

$ sudo pip install intelhex pyserial

при этом им нужно загрузить с этого сайта19 предварительно скомпилированный выпуск библиотеки pycryto (выберите выпуск, соответствующий вашей версии Python и типу платформы).

Скрипт разработан так, чтобы принимать два аргумента в командной строке:

Последовательный порт, соответствующий VCP платы Nucleo

В Windows он равен строке “COMx”, где «x» должен быть заменен номером COM-порта, соответствующего VCP платы Nucleo (например, COM3).

В Linux и Mac OS он соответствует файлу, отображаемому в пути /dev

(обычно что-то похожее на /dev/tty.usbmodemXXXX).

Полный путь к HEX-файлу, соответствующему основной микропрограмме.

Рисунок 8: Бинарный файл в формате HEX внутри папки сборки Eclipse

По умолчанию инструментарий GNU MCU Eclipse автоматически генерирует HEX-файл скомпилированной микропрограммы. Вы можете найти его в папке сборки (build folder): это папка Eclipse с таким же именем активной конфигурации сборки (обычно называемая Debug или Release). На рисунке 8 показана папка сборки, соответствующая активной конфигурации (CH22-APP1), если вы работаете с официальным репозиторием примеров книги.

18 pycrypto представляет собой набор как защищенных хеш-функций (таких как SHA256 и RIPEMD160), так и различных алгоритмов шифрования (AES, DES, RSA и т. д.). Это самая распространенная криптографическая библиотека для Python, разработанная и поддерживаемая Дуэйном Литценбергером (Dwayne Litzenberger). IntelHex – это небольшая библиотека, позволяющая легко манипулировать файлами Intel HEX. Она разработана Александром Бельченко и распространяется по лицензии BSD.

19 http://www.voidspace.org.uk/python/modules.shtml#pycrypto

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

600

Рисунок 9: Как получить полный путь к HEX-файлу

Вы можете получить полный путь к HEX-файлу, щелкнув по нему правой кнопкой мыши и выбрав пункт Properties. Вы можете найти полный путь в представлении Resource, как показано на рисунке 9.