Главная » Микроконтроллеры » Cortex-M3: первый проект в Open Source

Cortex-M3: первый проект в Open Source

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

Когда вы начинаете изучать программирование, первым примером, представленным в книгах, обычно является приложение типа «Здравствуй, мир», которое печатает текст на экране, аналогично в случае микроконтроллеров, обычно первая программа представляет собой пример с мигающими светодиодами. Шаг за шагом мы покажем вам, как — на основе модельного проекта — создать собственное приложение.

Подготовленный пример приложения необходимо загрузить , а затем запустить среду Eclipse.

Выберите File-> New-> C Project из меню, которое отобразит окно мастера приложения. В окне «Project Name» введите имя проекта (в данном случае «leds»), а остальные настройки останутся, как на рис. 1.

Рис. 1. Рекомендуемые настройки в окне мастера приложений

После нажатия кнопки «Finish» будет создан пустой проект, который необходимо адаптировать к нашему компилятору. Для этого в окне обозревателя проектов щелкните правой кнопкой мыши каталог проекта leds и выберите пункт «Properties» в контекстном меню.

Появится диалоговое окно, в котором на вкладке «Discovery Options» (рис. 2) вы должны выбрать опцию «Automate Discovery Path And Symbols», а в командном окне вызова компилятора изменить имя компилятора gcc на arm-none-eabi-gcc и подтвердить настройки кнопкой OK. Модификация позволяет автоматически обнаруживать и анализировать заголовочные файлы, прикрепленные к проекту, используя директиву include.

Рис. 2. Рекомендуемые настройки на вкладке «Discovery Options»

Затем на вкладке C / C ++ build-> Settings в окне Binary Parsers выберите параметр Elf Parser, который обеспечит возможность синтаксического анализа полученных файлов средой.

После установки необходимых параметров мы можем приступить к импорту проекта stm32-examples.tgz. Чтобы сделать это в окне Project Explorer необходимо щелкнуть правой кнопкой мыши по проекту и выбрать Import из контекстного меню. Появится окно источника импорта, в котором вы должны выбрать опцию Archive File, а затем перейти к следующему диалоговому окну (кнопка Next).

В окне импорта нажмите кнопку «Browse» и выберите файл stm32-examples.tgz, в результате которого будет показан пример файлов в архиве. Выберите все файлы и завершите импорт файлов, используя клавишу «Finish».

После импорта проекта мы можем приступить к его компиляции (клавиши CTRL + B или из меню Project-> Build All). Если в нижней части окна консоли все идет хорошо, мы должны видеть журналы компиляции, а в окне «Problems» не должно быть никакой информации.

После компиляции проекта нам осталось запрограммировать микроконтроллер. Программирование выполняется с помощью команды make install, которую также можно вызвать непосредственно из Eclipse. Это делается путем создания иконки для выбранного правила создания на вкладке создания целей в правой части главного окна. Для этого просто щелкните значок с зеленым кружком на этой вкладке, чтобы открыть диалоговое окно, в котором можно настроить значок для выбранного правила создания. В этом окне введите правило программы, а затем нажмите кнопку ОК (рис. 3).

Рис. 3. Создание иконки для выбранного правила make на вкладке make target

Рис. 4. Значок программы

После этого на вкладке Make Targets мы сможем увидеть значок с описанием программы (рис. 4).

Чтобы запрограммировать устройство, подключите программатор к компьютеру через USB, а затем щелкните значок, упомянутый выше. Через некоторое время микроконтроллер должен быть запрограммирована, и светодиоды D1, D2 (фото 5) должны попеременно мигать. Мы уже умеем компилировать программы и программировать микроконтроллер, нам еще предстоит отладить приложения.

Рис. 5. Светодиоды на плате STM32Butterfly

Отладка в среде с открытым исходным кодом осуществляется с помощью программы отладчика OpenOCD, задачей которой является непосредственная поддержка интерфейса JTAG и микроконтроллера. Эта программа прослушивает на выбранном порту (3333) соединения из программы отладчика gdb, что позволяет напрямую взаимодействовать с пользователем.

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

