使用C++和HAL进行STM32的第一个项目

12

我想使用C++和HAL创建STM32项目,但很遗憾,CubeMX只支持C语言项目,不过HAL支持C++。

我已经在CubeMX中创建了一个项目并尝试将其导入到任何一个上述的IDE中,但都无法成功,因为它被导入为C语言项目,所以这似乎不是一个好的解决方案。

另外,我也尝试在所述的IDE中创建C++项目,并从CubeMX中添加文件。这似乎更合理,但由于我的配置仍然错误,我不能正确地完成它。

有没有人能够解释一下我应该如何配置新的C++项目才能使用HAL,在Eclipse或Atollic TrueSTUDIO中?


1
问题过于泛泛,可以提供更多细节吗?您已经尝试了什么? - Piero Alberto
谷歌帮我找到了一个使用Eclipse的STM32相关页面,这里是<a href="http://www.carminenoviello.com/en/2015/06/04/stm32-applications-eclipse-gcc-stcube/">教程链接</a>。 - Gull_Code
1
不要使用STlib(“HAL”)。它只是臃肿,但并没有真正提供与硬件的抽象。它只是增加了另一层复杂性。您仍然需要了解硬件并手头有参考手册,但使用HAL时您还必须学习如何将其转换为硬件。相反,应该在驱动程序中封装硬件访问,并使用自己的接口。 - too honest for this site
1
不要太听 Olaf 的话。HAL 很好,很干净。即使在开发某些内容时你总是需要拿着参考手册。如果你要阅读别人的代码(即使是之前写的自己),HAL 能够节省你很多时间。 - MajesticRa
4个回答

9

最近的CubeMX版本支持针对STM32目标开发的预配置Eclipse IDE System Workbench 4 STM32。它具备将项目转换为C++的选项(在项目资源管理器中右键单击项目,然后选择“转换为C++”)。

请注意,我没有直接使用过此方法。我们使用STM HAL并在其之上构建我们的C++应用程序,因此这是可行的,但我们的IDE是Keil,所以结果可能会有所不同。


7
如何将STM32CubeMX生成的Atollic Eclipse C项目转换为C++(3个步骤):
将main.c复制到main.cpp并从构建中“排除”main.c。结果:还不太行。虽然main.cpp可能出现在Eclipse项目文件列表中,但它甚至无法开始编译(无法捕获明显的语法错误),而且缺少main()的链接器错误。
接下来,在.project文件中使用文本编辑器添加org.eclipse.cdt.core.ccnature,如下所示... ``` org.eclipse.cdt.core.cnature org.eclipse.cdt.core.ccnature ``` 参见http://www.openstm32.org/forumthread1244。这可以在打开项目的情况下在Eclipse运行时完成。结果:main.cpp可以编译,但找不到包含文件,因为包含路径是错误的。你会认为cppnature会是一个更好的名称。 编辑:搜索Eclipse帮助以获取有关如何使用菜单File / New / Other / Convert to C/C++ Make Project添加C++ nature的提示。
接下来,修改项目设置以将相关的C设置复制到C++设置中-如图所示。enter image description here该项目需要关闭并重新打开才能使此更改生效。结果:构建、链接、运行和正确运行。main.cpp可以调用HAL c代码,并且HAL回调可以调用.cpp文件中的函数。如果1.cpp侧正在调用.c侧的函数(通过在函数原型前添加defined extern "C"2),则可能需要在.cpp文件中使用extern "C"修饰符。.c侧正在调用在.cpp中定义的回调(通过在.cpp侧的函数定义前添加defined extern "C"来修改函数定义)。
一些注释:
  • 如果我使用CubeMX重新生成代码(例如更改时钟或引脚配置),main.c将会被更新,但main.cpp不会被更新,因此需要将.c文件的更改/差异合并到.cpp文件中。
  • 如何确保C和C++设置是等效的:构建后,在控制台窗口查看gcc和g++的命令行调用,并确保相关参数(路径,-D等)完全相同。
  • 可以(但风险很大)编辑Eclipse .cproject XML文件,并将C设置复制到C ++端(具体细节在此省略 - 但在编辑.cproject文件之前,请关闭Eclipse中的项目)。
  • 关于对CubeMX / HAL“膨胀”的反对意见:CubeMX非常快地生成代码和项目。如果HAL API很慢 - 例如GPIO端口引脚访问 - 然后只需用包含该膨胀API简单子集的新用户函数替换API调用。我经常在时间关键的代码中这样做。
  • 我正在使用CubeMX(4.14.0)和Atollic(v6.0.0 Lite)。虽然我在其他Eclipse环境中看到了转换为C ++的项目选项,例如Xilinx Eclipse,但我没有在Atollic Eclipse中看到该选项。

改进空间:可能有一个可以编辑的CubeMX模板,使这些更改自动化,但我对CubeMX模板了解不够,不能使这种黑客更加优美。

我也使用CubeMX和IAR EWARM,并且经过类似(但稍微简单一些)的过程将其转换为.cpp项目。


1

stm32cubeide中构建cpp项目有一个非常简单的方法:

  1. 创建新的stm32项目后,勾选c++框
  2. 进行初始化
  3. 在主文件夹中编译代码
  4. 右键点击并选择源文件夹
  5. 将您的cpp文件放入其中
  6. 为了在main.c中调用此cpp函数,在cpp文件中创建一个简单的函数,如main2()
  7. 现在您可以通过main2()函数使用cpp函数

-1

根据所使用的STM32芯片型号,它可能会被mBed支持。在线的mBed编译器允许导出到各种IDE。新的离线编译器(yotta)使用cmake,也可以导出到一些IDE。不幸的是,目前yotta仅支持少数芯片。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接