Cortex Microcontroller Software Interface Standard ( CMSIS ) содержит в своем составе программный интерфейс к периферийным модулям ядра и периферии различных микроконтроллеров Cortex-M3(M0).
Из обязательной части стандарт рекомендует использовать доступ к регистрам с помощью указателей на структуры в языке С ( например, доступ к регистру GPIOB_BRR осуществляется как GPIOB->BRR ). Для этого достаточно подключить к проекту заголовочный файл для конкретного микроконтроллера, который содержит включение заголовочного файла ядра core_cm3.h и заголовочного файла system_xxxx.h дополнительных функций CMSIS для конкретной модели xxxx микроконтроллера. Эти файлы должны быть включены в проект , если Вы собираетесь хоть как-то использовать CMSIS.
Необязательная часть стандарта CMSIS содержит различные функции инициализации ядра и периферии. Для использования этих функций необходимо откомпилировать исходные файлы core_cm3.c и system_xxxx.c, где xxxx – общее название микроконтроллера( семейства ). В каталоге CMSIS есть примеры простых проектов для различных инструментальных средств, в том числе и Sourcery G++ Lite, что делает возможным использование компилятора C из коллекции GCC.
Проект предназначен для работы в интегрированной среде разработки Keil uVision 4 с использованием внешнего компилятора GCC. Попытка переделать проект в Eclipse не увенчалась успехом, поскольку часть необходимого для загрузки программы кода добавляется к проекту средой разработки . Пришлось написать стартовый код , скрипт компоновки и Makefile самостоятельно.
Поскольку для операционных систем windows — семейства инструментальных средств предостаточно, то я буду делать уклон на использование Eclipse + CMSIS в Linux ( Fedora Electronic Lab ).

Итак , скачиваем проект ( загрузить ) и копируем его в свое рабочее пространство. Далее делаем импорт проекта в Eclipse( File → Import → General → File System ).

Проект полностью написан на языке С , содержит стартовый файл ( тоже на С ). Также , как и все проекты для ARM под GCC этот имеет скрипт компоновщика и Makefile. Теперь рассмотрим более детально каждый из перечисленных файлов.

Скрипт компоновщика STM32F103.ls написан для микроконтроллера STM32F103RBT6, который содержит 128 кБайт памяти программ и 20 кБайт памяти данных. Если объем памяти Вашего микроконтроллера STM32F10x отличается от заданного — подкорректируйте файл скрипта компоновки.

В теле MEMORY именуются доступные области памяти, устанавливаются права доступа ( rwx ), описываются начальные адреса и размеры областей.
В теле SECTIONS описываются доступные секции, основные из которых .text (память программ), .data ( память данных ) и .bss( секция переменных с нулевым начальным значением ).

Для сегмента кода устанавливается начальный адрес 0x00000000, туда ( в .text ) впихивается секция векторов прерываний .cs3.interrupt_vector. Звездочка в начале означает, что если Вы пожелаете разнести таблицу векторов по разным файлам, то все эти области будут сложены в одну. Также секции .text и .rodata из всех исходных файлов будут скомпонованы в одну секцию .text и .rodata соответственно.

Переменная __cs3_stack будет содержать последний адрес в области памяти данных.
Итак, постепенно мы переходим к последнему файлу из рассматриваемого списка — Makefile.

Макеfile для проекта с использованием CMSIS ничем не отличается от мейкфайла для любого другого проекта, за исключением ключа компиляции -DSTM32F10X_MD, который аналогичен директиве #define STM32F10X_MD и определяет имя STM32F10X_MD, необходимое для подстановки в файлах CMSIS строк, соответствующих классификации MEDIUM STM32.

В качестве программатора используется openocd. Для того, чтобы прошить программу в память микроконтроллера, необходимо всего лишь запустить цель «Make program» из окна «Make targets» в Eclipse.

Наконец-то я убрал из Makefile абсолютный путь к каталогу bin пакета Sourcery G++ Lite в Fedora Electronic Lab. Для этого пришлось вручную добавить строчку PATH=$PATH:/usr/local/CodeSourcery/Sourcery_G++_Lite/bin/ в файл /etc/profile.
Вторая проблема, с которой я столкнулся , работая в Fedora Linux, — это отказ openocd распознавать адаптер FTDI JTAG. Проблема решается запуском openocd с правами пользователя root. Чтобы избежать всяческих неприятных моментов, связанных с ограничениями прав доступа, я запускаю Eclipse из-под root-а.
Кто работал в Linux, знает , что графический вход в систему для суперпользователя root заблокирован в целях безопасности. Найденные в сети интернет способы разблокироть графический вход под root-ом в Fedora Electronic Lab не приведут к желаемому результату, поэтому единственным вариантом остается запускать Eclipse из терминала с правами root-а.

Рабочее пространство располагается в каталоге /root/workspace.
Для копирования файлов я использую менеджер файлов, подобный Norton(Volkov) Commander-у, который называется Midnight Commander( mc ), для его установки необходимо выполнить следующую команду в терминале при наличии соединения с сетью интернет.

Запуск менеджера файлов осуществляется командой mc.

Теперь хочу сказать пару слов о самой программе. Программа предельно проста, она осуществляет поочередную установку и сброс PC12 микроконтроллера STM32F103RBT6 для управления светодиодом, который расположен на этой линии порта C в отладочной плате STM32F103-HB. Для создания временной задержки используется цикл for, значение параметра задержки функции Delay приблизительно соответсвует значению в миллисекундах.

Viewed 21686 times by 5580 viewers

Last modified: 26/10/2020

Author

Comments

Здравствуйте!
У меня вопрос по работе с Code Sourcery. Заголовочные файлы можно инклюдить в кавычках и в угловых скобках. Я так понимаю, если написать имя в угловых скобках, то code sourcery возьмет заголовочный файл из той папки, куда codesourcery установлен. Но один заголовочный файл может лежать в разных подпапках, например J:\ARM\Sourcery 2010.09-51\arm-none-eabi\include\stdint.h и J:\ARM\Sourcery 2010.09-51\lib\gcc\arm-none-eabi\4.5.1\include\stdint.h. Где прописано какой именно файл используется?
И с подключением библиотек тоже не могу разобраться. Пути к библиотекам нужно всегда конкретно указывать линкеру директивой -L? Зачем тогда директива -nostdlib?

Заголовочные файлы можно инклюдить в кавычках и в угловых скобках. Я так понимаю, если написать имя в угловых скобках, то code sourcery возьмет заголовочный файл из той папки, куда codesourcery установлен.

И с подключением библиотек тоже не могу разобраться. Пути к библиотекам нужно всегда конкретно указывать линкеру директивой -L? Зачем тогда директива -nostdlib?

Некоторые библиотеки ( например stdlib ) являются стандартными для языка С, поэтому никаких дополнительных движений для их подключения совершать не нужно. Ключ «-nostdlib» указывает GCC не подключать автоматически библиотеку stdlib. Ключем -L Вы можете указать компилятору пути к своим или «левым» библиотекам. Конкретная же библиотека подключается с помощью ключа -lname, название библиотеки в этом примере должно быть libname.a или libname.so

Comments are closed.