首页 > 解决方案 > 在 STM32CubeIDE 项目中添加新的 .h 和 .cpp 文件的位置

问题描述

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

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

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

标签: stm32cubeide

解决方案


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

基本上你可以将源文件放在任何源文件夹中。您可以随意使用现有文件夹或创建新文件夹。

头文件必须放在包含路径(例如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)。

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


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

对于更大的项目,我个人喜欢将所有自动生成的代码与我自己的文件分开。特别是对于 C++ 项目,每次运行代码生成时,STM32CubeIDE 总是重命名和删除您不小心放在注释块之外的代码段main.cpp,这会变得非常烦人。main.c

我通常Project为项目特定文件创建一个源文件Lib夹,为库创建一个源文件夹。然后我创建一个cppmain.h文件,它简单地声明一个void cppMain()函数和一个cppmain.cpp用于编写我的主程序的文件。对自动生成代码的唯一更改是您必须在主循环之前包含cppmain.h并调用.cppMain()main.c

目录树:

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


推荐阅读