在 C++ 中使用 HAL 的 STM32 的第一个项目
Posted
技术标签:
【中文标题】在 C++ 中使用 HAL 的 STM32 的第一个项目【英文标题】:First project for STM32 with HAL in C++ 【发布时间】:2016-05-19 05:55:29 【问题描述】:我想用 C++ 中的 HAL 为 STM32 创建一个项目。 不幸的是,CubeMX 只支持 C 语言的项目。但是,HAL 支持 C++。
我在 CubeMX 中创建了一个项目,我试图将其导入上述任何 IDE,但没有成功,因为它是作为 C 项目导入的。所以这看起来不是一个好的解决方案。
另外,我尝试在上述 IDE 中创建一个 C++ 项目,并将 CubeMX 中的文件添加到其中。这似乎更符合逻辑,但我无法以正确的方式进行操作,因为我的配置仍然错误。
谁能解释我应该如何在 Eclipse 或 Atollic TrueSTUDIO 中配置新的 C++ 项目以使用 HAL?
【问题讨论】:
问题太笼统,插入一些细节。你试过什么? 谷歌帮我找到了一个使用eclipse的stm32相关页面。carminenoviello.com/en/2015/06/04/… to tutorial 不要使用 STlib ("HAL")。它只是膨胀,但没有提供真正的硬件抽象。它只会增加另一层复杂性。您仍然必须了解硬件并拥有参考人员,但使用 HAL,您也必须了解这一点,并且还要知道如何将其转化为硬件。而是使用您自己的接口将硬件访问封装在驱动程序中。 别真的听奥拉夫的。 HAL 很好很干净。即使您在开发某些东西时总是必须持有 ref-man 。如果您阅读其他人的代码,HAL 可以节省大量时间。即使那个人是你自己,但不久前) 【参考方案1】:取决于它是哪个STM32芯片,它可能被mBed支持。在线 mBed 编译器允许导出到各种 IDE。新的离线版本(yotta)使用 cmake,它也可以导出到一些 IDE。不幸的是,yotta 目前只支持几个芯片。
【讨论】:
【参考方案2】:CubeMX 的最新版本支持 System Workbench 4 STM32,这是一个基于 Eclipse 的 IDE,预先配置为针对 STM32 目标进行开发。它具有将项目转换为 C++ 的选项(右键单击项目资源管理器中的项目,然后选择“转换为 C++”)。
请注意,我没有使用此方法的直接经验。我们使用 STM HAL 并在此基础上构建我们的 C++ 应用程序,所以这绝对是可能的,但我们的 IDE 是 Keil,所以 YMMV。
【讨论】:
【参考方案3】:如何将 STM32CubeMX 生成的 Atollic Eclipse C 项目转换为 C++(3 个步骤):
将 main.c 复制到 main.cpp 并从构建中“排除”main.c。结果:还没有完全奏效。尽管 main.cpp 可能出现在 Eclipse 项目文件列表中,但它甚至没有开始编译(不会捕获明显的语法错误),并且缺少 main() 存在链接器错误。 接下来,使用文本编辑器将 org.eclipse.cdt.core.ccnature 添加到 .project 文件中,如下所示...
<natures>
<nature>org.eclipse.cdt.core.cnature</nature>
<nature>org.eclipse.cdt.core.ccnature</nature>
见http://www.openstm32.org/forumthread1244。这可以在 Eclipse 在项目打开的情况下运行时完成。结果:main.cpp 编译但由于包含路径错误而找不到包含文件。您会认为 cppnature 会是一个更好的名称。
编辑:在 Eclipse 帮助中搜索“C++ 性质”以获取有关如何使用菜单 File / New / Other / Convert to C/C++ Make Project 添加 C++ 性质的提示。
接下来,修改项目设置以将相关的 C 设置复制到 C++ 设置 - 如此处所示。 需要关闭并重新打开项目才能使此更改生效。结果:正确构建、链接、运行和运行。 main.cpp 可以调用 HAL c 代码,HAL 回调可以调用 .cpp 文件中的函数。如果1 .cpp 端正在调用 .c 端的函数,则 .cpp 文件中可能需要 extern "C" 修饰符(通过预先挂起 defined extern "C"
2 .c 端调用来修改函数原型在 .cpp 中定义的回调(通过预先挂起 defined extern "C"
来修改 .cpp 端的函数定义。
一些注意事项:
如果我曾经使用 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)。我没有在 Atollic Eclipse 中看到转换为 C++ 的项目选项,尽管我在其他 Eclipse 环境(例如 Xilinx Eclipse)中看到了该选项。改进空间:可能有一个 CubeMX 模板可以编辑以使这些更改更加自动化,但我对 CubeMX 模板的了解还不够,无法让这个 hack 更优雅。
我也将 CubeMX 与 IAR EWARM 一起使用,并通过类似(但稍微容易一些)的过程来转换为 .cpp 项目。
【讨论】:
【参考方案4】:在stm32cubeide
有一个非常简单的构建cpp项目的方法
-
创建新的 stm32 项目后检查 c++ 框
进行初始化
编译主文件夹中的代码
按右键选择源文件夹
把你的cpp文件放进去
用于在 cpp 文件中的
main.c
中调用此 cpp 函数,创建一个类似 main2()
的简单函数
你从main.c
调用它现在你可以通过main2()
函数使用cpp函数
【讨论】:
以上是关于在 C++ 中使用 HAL 的 STM32 的第一个项目的主要内容,如果未能解决你的问题,请参考以下文章
书籍连载《STM32 HAL 库开发实战指南—基于F7》-第一章