Как вы используете CMSIS без IDE? - PullRequest
2 голосов
/ 11 февраля 2020

Я работаю с STM32F103C8T6 и хотел бы использовать CMSIS, , который по сути является просто определениями регистра, а не кодом , чтобы упростить мою жизнь, оставаясь при этом на низком уровне. Проблема в том, что я понятия не имею, как установить библиотеку для использования в командной строке с Makefile. Кажется, что вся документация связана с c IDE, определяемой поставщиком, такой как STM32CubeIDE.

Полагаю, первое, что нужно сделать, это загрузить библиотеку CMSIS, которую я нашел на GitHub . Однако после распаковки ARM.CMSIS.5.6.0.pack я не нашел файлов с именем stm32f10x.h. Я потратил еще немного времени и нашел пакет CMSIS для указанного c MCU, который я использую, но он не содержит core_cm3.h, который, однако, представлен в ARM.CMSIS.5.6.0.pack. В документе говорится, что мне нужно включить оба проекта в свой проект, поэтому мне нужно скопировать файлы, загруженные из разных мест, в мой проект или как?

В качестве дополнительного вопроса: что такое отношения между CMSIS и Keli? Специфичный для устройства c пакет CMSIS загружен с www.keil.com, но я пока не хочу использовать Keil MDK, так как он кажется коммерческим продуктом, а набор инструментов GNU Arm очень хорошо мне подходит.


Редактировать: Я должен был быть более точным c с самого начала, но теперь давайте сосредоточимся на том, как построить Basi c CMSIS Пример как минимальный, полный и проверяемый пример.

Что я сделал:

  1. Загрузите и разархивируйте CMSIS-Core и CMSIS-DFP в /Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/ и /Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/ соответственно.
  2. Создайте файл с именем main.c и скопируйте в него содержимое базового c примера .
  3. Добавьте #define STM32F10X_MD в самой первой строке в укажите чип.
  4. Исправьте опечатки: замените : в строке 31 на ; и замените строку 33 в timer1_init (42);.
  5. Постройте и получите ошибку

/tmp $ arm-none-eabi-gcc -I/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/CMSIS/Include/ -I/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/Device/Include/ main.c
main.c: In function 'main':
main.c:42:5: warning: implicit declaration of function 'Get_InputValues' [-Wimplicit-function-declaration]
   42 |     Get_InputValues ();                          // Read Values
      |     ^~~~~~~~~~~~~~~
main.c:44:5: warning: implicit declaration of function 'Calculation_Response' [-Wimplicit-function-declaration]
   44 |     Calculation_Response ();                     // Calculate Results
      |     ^~~~~~~~~~~~~~~~~~~~
main.c:45:5: warning: implicit declaration of function 'Output_Response' [-Wimplicit-function-declaration]
   45 |     Output_Response ();                          // Output Results
      |     ^~~~~~~~~~~~~~~
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s: Assembler messages:
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:197: Error: selected processor does not support `wfe' in ARM mode
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:310: Error: selected processor does not support `cpsid i' in ARM mode
/var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//cc1ZVBaH.s:318: Error: selected processor does not support `cpsie i' in ARM mode

Согласно комментарию @ KamilCuk ниже, я добавил дополнительные опции и закомментировал функции Get_InputValues, Calculation_Response и Output_Response, но теперь У меня разные ошибки.

