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

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

3天内不再提示

如何基于Keil、STM32用C++编写流水灯程序?

RTThread物联网操作系统 来源:strongerHuang 作者:strongerHuang 2021-04-30 16:10 次阅读

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

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

1

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

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

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

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

当然,这里是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 __cplusplus extern “C” {#endif

//这里C源代码

#ifdef __cplusplus}#endif

什么意思呢?

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

4

定义LED

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

本文讲述一个很基础的例子“LED点灯”,用C++编程实现的方法很多,这里将其中一个基础的方法。

首先,创建一个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;

RCC_APB2PeriphClockCmd(RCC_APB2Periph, ENABLE); 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); }

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闪烁的现象。

说明:

使用C++写单片机流水灯程序,实现的方法有很多,比如还有一些更高级的继承、多态等用法,也可以引入进来。以上只是提供一种思路,引导初学者学习C++编程。

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

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

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    6029

    文章

    44480

    浏览量

    631602
  • C++
    C++
    +关注

    关注

    21

    文章

    2094

    浏览量

    73442

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

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于51单片机的跑马灯/流水灯系统

    具体实现功能(1)9种LED流水灯模式通过按键进行切换,数码管显示流水灯模式。(2)通过加减按键可以切换每种LED流水灯的速度。仿真演示视频:设计介绍51单片机简介51单片是一种低功耗、高性能
    的头像 发表于 10-22 14:12 99次阅读
    基于51单片机的跑马灯/<b class='flag-5'>流水灯</b>系统

    keil可以读出单片机的程序

    表述存在一定的误解,因为Keil主要是用于编写、编译和调试单片机程序的工具,而不是直接从单片机中读取已编程代码的工具。 一、Keil的主要功能 编程开发 :
    的头像 发表于 09-02 10:32 540次阅读

    keil软件怎么运行写好的程序

    软件的安装包,然后按照安装向导进行安装。安装完成后,启动Keil软件。 创建项目 在Keil软件中,需要创建一个新的项目来存放编写程序。点击“Project”菜单,选择“New uV
    的头像 发表于 09-02 10:29 1192次阅读

    keil5怎么往stm32里烧录程序

    相关设置。 编写代码 在Keil5中编写您的STM32程序。您可以使用C
    的头像 发表于 08-22 09:31 1632次阅读

    单片机POV LED流水灯制作

    电子发烧友网站提供《单片机POV LED流水灯制作.docx》资料免费下载
    发表于 05-28 14:34 3次下载

    keilc++编译含有rtos模块时的错误问题怎么解决?

    近期看到一个哥们c++写嵌入式,感觉蛮有趣,如果当初我的程序要是能用类就轻松多了,所以也想尝试一下。虽然不会c++但是还是多少会用简单的class,这个
    发表于 05-09 08:29

    51单片机流水灯制作

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

    C++简史:C++是如何开始的

    MISRA C++:2023,MISRA® C++ 标准的下一个版本,来了!为了帮助您做好准备,我们介绍了 Perforce 首席技术支持工程师 Frank van den Beuken 博士撰写
    的头像 发表于 01-11 09:00 501次阅读
    <b class='flag-5'>C++</b>简史:<b class='flag-5'>C++</b>是如何开始的

    PLC控制8盏流水灯电路原理图和实际接线图详解

    PLC控制8盏流水灯电路原理图和实际接线图
    的头像 发表于 12-27 11:47 5815次阅读
    PLC控制8盏<b class='flag-5'>流水灯</b>电路原理图和实际接线图详解

    利用SCR步进指令实现流水灯循环点亮

    在以往介绍西门子smart文章中,提到过流水灯的写法,有用循环位移字[ROL(R)_B]节来实现,有利用定时器(TON)来实现。今天我们利用SCR步进指令来实现流水灯循环点亮,在作这个实验前提必须满足如下几个软硬件条件:
    的头像 发表于 12-04 09:15 1969次阅读
    利用SCR步进指令实现<b class='flag-5'>流水灯</b>循环点亮

    codeblocks怎么编写程序

    Code::Blocks是一款免费、开源的集成开发环境(IDE),它提供了一个方便的平台来编写、调试和运行CC++以及其他编程语言的程序。在本篇文章中,我们将详细讨论如何使用Code
    的头像 发表于 11-26 10:28 1326次阅读

    c语言编写的源程序可以直接运行吗

    的形式存储,通常以.c或者.cpp为文件扩展名。 在编写C语言程序时,首先需要选择一个合适的集成开发环境(IDE)或者文本编辑器,例如Visual Studio、Code::Block
    的头像 发表于 11-26 09:03 6506次阅读

    分享花样流水灯程序

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

    基于STM32F103系统的FreeRTOS程序移植

    程序中,移植了正点原子的基于STM32的FreeRTOS程序编写了自己的内存管理程序malloc.c
    的头像 发表于 11-10 11:03 2343次阅读
    基于<b class='flag-5'>STM32</b>F103系统的FreeRTOS<b class='flag-5'>程序</b>移植

    基于51单片机无线遥控流水灯电路图及程序

    本资源内容概要: 这是基于51单片机的无线遥控流水灯设计包含了电路图源文件(Altiumdesigner软件打开)、C语言程序源代码(keil软件打开) 。 本资源适合人群: 单片机爱
    发表于 11-06 18:15 1次下载