STM32CubeMX и CMSIS-DSP — проблема с FPU

B92-0

Делаю я тут проект один и начал вникать в цифровую обработку сигналов на STM32. Скелет проекта и инициализацию периферии я сделал в STM32CubeMX, набросал код для проверки FIR из CMSIS DSP, пробую скомпилировать и … компилятор ругается, мол? у меня нет FPU на STM32F401CCU6.

#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

В чём же проблема ? Давайте разбираться по порядку.

Итак, вполне стандартный путь. Чтобы начать использовать DSP библиотеку в своём проекте, необходимо сделать следующее:

Заходим в Makefile (проект для Visual Studio Code + GCC), переходим к разделу SOURCES, где добавляются си-файлы к компиляции, и добавляем необходимые нам исходники с соответствующими функциями (т. е. FIR, PID или операции над данными, которые будут использоваться в проекте):

B92-1

Далее переходим к разделу С INCLUDES и прописываем путь к файлу arm_math.h:

B92-2

Переходим к разделу CFLAGS и в C DEFENITIONS добавляем объявление -DARM_MATH_CM4 , которое означает, что мы будем использовать DSP для Cortex-M4, заодно перепроверяем объявления FPU для нашего MCU (что он реально имеет hardware-поддержку FPU):

B92-3

Вроде бы всё! Пробуем компилировать…

Вот тут-то нас и встречают ошибки вида:

#error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"

Погуглив, можно найти топики со схожей проблемой:

DSP functions on System Workbench and CubeMX, или Using DSP libraries (e.g. arm_math.h) in STM32CubeIDE, STM32F4, или Использование функций CMSIS-DSP в STM32f4, решение по последней ссылке кажется достаточно логичным (объявить вручную __FPU_PRESENT = 1, __FPU_USED = 1), если бы не одно но: в файле Drivers\CMSIS\Device\ST\STM32F4xx\Include\stm32f410cx.h уже есть необходимые объявления:

B92-4

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

Получается, что все необходимые объявления есть, но CMSIS-DSP их не видит. Странно. Перепроверяя всё в очередной раз, зацепился за эти строки в файле arm_math.h:

B92-5

Хммм… Идём в официальный репозиторий CMSIS V5, качаем свежайший CMSIS. Смотрим там этот же файл:

B92-6

Уже лучше. Попробуем обновить CMSIS в проекте. Для этого нужно сделать следующее:

Заходим в папку Drivers\CMSIS и переименовываем (я просто добавил «1» в конце для наглядности) Core, Core_A, Lib, NN, RTOS, RTOS2 (последние три не обязательно, но за компанию можно и обновить), далее открываем скачанный репозиторий и копируем из CMSIS\* аналогичные по имени папки на соответствующие места (папку Lib необходимо взять из CMSIS\DSP\*, зачем её переместили в STM, мне не очень понятно, возможно, это просто изменения в новой версии).

Теперь в папке DSP переименовываем DSP_Lib_TestSuite, Examples, Include, Source и копируем аналогичные из репозитория CMSIS\DSP\*. Должно получиться примерно следующее:

B92-7

B92-8

Пробуем компилировать — всё успешно без единого варнинга. Переименованные папки со старым CMSIS можно удалить.

Такие дела, в общем…

Ссылки

  • CMSIS V5 — официальный репозиторий;
  • CMSIS DSP Software Library — документация;
  • STM32CubeMX — тот самый, в котором HAL, кого все ругают и юзают втихаря.

Добавить комментарий

Please log in using one of these methods to post your comment:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход /  Изменить )

Google photo

Для комментария используется ваша учётная запись Google. Выход /  Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход /  Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход /  Изменить )

Connecting to %s