Делаю я тут проект один и начал вникать в цифровую обработку сигналов на 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 или операции над данными, которые будут использоваться в проекте):
Далее переходим к разделу С INCLUDES и прописываем путь к файлу arm_math.h:
Переходим к разделу CFLAGS и в C DEFENITIONS добавляем объявление -DARM_MATH_CM4 , которое означает, что мы будем использовать DSP для Cortex-M4, заодно перепроверяем объявления FPU для нашего MCU (что он реально имеет hardware-поддержку FPU):
Вроде бы всё! Пробуем компилировать…
Вот тут-то нас и встречают ошибки вида:
#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 уже есть необходимые объявления:
И если сделать так, как советуется по последней ссылке, то компилятор будет ругаться на переопределения этих объявлений, что закономерно.
Получается, что все необходимые объявления есть, но CMSIS-DSP их не видит. Странно. Перепроверяя всё в очередной раз, зацепился за эти строки в файле arm_math.h:
Хммм… Идём в официальный репозиторий CMSIS V5, качаем свежайший CMSIS. Смотрим там этот же файл:
Уже лучше. Попробуем обновить 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\*. Должно получиться примерно следующее:
Пробуем компилировать — всё успешно без единого варнинга. Переименованные папки со старым CMSIS можно удалить.
Такие дела, в общем…
Ссылки
- CMSIS V5 — официальный репозиторий;
- CMSIS DSP Software Library — документация;
- STM32CubeMX — тот самый, в котором HAL, кого все ругают и юзают втихаря.