Мы начнем подготовку проекта к отладке, добавив программу OpenOCD, чтобы она запускалась после нажатия одной кнопки. Для этого выберите в меню «Start » пункт Run->External Tools->External Tools Configuration, в котором откроется диалоговое окно, позволяющее настроить запуск внешних программ. В окне выберите значок «New Launch Configuration», которая создаст новую конфигурацию запуска. В окне конфигурации (рис. 6) введите путь к программе OpenOCD, укажите рабочий каталог и аргументы.

Рис. 6. Окно конфигурации OpenOCD

После ввода конфигурации мы можем попытаться запустить приложение, нажав кнопку «Run». Приложение будет запущено во внутренней консоли, где оно напишет сообщение о поиске микроконтроллера и останется активным в фоновом режиме. Приложение может быть остановлено нажатием на иконку с символом Stop (Рис. 7).

Рис. 7. Красный квадрат означает Stop — остановить приложение отладки

Нам все еще нужно настроить Eclipse, чтобы среда IDE могла подключаться к серверу OpenOCD и переключаться в режим отладки. Для этого в меню выберите Run -> Debug Configurations, после чего появится диалоговое окно с настройками конфигурации.

В этом окне слева щелкните значок с описанием приложения C / C ++, которое сгенерирует новую конфигурацию. В окне конфигурации выберите проект, который вы хотите отладить (в данном случае, leds), что должно привести к автоматическому назначению двоичного файла приложения в поле C / C ++ Application. Теперь перейдите на вкладку Debugger, где, например, в поле отладчика выберите опцию отладчика gdbserver и задайте имя программы отладчика GDB (рис. 8).

Рис. 8. Рекомендуемые настройки на вкладке «Отладчик»

Рис. 9. Рекомендуемые настройки во вкладке «Подключение»

Затем во вкладке «Connection» выберите «( Connection type ) TCP», в качестве имени хоста должно быть указано localhost, а в поле «port» введите 3333 (рис. 9). Теперь нажмите кнопку «Apply», а затем закройте окно кнопкой «Close».

Теперь попробуем запустить отладчик: для этого запустите программу OpenOCD (щелкнув значок запуска External Tool), затем значок с символом «червь», что должно привести к запуску программы в режиме отладки и остановке приложения в функции main() (рис. 10). При первом запуске сеанса выберите Menu->Debug Configuration, выберите программу ledsDBG, затем нажмите кнопку «Run».

Рис. 10. Вид окна Eclipse с отладкой примера приложения

Теперь, нажав клавишу F6 (Step Over), мы можем отслеживать выполнение отдельных строк программы. Eclipse также позволяет вам устанавливать ловушки в определенных местах программы, щелкнув мышью по синей области перед выбранной линией, позволяет отслеживать переменные. Другие полезные сочетания клавиш включают F5 (Step Into), опцию, которая позволяет вам углубиться в функцию.

Создание проекта

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

Среда Eclipse не предоставляет каких-либо особых примеров поддержки проектов микроконтроллеров, поэтому вы должны создавать все файлы самостоятельно. При создании всего с самого начала это может быть относительно сложной задачей, поэтому наиболее удобно будет использовать готовый базовый проект для данного семейства микроконтроллеров и изменять только тот вариант, который вам необходим. Представленная базовая конструкция для микроконтроллеров STM32 имеет иерархическую структуру, показанную на рис. 11 .

Рис. 11. Структура примера проекта

Каталог scripts содержит скрипты, отвечающие за компиляцию и программирование целевого устройства. Файл stm32.mk — это файл для инструмента make, который автоматизирует процесс сборки. Это база, прикрепленная к основному make-файлу, и она была написана таким образом, что все исходные файлы C, C ++ и S (ассемблер), созданные в файле проекта, скомпилированы автоматически.

