0

在尝试构建我的项目时,我收到如下错误:

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)
      |                                         ^~~~~~~~~

或者

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)
4

3 回答 3

2

为确保包含特定微控制器的头文件,您需要定义相关宏。在您的情况下,您需要确保将-DSTM32F407xx其传递给您的编译器。你如何做到这一点取决于你的构建环境。

完成此操作后,相关的头文件将通过stm32f4xx.h.

如果您想知道如何确保stm32f4xx.h包含 , 以及是否需要明确包含在您自己的源文件中...

通常,您不需要显式包含stm32f4xx.h. 只要您包含标准外设之一的头文件(例如 RCC 或 GPIO),它就会自动包含在内。

所以包含链可能如下所示:

  • stm32f4xx_rcc.h<- 包含在您的源文件中
    • stm32f4xx.h
      • stm32f407xx.h

后两者是自动的 - 只要-DSTM32F407xx在您的预处理器标志中传递。

于 2019-06-07T07:26:35.640 回答
1

core_cm4.h不应该直接包含在内。

取而代之#define的是 MCU线和MCU系列#include的标头。

#define STM32F407xx
#include "stm32f4xx.h"

这将包括stm32f407xx.hwhich 又包括core_cm4.h.

包括stm32f407xx.h直接,没有#define可能的工作。

于 2019-06-07T07:38:16.547 回答
0

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 
}

如果它不存在您的头文件,这意味着文件已损坏或有人进行了更改,那就是该文件。用新文件替换您的文件可能会解决您的问题。

于 2019-06-07T12:43:25.317 回答