在STM32CubeIDE项目中的哪里添加新的.h和.cpp文件

Where to add new .h and .cpp file in STM32CubeIDE project

我使用 STM32CubeIDE 通过文件 > 新建 > STM32 项目为我的 nucleo-f411re 开发板创建了一个新的 (C++) 项目。项目像往常一样创建。我将“main.c”重命名为“main.cpp”,因为我选择了 C++ 作为目标语言。一个简单的“blinky”编译并在板上正确运行。所以现在我想开始向项目中添加一些 C++ 代码。

“main.cpp”在 myproject > Core > Src > main.cpp 下的项目树中。如果我想创建一些新的 source/header 文件,比如“foo.h”和“foo.cpp”,我想我可以右键单击项目树中的某些内容,然后新建 > 头文件或新建 > 源文件。 但问题是——我应该右键单击什么来创建 source/header 文件? 我假设文件将在我右击的位置(= 文件夹)中创建点击。 我想把它们放在哪里?它们都在“核心”文件夹中吗?分别在“Core > Inc”和“Core > Src”文件夹中?我不确定。

编辑: 我将 header/source 文件分别添加到 Core > Inc 和 Core > Src,这似乎有效。这是推荐的吗?我想知道如果我更改配置它们是否仍然存在,导致重新生成代码。

我知道这是一个很晚的答案,但我不久前没有找到很多关于这个问题的提示,所以这是我的看法。

基本上您可以将源文件放在任何源文件夹中。 您可以根据需要使用现有文件夹或创建新文件夹。

头文件必须放在包含路径中的文件夹中(例如 Core/Inc),或者您必须告诉编译器应包含特定文件。 如果你想为你的头文件创建一个新文件夹,你必须通过 Project -> Properties -> C/C++ Build -> Tool Setting (tab) -> MCU GCC Compiler or MCU G++ Compiler -> Include paths 将文件夹或该文件夹内的文件添加到包含路径。 请注意,您可能需要添加两次,一次用于 C 文件 (MCU GCC Compiler),一次用于 C++ 文件 (MCU G++ Compiler)。

要创建文件,您只需单击要在其中创建文件的文件夹,然后添加一个新的 文件。 您也可以只在本地文件系统上创建文件和目录并刷新项目(右键单击 -> 刷新或 F5)以显示 STM32CubeIDE 中的更改。


对于小型项目(如 blinky 项目),使用 Core 文件夹可能就足够了。

对于更大的项目,我个人喜欢将所有自动生成的代码从我自己的文件中分离出来。 特别是对于 C++ 项目,STM32CubeIDE 总是将 main.cpp 重命名为 main.c 并在每次 运行 代码生成时删除您不小心放在注释块之外的代码段。

我通常为项目特定文件创建一个 Project 源文件夹,为库创建一个 Lib 源文件夹。 然后我创建一个 cppmain.h 文件,它只声明一个 void cppMain() 函数和一个 cppmain.cpp 文件,我用来编写我的主程序。 自动生成代码的唯一变化是您必须在 main.c.

的主循环之前包含 cppmain.h 并调用 cppMain()

目录树:

Project name
+ Core
| + ...
+ Drivers
| + ...
+ Libs
| + someLib
| | + Inc
| | | + someLib.h or hpp
| | + Src
| |   + someLib.c or cpp
| + ...
+ Program
| + Inc
| | + cppmain.h
| | + ...
| + Src
|   + cppmain.cpp
|   + ...
+ ...

您必须将 Program/Inc 和任何 Lib/Inc 文件夹添加到包含路径。 main.c 的更改如下所示:

...

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "cppmain.h"  // this goes in user includes
/* USER CODE END Includes */

...

  /* USER CODE BEGIN 2 */
  cppMain();  // this goes before the main loop
  // anything after this point will never be reaced
  // when you create a main loop inside cppMain()
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

...

cppmain.h 文件中,我通常 #include "main.h" 获取所有 STM32 HAL 内容并将所有硬件资源句柄声明为外部(例如 extern UART_HandleTypeDef huart1;

完整的 cppmain.h 文件:

/** @file cppmain.h
 *
 * @author some_author
 * @date some_date
 */

#ifndef PROGRAM_INC_CPPMAIN_H_
#define PROGRAM_INC_CPPMAIN_H_

#ifdef __cplusplus
 extern "C" {
#endif

#include "main.h"

void cppMain(void);

#ifdef __cplusplus
}
#endif

#endif /* PROGRAM_INC_CPPMAIN_H_ */

一些随机 cppmain.cpp 文件:

/** @file cppmain.cpp
 *
 * @author some_author
 * @date some_date
 */

#include "cppmain.h"
#include "pins.h"
// pins is useful when you connect some things to a dev board
// and want to have a quick reference where you put stuff
// this just includes things like (for STM32F103xB "blue pill" in this case)
// #define LED_PIN_PORT GPIOC
// #define LED_PIN_PIN GPIO_PIN_13
// #define LED_PIN LED_PIN_PORT, LED_PIN_PIN


extern UART_HandleTypeDef huart1;

int some_variable = 0;


void foo(int input){
  // do something
}


void cppMain(){
  // do stuff

  // main loop
  while(1){
    // do stuff regularly
  }
}

在我的 Lib 文件夹中,我通常 link 到我想在处理所有项目时更改的库:right click on Libs -> New -> Folder -> Advanced >> -> Link to alternate location。 请注意,这将 link 指向您系统上的绝对路径,您不能通过这种方式简单地将您的项目导入到不同的系统上。 如果您在团队中工作或跨不同的设备工作,您可能希望以不同的方式解决这个问题。