前言

在嵌入式开发过程中经常会用到第三个芯片/设备,这些第三方的芯片提供的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

关注十三公众号

STM32 进阶教程 7 -  C与C++混合编程相关推荐

  1. STM32 进阶教程 6 -  汇编与C混合编程

    前言 在嵌入式开发过程中,有时候为了追求代码性能与效率不得不采用汇编语言来编写代码,但是汇编代码在阅读时表现不如C语言友好,本节给大家介绍一种新的方法,关键代码用汇编语言时行实现,然后用C语言时行接封 ...

  2. STM32 进阶教程 20 - 串口+DMA实现OneWire总线

    前言 One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5完成数据校验.常见对于one-wire总线的操作代码主要使用包含基 ...

  3. STM32 进阶教程 19 - IQmath数学库的使用

    前言 STM32 M3 系列是不带浮点运算单元的,小数运算都是采用定点转浮点试式实现的,本节给大家介绍一个很好用的定点转浮点数学运算库,IQmath是德州仪器 (TI) 的一个高度优化的高精度数学函数 ...

  4. STM32 进阶教程 18 – ADC间断模式

    前言 STM32 的ADC拥有连续扫描模式,也有间断模式,间断模式较扫描模式需要更多的触发事件才能完成所有的通道转换操作,在实际工程应用中,可以利用间断模式实现一些特殊应用.关于间断模式,在STM32 ...

  5. STM32 进阶教程 17 - ADC注入通道

    前言 STM32 的ADC的一个强大功能是支持触发注入功能,在103中每个ADC模块支持4个注入通道,每个注入通道具有独立的结果突存器,注入通道具有较规划通道更高的优先级,在实际工程应用中,注入通道更 ...

  6. STM32 进阶教程 16 - ADC1与ADC2同步采样

    前言 STM32中在有2个或以上ADC模块的产品中,可以使用双ADC模式.在双ADC模式里,根据ADC1_CR1寄存器中DUALMOD[2:0]位所选的模式,转换的启动可以是ADC1主和ADC2从的交 ...

  7. STM32 进阶教程 15 - 串口DMA收发

    前言 串口操作相信大家一定很熟悉,如果你已经会串口的收发数据,并可以灵活使用轮询及中断方式对串口进行数据收发,那么恭喜你,学完本节内容后,也将可以学会串口的更高级操作方式,DMA方式,DMA操作串口可 ...

  8. STM32 进阶教程 14 - 程序加密之FLASH读写保护

    前言 在嵌入式应用开发中,应用开发完成后往往需要对芯片中的程序进行加密处理,用以保护程序安全(不至被竞争对手从芯片把程序固件考走),本节将给大学介绍一个如何实现程序自动给芯片加密功能.学完本节内容,你 ...

  9. STM32 进阶教程 13 – FLASH的读写操作

    前言 在嵌入式应用开发中,经常会遇到掉电后还要保存的信息,这些信息通常只能保存在外部的一些存储芯片中,如外部flash,外部EEPROM, 其实这些信息同样可以保存在STM32自带的内部flash中, ...

最新文章

  1. “进度条”博客——第三周
  2. python 自动克隆gitlab web前端
  3. Fishe向量Fisher Vecotr(二)
  4. 每天一香蕉,长成螺纹钢
  5. eclipse如何快速查找某个类
  6. mysql 学习笔记04 insert与update语句
  7. linux mysql移植_linux 下mysql 移植设置方法
  8. java的流套接_java-使用流关闭套接字
  9. [转]SUID和SGID
  10. IE下img多余5像素空白
  11. NIO_通道之间传输数据
  12. 断言失败的vc++文档_了解C / C ++中的断言
  13. 数字交易所内存撮合、无锁并发技术源码
  14. niceScroll.js
  15. 计算机有损压缩编码,有损压缩格式有哪些
  16. 拍拍贷第三届“魔镜杯”启动 :10万美金邀你“秀出你的算法!”
  17. 忘记MySQL密码如何重置再到重新设置密码
  18. 大数据开发都需要什么技术?
  19. iOS 5.1实现旋转屏幕
  20. 一页纸项目管理pdf_项目管理,一页纸就够了

热门文章

  1. [hdu4333]Revolving Digits
  2. final阶段团队贡献分分配
  3. 原因代码10044-Erdos number Time limit exceeded
  4. WebMisDeveloper4.2.0面世
  5. “东湖”的艄公--漫步绍兴(四)
  6. UA MATH524 复变函数13 奇点与留数
  7. UA OPTI570 量子力学24 Spin-1/2
  8. UA MATH567 高维统计I 概率不等式7 亚指数性与亚指数分布
  9. UA MATH571A 多元线性回归I 模型设定与推断
  10. C++ const char* 学习