在 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》-第一章

I2C 通信中的问题 - STM32(HAL 库)

STM32F1HAL库的I2C应用注意事项

STM32 和 HAL 函数 GetTick()

stm32l476 HAl GPIO Init将程序计数器发送到位置0000 0000

使用stm32cubemx的hal库来建立串口收发,发生了诡异的数据传输错误