Файл stm32.cfg является файлом конфигурации для программы отладчика OpenOCD и содержит описание конфигурации для совместимого с ocdlink интерфейса и конфигурацию для микроконтроллеров семейства STM32. Файл stm32.ld представляет собой скрипт компоновщика, в котором мы можем определить объем памяти, который может быть различным в зависимости от выбранного макета из данного семейства. В строке:

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K

мы можем определить базовый адрес и размер оперативной памяти. В строке:

FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K

мы можем определить базовый адрес и объем флэш-памяти в зависимости от используемого макета.

Каталог lib-stm32 является частью периферийной библиотеки STM32, из которой были извлечены заголовочные файлы (каталог inc) и сценарии компоновщика (* .ld).

Заголовочные файлы были изменены, чтобы содержать только структуры, описывающие периферийные системы. Фактические мигающие светодиоды программы-примера содержатся в каталоге ex-leds.

Основным файлом, управляющим компиляцией проекта, является make-файл. Он содержит несколько полезных опций, которые могут быть изменены пользователем по мере необходимости. Наиболее важная часть файла с точки зрения пользователя показана в примере 1.

Пример 1. Фрагмент make-файла

# Автоматический make-файл для GNUARM (C / C ++)
# здесь введите имя шестнадцатеричного файла
TARGET = leds-example 
# Выходной формат (может быть elf, hex, bin)
FORMAT = hex
# Оптимализация [0,1,2,3, с]
# 0 - без оптимизации, s - оптимизация размера
OPT = 2
# Общие флаги
COMMON_FLAGS = -Wall -pedantic -DSTM32F10X_CL

В целевой переменной у нас есть возможность ввести имя результирующего файла, который будет получен в результате сборки проекта. Поле формата позволяет вам указать тип выходного файла, сгенерированного в результате компиляции. Скрипт предоставляет возможность генерировать файл в формате ELF, Intel Hex или непосредственно в двоичном формате.

Другой важной особенностью является ранее упомянутый режим оптимизации кода результата. У нас есть возможность управлять оптимизацией от уровня 0 (без оптимизации), через 3 (максимальная оптимизация по скорости программы) до опции s (оптимизация программы с точки зрения наименьшего возможного пространства в памяти).

Последняя важная переменная — COMMON_FLAGS, которая позволяет указывать дополнительные общие параметры для компилятора C и C ++. Здесь определено -DSTM32F10X_CL, которое определяет тип микроконтроллера для стандартной периферийной библиотеки STM32. Мы можем определить следующие символы:

— STM32F10X_LD — STM32 Микроконтроллеры с низкой плотностью линий,

— STM32F10X_MD — STM32 микроконтроллеры средней плотности,

— STM32F10X_HD — Микроконтроллеры STM32 Hi Density Line,

— STM32F10X_CL — STM32 Микроконтроллеры линии связи.

Остальные файлы являются исходными файлами на языке Си и несут непосредственную ответственность за работу приложения. Здесь стоит упомянуть файл startup.c, в котором была определена глобальная таблица, назначающая функции векторам прерываний ( пример 2 ).

Пример 2. Глобальная таблица назначения функций векторам прерываний

/ * --------------------------------- * /
// Таблица векторов прерываний
__attribute__ ((section (". isr_vector")))
void (* const exceptions_vectors []) (void) =
{
& _estack, // Начальный указатель стека
reset_handler, // обработчик сброса
unused_vector, // NMIException
unused_vector, // HardFaultException
unused_vector, // MemManageException
unused_vector, // BusFaultException
unused_vector, // UsageFaultException

В файле должна быть назначена функция, которая будет отвечать за обработку данного прерывания. По умолчанию для всех векторов определена функция unused_vector (), которая содержит бесконечный цикл while (1). В нашем простом примере мы не используем никаких прерываний, поэтому здесь нет необходимости добавлять какие-либо функции.

Оставить комментарий

Ваш email нигде не будет показан. Обязательные для заполнения поля помечены *

*