Создание проекта в IDE Keil MDK. Загрузка IDE Keil MDK и в меню Project, страница 2

Перейдем к закладке Utilities. На этой закладке мы выберем и сконфигурируем средства загрузки программы в микроконтроллер.

Во-первых выберем режим Use Target Driver for Flash Programming, во-вторых, установим флаг Use Debug Driver и флаг Update Target before Debugging.

Для загрузки кода программы в микроконтроллер загрузчик необходимо сконфигурировать. Нажмем кнопку Settings и попадем на закладку параметров.

Выберем на этой закладке опцию EraseSectors. В соответствии с этой опцией при записи программы в микроконтроллер  во flash–памяти микроконтроллера будут стираться только те сектора, в которые производится запись. Флаги Program иVerily говорят о том, что при активизации функции программирования после записи данных содержимое памяти микроконтроллера будет сравниваться с исходными данными.

И последнее, что нужно сделать на этой закладке, это выбрать алгоритм программирования flash-памяти. Алгоритм программирования зависит используемого микроконтроллера. Нажимаем кнопку Add и открываем выпадающий список.  В этом списке микроконтроллеры объединены в группы по типу микроконтроллера и объему его flash-памяти.  Микроконтроллеру STM32F407VG соответствует группа STM32F4xxFlash. Нажимаем кнопку Add, а потом несколько раз кнопку OK и завершаем (временно) конфигурирование.

Ctl-F7 – компиляция (Translate). Компилятор обрабатывает файл, который отображается в окне редактора, и создает для него объектный файл.

F7 – сборка проекта. Вначале просматриваются все исходные файлы проекта. Исходные файлы, в которые были внесены изменения после последней компиляции, или новые файлы, включенные в проект, компилируются. После компиляции вызывается линковщик и собирается исполняемый файл.

Компиляцию и сборку программы можно выполнить из основного меню.  Если нужно заново перекомпилировать все исходные файлы проекта и собрать исполняемый файл, то необходимо  использовать последнюю кнопку Rebuild.

Теперь нажмем Ctl-F7 и скомпилируем файл main.c, который открыт в окне редактора. Как видим, компиляция прошла успешно.

Однако при сборке программы, которую запустим, нажав F7, компоновщик выдаст сообщение об ошибке.

Сообщение говорит о том, что компоновщик не смог найти функцию SystemInit(), которая вызывается в файле startup_stm32f4xx.s.

В файле startup_stm32f4xx.s определяется ряд констант необходимых для работы программы и выполняется начальная инициализация микроконтроллера. В частности в этом файле определяются две константы: объем ОЗУ выделяемый под стек (Stack_Size) и объем ОЗУ выделяемый для динамически распределяемой памяти (Heap_Size). По умолчанhию Stack_Mem = 0x00000400 (1024 байта), Heap_Size = 0x00000200 (512 байт). При необходимости эти значения можно изменить.

В файле startup_stm32f4xx.s определена таблица векторов прерываний. Таблица векторов прерываний представляет собой последовательность 32-х разрядных чисел, каждое из которых, кроме двух первых, является адресом соответствующего обработчика прерываний. В микроконтроллерах семейства STM32F4xx таблица векторов прерываний ВСЕГДА расположена по адресу 0x0800 0000. (После начала роботы программы таблицу прерываний можно переместить).

Первые две константы в таблице векторов прерываний это адрес вершины стека (константа __initial_sp) и адрес первой выполняемой команды (константа Reset_Handler).

При включении питания микроконтроллер семейства STM32F4xx ВСЕГДА выполняет следующие операции:

1.  инициализирует стек. Инициализации стека заключается в том, что 32-х разрядная константа __initial_sp загружается в регистр – указатель стека.

2.  константа Reset_Handler загружается в регистр – указатель команд и управление  передается первой выполняемой команде, которая продолжает инициализацию микроконтроллера