作者 | 黄强
微信公众号 | 预埋立柱
一般来说,编程都是在单片机上完成的,但是很少有人使用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)添加到项目中
使用V5和V6,项目配置选项有一些差异:
ST的开发库已经提供了支持。 你会看到这段代码:
extern "C" {
//这里C源代码
}
这意味着什么?
这是一段预处理,从预处理代码可以看出。 大致意思是:支持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);
}
}
编译的代码量相对较大:
然后,如果你有开发板,直接下载运行就出现LED闪烁的现象。
阐明:
使用 C++ 编写微控制器流量灯程序的方法有很多种。 比如还有一些更高级的继承、多态等用法也可以引入。 以上只是为指导初学者学习C++编程提供了一个思路。
是不是很简单呢? 看到这里你是否厌倦了学习?