基于Keil、STM32,用C++编写流水灯程序的一些内容

通常来说,在单片机上编程,,而用C++进行开发的很少,那么究竟能不能用C++开发单片机呢?为什么很少用C++开发单片机使用C++写单片机流水灯程序,实现的方法有很多,比如还有一些更高级的继承、多态等用法,也可以引入进来。

作者 | 黄强

微信公众号 | 预埋立柱

一般来说,编程都是在单片机上完成的,但是很少有人使用C++进行开发。 那么,C++可以用来开发单片机吗?

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

为什么C++很少用于开发微控制器

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

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

因此,C语言比C++具有更小的代码量(bin文件)和更快的运行速度。

当然,这是C相对于C++而言的。 其实汇编比C的代码量更小,运行速度更快,可以参考文章:

由于单片机的RAM和Flash资源较小,运行速度比较低,所以你会发现很少有人在单片机上使用C++开发项目。

事实上,随着微控制器的存储资源和运行速度的增加,现在一些工程师开始使用C++来开发微控制器项目。

准备

在Keil MDK开发环境中,使用C语言开发STM32是比较常见的。 还有哪些开发环境安装、项目创建等本文没有涉及到,可以参考我的文章:

这是Keil的基础教程。 如果不明白,可以在我的公众号后台回复关键词“”,阅读更多Keil的使用方法。

然后你需要了解一些C++的基本语法。 本文介绍的内容比较基础,用到了非常基础的C++知识。 例如:类、对象等基本内容。

即使您从未学过 C++,也没关系。 只要懂C语言,在线学习C++基础知识并不难。

阐明

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

将C++源代码(例如:main.cpp)添加到项目中

基于Keil、STM32,用C++编写流水灯程序的一些内容

使用V5和V6,项目配置选项有一些差异:

基于Keil、STM32,用C++编写流水灯程序的一些内容

ST的开发库已经提供了支持。 你会看到这段代码:

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

这意味着什么?

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

定义 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语言,相信你也能看懂。

流水灯的实现(主要功能)

使用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); }}

编译的代码量相对较大:

基于Keil、STM32,用C++编写流水灯程序的一些内容

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

阐明:

使用 C++ 编写微控制器流量灯程序的方法有很多种。 比如还有一些更高级的继承、多态等用法也可以引入。 以上只是为指导初学者学习C++编程提供了一个思路。

是不是很简单呢? 看到这里你是否厌倦了学习?

单片机

热敏电阻测温电路的设计院-上海怡健教育培训

2024-4-26 3:06:48

单片机

单片机最小系统专业电子科学与技术班级1102班课程设计

2024-4-26 4:04:42

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索