Неизвестные типы данных IRQn_Type, - PullRequest
0 голосов
/ 07 июня 2019

При попытке построить мой проект я получаю сообщения об ошибках типа:

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 / Включить


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

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

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

Мой шаблонный файл сборки был сгенерирован 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)

Ответы [ 3 ]

1 голос
/ 07 июня 2019

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

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

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

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

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

  • stm32f4xx_rcc.h
    • stm32f4xx.h
      • stm32f407xx.h

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

0 голосов
/ 07 июня 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 
}

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

0 голосов
/ 07 июня 2019

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

Вместо этого вы #define MCU line и #include заголовок для MCU series .

#define STM32F407xx
#include "stm32f4xx.h"

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

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

...