0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述关于Keil、STM32 用C++编写流水灯程序

strongerHuang 来源:strongerHuang 作者:strongerHuang 2021-04-22 10:23 次阅读

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

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

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

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

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

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

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

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

2准备工作

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

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

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

3使用说明

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

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

b4d1856e-a2d2-11eb-aece-12bb97331649.png

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

b5064cb8-a2d2-11eb-aece-12bb97331649.png

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

#ifdef __cplusplus extern "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);  }}

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

b5349370-a2d2-11eb-aece-12bb97331649.png

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

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

编辑:jq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7513

    浏览量

    124181
  • C++
    C++
    +关注

    关注

    21

    文章

    2061

    浏览量

    72847
  • 源代码
    +关注

    关注

    94

    文章

    2922

    浏览量

    65983

原文标题:基于Keil、STM32,用C++编写流水灯程序

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    51单片机流水灯制作

    流水灯是学习51单片机的一个基本项目,是我们对单片机IO口输出认识的基本项目。当然学会了花样流水灯也很好玩。 下面就分享一种51单片机流水灯制作的方法。 一、流水灯原理图 二、相关知
    的头像 发表于 02-26 10:06 277次阅读
    51单片机<b class='flag-5'>流水灯</b>制作

    分享花样流水灯程序

    电子发烧友网站提供《分享花样流水灯程序.doc》资料免费下载
    发表于 11-18 09:59 3次下载
    分享花样<b class='flag-5'>流水灯</b>源<b class='flag-5'>程序</b>

    基于单片机的流水灯电路设计

    前面一课掌握了嵌入式程序源代码级调试,为复杂单片机实验程序的调试做好了准备工作。本次实验完成流水灯电路模型设计和编程,在实验过程中,学习流水灯电路设计、
    的头像 发表于 10-31 14:56 1307次阅读
    基于单片机的<b class='flag-5'>流水灯</b>电路设计

    求分享c语言的51单片机流水灯循环流水程序

    [i][i][i][i] c语言 的51单片机流水灯循环流水程序
    发表于 10-18 06:57

    C++STM32程序,编译后会有执行效率慢的问题吗?

    C++STM32程序,编译后,会有执行效率慢的问题吗
    发表于 09-20 07:56

    如何使用51单片机制作一个心形流水灯

    使用 51 单片机制作一个心形流水灯 心形流水灯,顾名思义,成品肯定是一个心形。随着程序的改变,通过单片机控制单个灯的亮灭达到不同的流动图案效果。 01 单片机,类似于电脑cpu,处理数据的芯片
    的头像 发表于 09-11 10:27 2161次阅读
    如何使用51单片机制作一个心形<b class='flag-5'>流水灯</b>

    【新定义MCU开发板测评】点灯及流水灯

    初始化这12个引脚 3、编写延时函数,延时时间为大致计算所得(不一定准确) 4、在主函数依次点亮12个LED灯并加上延时效果,即可实现一个简单的流水灯,效果如下
    发表于 08-13 12:24

    51单片机的8位按键流水灯设计

    本资源内容概要: 这是基于51单片机的8位按键流水灯设计包含了C语言程序源代码(keil软件打开)。 本资源适合人群: 单片机爱好者、电子类专业学生、电子diy爱好者。 本资源能学到什么: 可以通过
    发表于 07-24 14:36 0次下载

    基于89C51单片机的24c02存储花样流水灯程序

    基于89C51单片机的24c02存储花样流水灯程序
    发表于 05-16 10:43 1次下载

    ARM Cortex-M学习笔记:GPIO流水灯的前世今生

    上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深入研究流水灯的调用逻辑和数据结构。
    的头像 发表于 05-15 14:44 1843次阅读
    ARM Cortex-M学习笔记:GPIO<b class='flag-5'>流水灯</b>的前世今生

    GD32开发实战指南(基础篇) 第3章 GPIO流水灯的前世今生

    上一章通过控制GPIO的高低电平实现了流水灯,但只是告诉了大家怎么做,如何实现流水灯,本文将深入剖析的GPIO流水灯的前生今世,深入研究流水灯的调用逻辑和数据结构。
    的头像 发表于 05-10 08:58 4375次阅读
    GD32开发实战指南(基础篇) 第3章 GPIO<b class='flag-5'>流水灯</b>的前世今生

    基于ATmega8单片机流水灯设计Proteus仿真源程序

    基于ATmega8单片机流水灯设计Proteus仿真源程序
    发表于 05-05 09:29 1次下载

    基于51单片机的流水灯设计资料源程序文件

    基于51单片机的流水灯设计资料源程序文件
    发表于 04-26 15:23 4次下载

    关于stm32编写程序的头文件合集

    关于stm编写程序的合集
    发表于 04-23 09:39 1次下载

    proteus仿真从左到右的流水灯

      名称:从左到右的流水灯  软件:proteus 8  keil 4  语言:C 语言  使用说明:本例中,作者使用一个延时程序,控制 LED 灯闪烁和熄灭,周期 1.5 秒。  示
    发表于 04-14 17:45