关注+星标公众,不错过精彩内容

作者 | strongerHuang

微信公众号 | 嵌入式专栏

通常来说,在单片机上编程,要么汇编,要么C语言,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢?

答案是肯定可以的,下面讲讲基于Keil、STM32,用C++编写流水灯程序的一些内容。

嵌入式专栏

1

为什么很少用C++开发单片机

不知道大家对面向过程面向对象的理解有多少?

C语言面向过程的语言,C++是面向对象的编程语言。结合本文来说,面向过程相比面向对象的编程,代码量更小,运行效率更高。

所以,C语言相比C++具有更小代码量、更快的运行速度。

当然,这里是C相对C++而言。其实,汇编相对C而言,具有更小代码量和更快的运行速度。可以参看文章:用 汇编 和 C语言 写流水灯程序有什么不一样?

因为单片机的RAM和Flash资源相比较小,运行速度也相对较低,所以,你会发现:很少有人在单片机上面用C++开发项目。

其实,随着单片机的存储资源以及运行速度的增加,目前有些工程师开始用C++开发单片机项目了。

嵌入式专栏

2

准备工作

在Keil MDK开发环境下,用C语言开发STM32比较常见了,什么开发环境安装、创建工程等这些步骤,本文不讲述,请参看我文章:

Keil系列教程01_Keil介绍、下载、安装与注册

Keil系列教程02_新建基础软件工程

这是Keil的基础教程,有不懂的同学,可以在我公众号后台回复关键字“Keil系列教程”阅读Keil更多的使用方法。

然后就是需要懂一些C++的基础语法,本文讲述的内容比较基础,用到C++很基础的知识。比如:类、对象这些基础内容。

没学过C++也没关系,只要懂C语言,在网上现学C++基础知识,难度都不大。

嵌入式专栏

3

使用说明

在Keil MDK环境下,使用的是ARM编译器(Arm Compiler),很多网上教程使用V6编译,其实V5和V6版本都是支持C++编程语言的。

在工程中添加C++源代码(比如:main.cpp)

使用V5和V6,工程配置的选项有些差异:

ST的开发库都已经做了支持,你会看到这么一段代码:

#ifdef __cplusplusextern "C" {
#endif//这里C源代码#ifdef __cplusplus
}
#endif

什么意思呢?

这是一段预处理,从预处理代码可以看得出来,大概意思就是:支持C和C++混合编程

嵌入式专栏

4

定义LED类

在本文默认大家掌握了用C语言开发STM32流水灯的知识,直接描述C++代码内容。

本文讲述一个很基础的例子"LED灯",比如创建一个main.cpp源代码文件。

首先,定义一个LED类:

class LED_Class{
}

然后定义私有成员(当然,public也可以):

class LED_Class{
private:GPIO_TypeDef *GPIOx;uint16_t GPIO_Pin;uint32_t RCC_APB2Periph;
}

再次就是用到的函数:初始化GPIO、打开、关闭LED等。

class LED_Class{
private:GPIO_TypeDef *GPIOx;uint16_t GPIO_Pin;uint32_t RCC_APB2Periph;public:LED_Class(GPIO_TypeDef *GPIOx,uint16_t GPIO_Pin, uint32_t RCC_APB2Periph){LED_Class::GPIOx = GPIOx;LED_Class::GPIO_Pin = GPIO_Pin;LED_Class::RCC_APB2Periph = RCC_APB2Periph;}void Init(void){GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin   = GPIO_Pin;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_Out_PP;GPIO_Init(GPIOx, &GPIO_InitStruct);RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE);}void Open(void){GPIO_SetBits(GPIOx, GPIO_Pin);}void Close(void){GPIO_ResetBits(GPIOx, GPIO_Pin);}
};

这个代码是不是很简单,即使你不会C++,只要懂C语言,相信都能看懂。

嵌入式专栏

5

流水灯实现(main函数)

用C++的思路和C语言类似,先初始化,然后再实现:

int main(void)
{LED_Class LED1(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);LED_Class LED2(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);LED1.Init();LED2.Init();while(1){LED1.Open();LED2.Open();Delay(10);LED1.Close();LED2.Close();Delay(10);}
}

还有一种初始化:

int main(void)
{LED_Class *LED1 = new LED_Class(GPIOF, GPIO_Pin_7, RCC_APB2Periph_GPIOF);LED_Class *LED2 = new LED_Class(GPIOF, GPIO_Pin_8, RCC_APB2Periph_GPIOF);LED1->Init();LED2->Init();while(1){LED1->Open();LED2->Open();Delay(50);LED1->Close();LED2->Close();Delay(50);}
}

编译出来的代码量相对更大:

然后,如果有开发板,直接下载即可运行LED闪烁的现象。

是不是很简单,看到这里,你学废了吗?

------------ END ------------

后台回复『单片机』『嵌入式软件设计与开发』相关文章。

欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

欢迎关注我的视频号:

点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

