Неизвестные типы данных IRQn_Type,

При попытке построить свой проект я получаю такие ошибки, как:

Drivers/CMSIS/Include/core_cm4.h:1816:41: error: unknown type name 'IRQn_Type'; did you mean 'ITM_Type'?
 1816 | __STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
      |                                         ^~~~~~~~~

or

Drivers/CMSIS/Include/core_cm4.h: In function 'NVIC_EncodePriority':
Drivers/CMSIS/Include/core_cm4.h:1869:64: error: '__NVIC_PRIO_BITS' undeclared (first use in this function)
 1869 |   PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp);

Так что похоже, что IRQn_Type и __NVIC_PRIO_BITS не определены.

Насколько я понимаю, типы данных определены в файле stm32f407xx.h и я говорю make уже где его найти: -IDrivers/CMSIS/Device/ST/STM32F4xx/Include


Редактировать

Я только что увидел первые ошибки:

In file included from Drivers/CMSIS/DSP/Include/arm_math.h:322,
                 from Src/dsp/dsp.c:1:
Drivers/CMSIS/Include/core_cm4.h:105:8: error: #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
  105 |       #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
      |        ^~~~~

In file included from Src/dsp/dsp.c:3:
Drivers/CMSIS/Include/core_cm4.h:1688:39: error: unknown type name 'IRQn_Type'; did you mean 'ITM_Type'?
 1688 | __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)
      |                                       ^~~~~~~~~
      |                                       ITM_Type

Makefile моего шаблона был сгенерирован CubeMX, но я внес некоторые изменения (изменил структуру моих папок, добавил определяемые и включаемые каталоги).

# C defines
C_DEFS =  \
-DUSE_HAL_DRIVER \
-DSTM32F407xx \
-DARM_MATH_CM4 

# C includes
C_INCLUDES =  \
-IConfigs \
-ISrc \
-IDrivers/STM32F4xx_HAL_Driver/Inc \
-IDrivers/STM32F4xx_HAL_Driver/Inc/Legacy \
-IDrivers/CMSIS/Device/ST/STM32F4xx/Include \
-IDrivers/CMSIS/Include \
-IDrivers/CMSIS/DSP/Include


Я получаю только эту ошибку:

In file included from Drivers/CMSIS/DSP/Include/arm_math.h:322,
                 from Src/dsp/filter.h:9,
                 from Src/dsp/filter.c:1:
Drivers/CMSIS/Include/core_cm4.h:105:8: error: #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
  105 |       #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
      |        ^~~~~
make: *** [Makefile:228: build/filter.o] Error 1

если я поставлю эти строки над моим #include <arm_math.h>.

#define STM32F407xx
#include "stm32f4xx.h"

После добавления также -D__FPU_PRESENT к определениям я все еще получаю сообщение об ошибке:

In file included from Src/dsp/dsp.c:4:
Drivers/CMSIS/Include/core_cm4.h:1688:39: error: unknown type name 'IRQn_Type'; did you mean 'ITM_Type'?
 1688 | __STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn)

person Drimer    schedule 07.06.2019    source источник


Ответы (3)


Чтобы убедиться, что заголовочный файл для вашего конкретного микроконтроллера включен, вам необходимо определить соответствующий макрос. В вашем случае вам необходимо убедиться, что -DSTM32F407xx передается вашему компилятору. Как именно вы это сделаете, будет зависеть от вашей среды сборки.

После этого соответствующий заголовочный файл будет иметь вид автоматически включается через stm32f4xx.h.

Если вам интересно, как убедиться, что stm32f4xx.h, в свою очередь, включен, и нужно ли его явно включать в ваши собственные исходные файлы...

Как правило, вам не нужно явно включать stm32f4xx.h. Пока вы включаете заголовочный файл для одного из стандартных периферийных устройств, таких как RCC или GPIO, он будет автоматически включен.

Таким образом, цепочка включения может выглядеть примерно так:

  • stm32f4xx_rcc.h <- include in your source files
    • stm32f4xx.h
      • stm32f407xx.h

Последние два являются автоматическими - до тех пор, пока -DSTM32F407xx передается в ваших флагах препроцессора.

person David Collins    schedule 07.06.2019
comment
Извините, стоило упомянуть. Установлен флаг -DSTM32F407xx. (иначе я бы также получил ошибку: сначала выберите целевое устройство STM32F4xx, используемое в вашем приложении (в файле stm32f4xx.h)). Любые другие идеи? - person Drimer; 07.06.2019
comment
@Drimer: Можете ли вы опубликовать соответствующие части вашего Makefile? - person David Collins; 07.06.2019
comment
Я изменил свои вопросы и был бы признателен за вашу помощь. - person Drimer; 07.06.2019

core_cm4.h не должен быть включен напрямую.

Вместо этого вы #define используете строку MCU и #include заголовок для серии MCU.

#define STM32F407xx
#include "stm32f4xx.h"

Это будет включать stm32f407xx.h, который, в свою очередь, включает core_cm4.h.

Включение stm32f407xx.h напрямую, без #define тоже может работать.

person followed Monica to Codidact    schedule 07.06.2019
comment
Привет. Спасибо за ваш ответ. Я добавил эти строки, но у меня все еще есть проблемы. Я изменил свой вопрос. Можешь еще раз заглянуть? - person Drimer; 07.06.2019

IRQn_Type в основном представляет собой перечисление, которое содержит значение всех типов прерываний, которые есть у контроллера. Например

enum    IRQn_Type { 
  NonMaskableInt_IRQn = -14, 
  HardFault_IRQn = -13, 
  MemoryManagement_IRQn = -12, 
  BusFault_IRQn = -11, 
  UsageFault_IRQn = -10, 
  SecureFault_IRQn = -9, 
  SVCall_IRQn = -5, 
  DebugMonitor_IRQn = -4, 
  PendSV_IRQn = -2, 
  SysTick_IRQn = -1, 
  WWDG_STM_IRQn = 0, 
  PVD_STM_IRQn = 1 
}

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

person Vaibhav    schedule 07.06.2019