STM32 进阶教程 7 -  C与C++混合编程

2023-11-17

前言

在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的DEMO程序或驱动程序有时候是C++,如果先前的系统用C语言写的就会出现点问题,往往需先将C++的驱动程序自已手动改成C语言再用,本节给大家介给一下如何在KEL MDK环境中实现C与C++混合编程。本节将在《STM32 进阶教程 4 -  软件实现高精度延时 2》基础上将Delay.c变成C++实现的Delay.cpp编代码实现,实现一样的延时效果。

 

示例详解

基于硬件平台: STM32F10C8T6最小系统板, MCU 的型号是 STM32F103c8t6, 使用stm32cubemx 工具自动产生的配置工程,使用KEIL5编译代码。

 

 

本示例所用的最小系统板原理图:

 

    1. 关于CUBEMX工具及KEIL工具的操作将不再细讲,如果还有不熟悉的可以查看之前的教程文档。下面直接介绍工程配置:
      1. 系统时钟树

      1. 定时器配置

      1. 引脚配置

      1. 中断配置(保持默认)

 

 

    1. 工程代码
      1. 将事先准备好的delay.cpp和delay.h文件加到工程中,并将main.c重命名为main.cpp并重新加入到工程中:

Delay.h文件放在INC文件夹下即可。

 

      1. St的Hal库对C++支持比较好,需要调整的比较少,但是在实际应用中Keil MDK STM32 C与C++混合编程的几个要点还是值得关注一下:

1. 带有C++语法(如使用了类特性)的源文件其文件名必须是.CPP后辍,如本例中的Delay.cpp文件。

2. 需要调用由C++封装的接口的源程序其文件名也应是.CPP后辍,如本例中的main.cpp因其要包涵delay.h头文件,且delay.h中又包函数了C++语法/关键字。

3.如果要使用C++,工程就不能再使用MicroLIB库了,因为MicroLIB不支持C++:

4.如果工程中以.CPP为后辍的源文件中有全局函数或变量(不在类中的),可以在其头文件中以如下方式导出函数接口供其它模块/文件调用:

5.网上有些朋友说要把工程的 –C99特性去掉,在高版本的KEIL中C99特性其实是可以不去的!下面是笔者亲自试过的三种可以实现C与C++混合编程的工程相关配置(如果C99与GUN两个都不选会有问题!!):

 

      1. 在main.cpp 中加入如下图所示代码

 

    1. 编译工程,下载程序看效果,首先仿真运行代码,可以发现变量C = 11+15 =26 结果正确:

让程序全速运行,查看PC13引脚上的波形:

与《STM32 进阶教程 4 -  软件实现高精度延时 2》节的C语实现的延时开销会大一点点:

 

通过上面的实例,我们已基本学会基于keil MDK平台的stm32 中C与 C++混合编程的实现过程,是不是很简单,学完本节内容后再遇到C++编写的芯片驱动或DEMO就可以可以很快移植 到我们的工程中了呢。

OK,本期实验完成!下期见!同时如果大家有什么疑问或是有想了解的其它内容,也欢迎大家留言!!最后喜欢这个公众号的同学们记得加关注了,会有不定期技术干货推出!!

文中源码资料下载,在公众号里给十三发消息:

下载|STM32进阶教程 7

 