基于Keil、STM32,用C++编写流水灯程序相关推荐

  1. 用keil编写C语言流水灯程序,简述关于Keil、STM32 用C++编写流水灯程序

    通常来说,在单片机上编程,要么汇编,要么C语言,而用C++++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil.STM32,用C++编写流水灯程序的一些内容 ...

  2. keil流水灯c语言程序两个一起亮,我用keil c51编了一个流水灯程序,编译无误却只有第一和第二个灯亮了,最后停在第一个灯处不动...

    满意答案 zJ张俭 2014.02.09 采纳率:43%    等级:12 已帮助:10469人 你有几个错误: 1 你的定时器没有重装,导致第一次中断和后面的中断时间不一样,第一次时间短,后面的时间 ...

  3. STM32单片机点亮流水灯

    STM32单片机GPIO口点亮流水灯 任何一个单片机,最简单的外设莫过于 IO 口的高低电平控制了,本文将通过一个经典的流水灯程序,了解 STM32F1 的 IO 口作为输出LED:DS0 和 DS1 ...

  4. 以STM32为核心制作流水灯

    ** 以STM32为核心制作流水灯 ** 文章目录 以STM32为核心制作流水灯 一.硬件部分 1.IO口选择 2其余硬件 3.连线 二.软件部分 2.1寄存器配置 2.2主函数编写 2.3程序烧录 ...

  5. I/0口输入输出实验 流水灯程序 P0、P1、P2、P3口作为输出口,连接八只发光二极管,编写程序,使发光二极管从左至右循环点亮。

    P0.P1.P2.P3口作为输出口,连接八只发光二极管,编写程序,使发光二极管从左至右循环点亮.流水灯程序 程序: #include<reg51.h> //包含单片机定义寄存器的头文件 s ...

  6. c语言流水灯程序详细讲解,用c语言编写单片机流水灯程序详解

    用C语言编写的单片机流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. ? 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组 ...

  7. 单片机c语言程序编写步骤,用c语言编写单片机流水灯程序详解

    用C语言编写的流水灯程序 一.硬件电路 因为电路用单片机控制,所以电路非常简洁.其电路原理图见下图,印制板图如下图所示. 电路的核心部分是AT89C2051单片机,前面提到它有Pl和P3两组I/O口, ...

  8. 用Keil写一个8路流水灯,两侧各一个LED同时亮起,之后依次向中间聚拢,然后在展开,接着,在8个灯闪三次,为一次循环...

    下面是用 Keil 写一个 8 路流水灯的基本步骤: 在 Keil 中新建一个项目,按照你所使用的单片机的型号设置相应的配置. 在代码文件中包含头文件,如 "reg51.h",用于 ...

  9. c语言流水灯仿真程序设计框图,基于单片机c语言控制的流水灯程序设计及prtes仿真图.docx...

    基于单片机c语言控制的流水灯程序设计及prtes仿真图 89c51与8个发光二极管相连流水控制 一.不同花样的控制源程序代码: /*#include #define uchar unsigned ch ...

最新文章

  1. leetcode : Reverse Linked List II [two pointers]
  2. 分布式系统 c语言,C语言分布式系统中的进程标识!
  3. Windows PowerShell 2.0语言开发之脚本块
  4. python断点_Python断点()
  5. K8s之DashBoard
  6. win10计算机本地组策略编辑器,win10本地组策略编辑器打不开最佳解决方法
  7. 【翻译】图解Janusgraph系列-事务详解(Janusgraph Transactions)
  8. python条件语句作用_Python 条件语句
  9. 止血、回血 苏宁易购正在复苏路上
  10. 实体关系图(ER图)
  11. 在C语言中使用bool
  12. nexues vpc 角色切换,引起staick 重置引起业务中断问题
  13. 杰理之唤醒源获取【篇】
  14. 汇编实验:格雷码转二进制(ASCII码)的实现和调试
  15. uniapp底部IOS安全距离
  16. Paperreading之五 Stacked Hourglass Networks(SHN)和源码阅读(PyTorch版本)
  17. js 递归思想 处理后台多维数组的数据 之 完美契合
  18. 阿里云安装mysql8.0版本操作步骤
  19. 【电力电子技术DC-AC】单相双极性SPWM逆变电路 Simulink仿真
  20. 【工作流Activiti7】1、入门篇

热门文章

  1. KMP字符串模式匹配详解(zz)
  2. 艾为2022数字芯片设计笔试题
  3. 天音控股构造移动互联网
  4. html5轮播怎么自动换图,js实现轮播图效果 纯js实现图片自动切换
  5. 《Word中批量去除多余空格、空行、换行》
  6. 离散系统的零极点分布图
  7. 港股交易软件重要吗?有哪些港股交易入门知识需要掌握
  8. animations 动画图片的播放
  9. 计算机网络端口在哪层,小白入门级计算机网络协议详解,TCPIP协议、各层功能理解...
  10. 在cocos2d-x3.0里面如何使用物理引擎:弹球