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

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

    关注

    6074

    文章

    45340

    浏览量

    663626
  • C++
    C++
    +关注

    关注

    22

    文章

    2122

    浏览量

    76714

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C++程序异常的处理机制

    1、什么是异常处理? 有经验的朋友应该知道,在正常的CC++编程过程中难免会碰到程序不按照原本设计运行的情况。 最常见的有除法分母为零,数组越界,内存分配失效、打开相应文件失败等等。 一个
    发表于 12-02 07:12

    第4章 C语言基础以及流水灯的实现(4.7 4.8)

    1.1 Keil软件延时 C语言常用的延时方法,有如图4-2所示4种。 图4-2  C语言延时方法 这4种延时方法,其中两种非精确延时,两种精确一些的延时。for语句和while语句都可以通过改变i
    的头像 发表于 11-19 17:20 492次阅读
    第4章 <b class='flag-5'>C</b>语言基础以及<b class='flag-5'>流水灯</b>的实现(4.7 4.8)

    【沁恒CH585开发板免费试用体验】GPIO 流水灯

    ; 2) GPIO 端口模式设置; 3) 初始化IO口; 4) 编写处理函数; 3.2 流水灯代码实现 主函数代码如下: #include \"CH58x_common.h\"
    发表于 07-04 22:55

    使用英特尔® NPU 插件C++运行应用程序时出现错误:“std::Runtime_error at memory location”怎么解决?

    使用OpenVINO™工具套件版本 2024.4.0 构建C++应用程序 使用英特尔® NPU 插件运行了 C++ 应用程序 遇到的错误: Microsoft
    发表于 06-25 08:01

    主流的 MCU 开发语言为什么是 C 而不是 C++

    在单片机的地界儿里,C语言稳坐中军帐,C++想分杯羹?难喽。咱电子工程师天天跟那针尖大的内存空间较劲,C++那些花里胡哨的玩意儿,在这儿真玩不转。先说内存这道坎儿。您当stm32f4的
    的头像 发表于 05-21 10:33 780次阅读
    主流的 MCU 开发语言为什么是 <b class='flag-5'>C</b> 而不是 <b class='flag-5'>C++</b>?

    使用C++中的CyAPI编写的应用程序上遇到了问题,求解决

    我在使用 C++ 中的 CyAPI 编写的应用程序上遇到了问题。 我将 XferData() 方法与其他所有端点类型一起使用,没有遇到任何问题。 但是,将其与 Endpoint0 一起使用会引发
    发表于 05-13 06:11

    如何在 树莓派 上编写和运行 C 语言程序

    在本教程中,我将讨论C编程语言是什么,C编程的用途,以及如何在RaspberryPi上编写和运行C程序。本文的目的是为您介绍在Raspber
    的头像 发表于 03-25 09:28 940次阅读
    如何在 树莓派 上<b class='flag-5'>编写</b>和运行 <b class='flag-5'>C</b> 语言<b class='flag-5'>程序</b>?

    cubemx生成HAL库+FreeRTOS,当编写程序时却代码无法自动提示怎么解决?

    各位佬,请问一下,我的是cubemx生成HAL库+FreeRTOS,编译时并没有错误,但当我编写程序时却代码无法自动提示(我设置好了),并且连uint8_t这种变量也不会变成蓝色,当我查看工程文件
    发表于 03-12 08:21

    基于OpenHarmony标准系统的C++公共基础类库案例:ThreadPoll

    1、程序简介该程序是基于OpenHarmony标准系统的C++公共基础类库的线程池处理:ThreadPoll。本案例完成如下工作:创建1个线程池,设置该线程池内部有1024个线程空间。启动5个线程
    的头像 发表于 02-10 18:09 600次阅读
    基于OpenHarmony标准系统的<b class='flag-5'>C++</b>公共基础类库案例:ThreadPoll

    #中国香河英茂科工#STC32G12K128#屠龙刀三.2 流水灯例程

    流水灯
    丙丁先生
    发布于 :2025年01月19日 14:19:35

    Spire.XLS for C++组件说明

    Spire.XLS for C++ 是一款专业的 C++ Excel 组件,可以用在各种 C++ 框架和应用程序中。Spire.XLS for C+
    的头像 发表于 01-14 09:40 1299次阅读
    Spire.XLS for <b class='flag-5'>C++</b>组件说明

    EE-134:为SHARC系列编写C兼容汇编代码中断处理程序

    电子发烧友网站提供《EE-134:为SHARC系列编写C兼容汇编代码中断处理程序.pdf》资料免费下载
    发表于 01-07 13:58 0次下载
    EE-134:为SHARC系列<b class='flag-5'>编写</b><b class='flag-5'>C</b>兼容汇编代码中断处理<b class='flag-5'>程序</b>

    【正点原子STM32H7R3开发套件试用体验】流水灯

    工程,之后使用 Keil MDK IDE 编译代码,实现流水灯的项目流程。从配置过程中发现,系统核心具有极高的运行速率,STM32H7系列具有32位Arm Cortex®-M7内核,运行频率高达 600 MHz,因此可以更快速地
    发表于 12-28 18:51

    低成本单片机方案——触摸流水灯开关控制

    方案触摸流水灯控制方案Thedevelopmentofascheme随着物联网技术的不断发展和智能家居的普及,触摸流水灯控制方案作为一种新型的智能照明控制方式,逐渐成为市场的新宠。PART.1方案
    的头像 发表于 12-26 16:37 1189次阅读
    低成本单片机方案——触摸<b class='flag-5'>流水灯</b>开关控制

    【RA-Eco-RA4E2-64PIN-V1.0开发板试用】MDK+点灯+流水灯

    ” 文件,在 hal_entry 函数里面编写我们的代码。 直接运行,灯会常亮 流水灯实验,延迟200ms
    发表于 12-15 15:59