关注十三公众号

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 进阶教程 7 -  C与C++混合编程 的相关文章

  • stm32的HAL库函数flash无法写入的问题

    记录一下对flash编程操作时出现的问题以及解决办法 问题 在使用HAL库中的HAL FLASH Program uint32 t TypeProgram uint32 t Address uint64 t Data 函数时发现总是没办法写
  • 如何在 Cortex-M3 (STM32) 上从 RAM 执行函数?

    我正在尝试从 Cortex M3 处理器 STM32 上的 RAM 执行函数 该函数会擦除并重写内部闪存 所以我肯定需要在 RAM 中 但我该怎么做呢 我尝试过的是 使用 memcpy 将函数复制到 RAM 中的字节数组 检查它是否正确对齐
  • 初始化 ST-Link 设备时出错 - 无法连接到设备

    我目前正在使用 ST Link 调试器对我的 STM32F3 Discovery 板进行编程 我使用的IDE是Atollic TrueStudio 5 5 2 现在我面临一个非常奇怪的问题 那就是我不断收到消息 初始化 ST Link 设备
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 133-基于stm32单片机停车场车位管理系统Proteus仿真+源程序

    资料编号 133 一 功能介绍 1 采用stm32单片机 4位数码管 独立按键 制作一个基于stm32单片机停车场车位管理系统Proteus仿真 2 通过按键进行模拟车辆进出 并且通过程序计算出当前的剩余车位数量 3 将剩余的车位数量显示到
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • STM32超声波——HC_SR04

    文章目录 一 超声波图片 二 时序图 三 超声波流程 四 单位换算 五 取余计算 六 换算距离 七 超声波代码 一 超声波图片 测量距离 2cm 400cm 二 时序图 1 以下时序图要先提供一个至少10us的脉冲触发信号 告诉单片机我准备
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • VS Code 有没有办法导入 Makefile 项目?

    正如标题所说 我可以从现有的 Makefile 自动填充 c cpp properties json 吗 Edit 对于其他尝试导入 makefile 的人 我找到了一组脚本 它们完全可以实现我想要实现的目标 即通过 VS Code 管理
  • 最终启动顺序错误 - STM32L476 的 Eclipse System Workbench 调试

    我正在尝试调试和运行 STM32L476 的简单汇编代码 我已经设置了 Eclipse Oxygen 在 Eclipse 中安装了最新版本的 System Workbench 插件并安装了 ST Link 驱动程序 IDE 成功构建了程序
  • 擦除后无法写入闪存

    所以我不能在擦除后直接写入内部闪存 如果写操作之前没有擦除操作 那么我可以 有什么想法吗 编程函数返回 成功写入 值 但查看内存时 没有写入任何数据 这是代码 uint32 t pageAddress 0x08008000 uint16 t
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • Cortex-M3与M4权威指南

    处理器类型 所有的ARM Cortex M 处理器是32位的精简指令集处理器 它们有 32位寄存器 32位内部数据路径 32位总线接口 除了32位数据 Cortex M处理器也可以有效地处理器8位和16位数据以及支持许多涉及64位数据的操作
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • STM32 Nucleo 上的上升沿中断多次触发

    我正在使用 STM32 NUCLEO F401RE 微控制器板 我有一个扬声器 经过编程 当向上 向下推操纵杆时 可以按设定的量改变频率 我的问题是 有时 通常 当向上 向下推动操纵杆时 频率会增加 减少多次 这意味着 ISR 正在执行多次
  • STM32 上的位置无关代码 - 指针

    我已成功在 STM32 上构建并运行位置无关的代码 向量表和 GOT 已修补 一切正常 但我对这样的代码有问题 double myAdd double x return x 0 1 double ptrmyAdd double myAdd
  • STM32F0、ST-link v2、OpenOCD 0.9.0:打开失败

    我在用着发射台 http www ti com ww en launchpad about htmlgcc arm none eabi 4 9 2015q2 为 STM32F0 进行编译 现在我想使用该集合中的 arm none eabi
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • 开关电源环路稳定性分析(2)-从开环到闭环

    大家好 这里是大话硬件 在上一节中 基于欧姆定律 基尔霍夫定律 伏秒平衡这些已知的知识点 可以推导出Buck变换器的输入输出关系 今天这一节 我们还是从全局的概念来解析开关电源 1 运放和开关电源 如果一上来就分析开关电源的环路稳定性 我估
  • Spring Boot中集成Redis

    14 1 简介 redis是一款高性能的NOSQL系列的非关系型数据库 14 1 1 非关系型数据库的优势 1 性能NOSQL是基于键值对的 可以想象成表中的主键和值的对应关系 而且不需要经过SQL层的解析 所以性能非常高 2 可扩展性同样
  • 华为三层交换机STP配置

    学习目的 掌握启用和关闭STP的方法 了解不同的STP模式的差异 掌握修改网桥优先级影响根网桥选举的方法 掌握修改端口优先级影响根端口与指定端口选举的方法 掌握配置边缘的方法 拓扑图 场景 你是公司的网络管理员 公司的网络使用了两层网络结构
  • Redis基础--认识redis和对比同类型产品

    一 redis定义与应用 Nosql定义 NoSQL是不同于传统的关系数据库的数据库管理系统的统称 其两者最重要的区别是NoSQL不使用SQL作为查询语言 MySQL定义 MySQL是一种关系型数据库 关系型数据库的一个常见用法是存储长期的
  • 如何大批量压缩图片

    一 ImageMagick ImageMagick 是一个功能强大的命令行图像处理工具 可以用于批量处理图片 它支持各种图像格式和操作 包括压缩和优化 二 使用 ImageMagick 进行大批量压缩指定路径的图片 你可以通过以下步骤实现
  • JavaScript中的内存回收机制

    JS的内存回收 在js中 垃圾回收器每隔一段时间就会找出那些不再使用的数据 并释放其所占用的内存空间 以全局变量和局部变量来说 函数中的局部变量在函数执行结束后这些变量已经不再被需要 所以垃圾回收器会识别并释放它们 而对于全局变量 垃圾回收
  • 宝塔中 nodejs项目 nginx 网站基础/代理设置

    上面是一些基础配置就不写了 吧请求全部代理到 nodejs 项目 location 如果使用pm2等启动node项目 需要加header头 防止读取不到客户端IP proxy set header Host proxy host proxy
  • 生态伙伴

    提到时间管理 想必大多数人的第一反应就是 番茄工作法 番茄工作法是意大利人弗朗西斯科 西里洛于1992年创立的 他和我们大多数人一样 是一个重度拖延症患者 在他大学生活的前几年 曾一度苦于学习效率低下 于是他做了个简单的实验 他找来形状像番
  • JMeter下载及使用

    前言 我是个前端 只是一次偶然的机会被安排用了一次JMeter 做了下步骤记录 所以内容比较基础 想深入研究的兄弟可以再多找找哈 一 下载 官网地址 Apache JMeter Download Apache JMeter 下载zip包 应
  • 计算机网络的软件系统包括哪几部分,系统软件由哪几部分组成?

    系统软件用于实现计算机系统的管理 调度 监视和服务等功能 其目的是方便用户 提高计算机使用效率 扩充系统的功能 通常将系统软件分为以下六类 1 操作系统操作系统是控制和管理计算机各种资源 自动调度用户作业程序 处理各种中断的软件 操作系统的
  • 邮件发送接收原理

    概述 电子邮件是因特网上使用得非常多的一种应用 它可以非常方便的使相隔很远的人进行通信 它主要的特点就是操作简单 快捷 当你发送一封邮件的时候 它首先会发送到收件人的邮件服务器上 并放入收件人的信箱中 如果你在某一个邮件服务器提供商那里申请
  • 建站系列(二)--- 域名、IP地址、URL、端口详解

    目录 相关系列文章 前言 一 IP地址 二 域名与IP地址 三 域名与URL 四 IP地址与端口号 相关系列文章 建站系列 一 网站基本常识 建站系列 二 域名 IP地址 URL 端口详解 建站系列 三 网络协议 建站系列 四 Web服务器
  • Altium Designer 9 学习笔记(二)制作完整的原理图并在此基础上导出PCB版图

    首先 先说下本次练习对象 简单的光敏小夜灯 1 制作原理图 按制图流程 1 1 新建工程及原理图 F N J B 一套连招创建PCB工程 然后右键为新建的工程添加原理图文件 完成后如下图所示 1 2 加载元器件并生成序号 1 2 1 加入电
  • excel转换pdf方法 (aspose.cells亲测有效)

    AsposeUtils java package com lmp test utils import com aspose cells License import com aspose cells PdfSaveOptions impor
  • 北航学长:DCIC 2021的算法方案讲解

    作者 阿水 北京航空航天大学 Datawhale成员 DCIC 作为每年具有重要影响力的政府赛事 除了高认可 高奖金 最重要的是开放了政府和企业的真实数据 具有研究和落地价值 但对于刚参加赛事的同学 还是有难度的 希望通过分享让更初学者也能
  • 网管员牢记10种较为常见服务器管理错误

    网络管理阶层的工作就是保证网络的正常工作 从而使得职工们的工作不被打断 可问题在于事物并非总是按照理想状况发展 事实上经常会出现平地起风波的状况 其间有许多原因 这里我们只讨论10种较为常见的网管错误 1 UPS 不间断电源 的使用问题 某
  • Python+Requests-2-接口自动化脚本实现(虫师-Django接口测试实例)

    编写脚本前分析项目架构 需求 python脚本实现 添加发布会信息 的接口测试 以邮件形式发送测试报告 1 新建一个case目录 存放测试用例 2 新建一个config目录 存放配置信息和读取配置信息 3 新建一个db fixture目录
  • vue项目打包部署到服务器

    目录 一 打包项目 二 修改Nginx的配置 三 部署 四 开放端口号 一 打包项目 1 在 vue config js 文件中找到并修改 主要是publicPath 与outputDir 两项配置 若项目中有baseUrl 替换为publ
  • 【嵌入式学习-C语言篇】 char & short & int 的使用

    嵌入式学习 C语言篇 char short int 的使用 三种数据类型常用场景 智能家居 网关协议中mac地址上报 网关 网关 Gateway 又称网间连接器 协议转换器 网关在传输层以上实现网络互连 是最复杂的网络互连设备 仅用于两个高
  • STM32 进阶教程 7 -  C与C++混合编程

    前言 在嵌入式开发过程中经常会用到第三个芯片 设备 这些第三方的芯片提供的DEMO程序或驱动程序有时候是C 如果先前的系统用C语言写的就会出现点问题 往往需先将C 的驱动程序自已手动改成C语言再用 本节给大家介给一下如何在KEL MDK环境