/tmp $ arm-none-eabi-gcc -I/Users/nalzok/Developer/CMSIS/ARM.CMSIS.5.6.0/CMSIS/Include/ -I/Users/nalzok/Developer/CMSIS/Packs/Keil.STM32F1xx_DFP.2.3.0/Device/Include/ -D STM32F1 -D STM32F103x6 -mthumb -mcpu=cortex-m3 main.c
/Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/lib/thumb/v7-m/nofp/libc.a(lib_a-exit.o): in function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
/Users/nalzok/opt/xPacks/arm-none-eabi-gcc/9.2.1-1.1/bin/../lib/gcc/arm-none-eabi/9.2.1/../../../../arm-none-eabi/bin/ld: /var/folders/m4/7my6q_kj6pxgzb1b7pxyhp0h0000gn/T//ccqfC5LA.o: in function `Device_Initialization':
main.c:(.text+0x164): undefined reference to `SystemCoreClock'
collect2: error: ld returned 1 exit status

Ответы [ 2 ]

3 голосов
/ 11 февраля 2020

Для последних версий заголовков устройств я предлагаю загрузить пакет STM32CubeF1 с веб-сайта ST. Среди прочего (Middlewares, HAL et c.) Этот пакет содержит требуемые заголовки устройств в папке /Drivers/CMSIS/Device. Для правильной работы заголовка stm32f1xx.h необходим символ STM32F103xB.

Конечно, пакет STM32CubeF1 также содержит библиотеки CMSIS, но, как правило, они немного устарели. Я предпочитаю скачивать их как .pack файлы из репозитория github, который вы упомянули. Заголовки нужны как минимум в /CMSIS/Core. Вы можете добавить дополнительные части CMSIS, если вы sh. Некоторые из них (например, DSP) могут также потребовать добавления библиотек stati c, представленных в папках /Lib.

Имейте в виду, что если вы клонируете репозиторий CMSIS из github вместо загрузки файла .pack в результате вы получаете заполненные версии библиотек stati c, поскольку в проекте используется git LFS . Вы не можете напрямую использовать эти библиотечные файлы stati c (файлы .a), поскольку они являются просто указателями. Я не знаком с git LFS , но, полагаю, вам нужны некоторые git команды (возможно, оформить заказ), чтобы сообщить P C о загрузке реальных файлов .a.

Также обратите внимание, что иногда структура папок CMSIS меняется от версии к версии. Структура папок, которую вы получаете в STM32CubeF1 , может отличаться от той, которую вы загружаете из официального репозитория CMSIS.

Я забыл упомянуть: кроме заголовков устройств CMSIS и ST, вам также нужны следующие файлы:

  • system_stm32f1xx. c ( STM32CubeF1 пакет /Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates папка)
  • startup_stm32f103xb.s ( STM32CubeF1 пакет /Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc папка)
  • Сценарий компоновщика из STM32CubeF1 пакет /Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker папка. Как ни странно, для STM32F103x8 их нет, поэтому вам, вероятно, нужно выбрать STM32F103xB и изменить его. Я использую сгенерированную IDE.

Обновление:

Здесь вы можете найти минимальный проект, созданный в STM32CubeIDE. Я создал пустой проект C. В среде IDE есть сценарий компоновщика и файл запуска (.s), но я удалил их и использовал те, которые включены в пакет STM32CubeF1 . Я также удалил несвязанные файлы заголовков из каталога / Drivers / Device / ST / STM32F1xx / Include. Но я не коснулся файлов в / Drivers / CMSIS / Core / Include, хотя там много несвязанных файлов, так как сложнее определить, какие нужны, а какие нет.

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

Примечание. Примером примера проекта является blinky. куб но в проекте нет куба. Я использую это соглашение об именах просто для указания используемой среды IDE, в данном случае STM32CubeIDE.

3 голосов
/ 11 февраля 2020

Для той части CMSIS, на которую вы ссылаетесь, часть поставляется ARM (ядро CMSIS), а часть - вашим поставщиком микросхем (Device Family Pack). Как вы обнаружили, пакеты программного обеспечения CMSIS - это просто zip-файлы под другим именем. Вы можете распаковать их где угодно sh. Как вы знаете, ядро ​​CMSIS и большая часть спецификаций поставщика c состоят только из заголовочных файлов. Затем необходимо включить правильные каталоги в путь включения компилятора, как правило, с использованием -I... параметров командной строки.

Один тип программного пакета производителя называется Device Family Pack. В дополнение к спецификациям периферийных устройств c, указанным поставщиком, они обычно содержат стартовый код и часто сценарии компоновщика, соответствующие макету памяти SO C. Их стоит найти, и они сохранят работу по разметке векторных таблиц и другие подобные низкоуровневые коды.

Для бонуса: Кейл является производителем программных инструментов и принадлежит ARM. Более приятные функции пакетов программного обеспечения CMSIS, такие как распространение и обновление их по сети, поддерживаются Keil IDE, а Keil поддерживает хранилище общих пакетов SO C. Я также обычно использую компилятор GNU, но использовал Keil и его встроенную поддержку CMSIS и доступность пакета программного обеспечения для хорошего эффекта. Я даже создал несколько пакетов программ для индивидуальной работы. Я предлагаю продолжить чтение документации CMSIS , уделив некоторое внимание разделу packs . Вам не нужно иметь IDE, которая управляет пакетами для вас. Поскольку это просто zip-файлы, вы выполняете эту задачу самостоятельно.

...