通常来说,在单片机上编程,要么汇编,要么C语言,而用C++++进行开发的很少,那么究竟能不能用C++开发单片机呢? 答案是肯定可以的,下面讲讲基于Keil、STM32,用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)

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

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

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

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

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

编辑:jq

用keil编写C语言流水灯程序,简述关于Keil、STM32 用C++编写流水灯程序相关推荐

  1. 【嵌入式基础】用C语言编程、寄存器实现LED流水灯程序;stm32CubeMX+Keil使用HAL库点亮流水灯

    本文主要介绍STM32F103系列芯片的地址映射和寄存器映射原理,GPIO端口的初始化设置步骤.利用C语言编程和寄存器点亮流水灯以及stm32CubeMX+Keil使用HAL库点灯 目录 一.STM3 ...

  2. 如何使用emacs编写c语言程序,并编译运行

    vi和emacs被分别被称为编辑器之神和神之编辑器.vi的入门精通都很难,emacs入门容易,精通难:vi使用起来不停地切换模式,而emacs则不停地ctrl,meta等组合键.因此,高德纳大师说操作 ...

  3. c语言最简单的程序编写,C语言简单程序编写.doc

    C语言简单程序编写 项目一 C语言简单程序编写 1.1学习目标 本项目达到的目标为: 掌握程序设计的基本思路 掌握C语言的基本结构 了解流程图的符号含义 掌握C语言的关键字 会设计和编写简单的C应用程 ...

  4. c语言五子棋人机对弈算法_从零开始编写C语言五子棋程序1

    从零开始编写C语言五子棋程序 C语言程序是国科大计算机系本科生必修课程,我选修的是武成岗老师的C语言课程.除了课上回答问题,实验课competitive programming的成绩之外,最终的大作业 ...

  5. VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序)

    VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序) Visual C++ 6.0简称VC或者VC6.0,是微软1998年推出的一款C/C++ IDE,界面友好,调试功能强大.VC6. ...

  6. 使用VS编写C语言程序遇到的scanf错误

    我相信有很多初学者都和我一样会遇到这个报错,在vs编译器中,编写c语言程序的时候,使用scanf实现键盘输入,但是当你运行程序的时候,会像下面一样..... 这里的错误提示,scanf不安全,建议使用 ...

  7. c语言程序如何在keil中运行,keil c51中C程序的启动过程

    汇编是从org 0000h开始启动,那么keil c51是如何启动main()函数的?keil c51有一个启动程序startup.a51,它总是和c程序一起编译和链接.下面看看它和main()函数是 ...

  8. Ubuntu系统中编写c语言程序教程

    目录 1.准备工作 1.1 安装GCC及必要软件包 2.使用GCC编写C语言程序 2.1 编写一个整型运算反回浮点型的程序 2.2 在windows系统下使用编译工具编译该程序 3.使用Makefil ...

  9. Ubuntu中编写C语言程序

    Ubuntu中编写C语言程序 1.准备工作 1.1 安装GCC 2.使用GCC编写C语言程序 2.1 编写一个Hello World程序 2.2 编写一个主程序文件main1.c和子程序文件sub1. ...

最新文章

  1. NET中的设计模式---单件模式
  2. python要不要装pycharm-Python和pyCharm安装
  3. CodeSmith(9)访问数据库多个表
  4. Day 24: 使用Yeoman自动构建Ember项目
  5. 【深度学习】深度学习语义分割理论与实战指南.pdf
  6. 电子科大计算机大类包括专业,电子科技大学a类学科有哪些?附电子科大a类学科名单...
  7. 【TinyML 实践 - 1:What Why TinyML】
  8. HTTP GET 和 POST 的区别
  9. 2013-07-23 IT 要闻速记快想
  10. Monotonic Renumeration- codeforce
  11. ASP.NET WebAPI导入EXCEL数据
  12. DOS 系统安装工具
  13. 笔记本外接2-3个屏幕
  14. 电机扭矩计算机公式由来T=9950*P/
  15. luogu P4593 [TJOI2018]教科书般的亵渎
  16. 2017报计算机热不热,【2017年10月份热吗】2017年10月份热不热_亲亲宝贝网
  17. 逻辑回归实现鸢尾花分类
  18. 深圳大学物计算机黄yilin,中国科学引文数据库(CSCD)收录本校教师论文情况.doc...
  19. C++算法设计与分析课后习题(第三章)
  20. 考取阿里云认证后有什么用?能得到什么工作?

热门文章

  1. Windows 7下查看本机的ip地址
  2. 1977年图灵奖--约翰·巴克斯简介
  3. html中的div是什么意思?
  4. 无理数存在性的几何证明
  5. error c2678解决方法
  6. Linux下关于snmp的snmpwalk命令
  7. 日语口语1.11  松田社長がおいでになることを伺っておりまして、ずっと待っておりました
  8. iOS 开发 -- 使用KeyChain保存用户名、密码并实现自动登录
  9. uipath sequence传递参数_湘西单向滑动球铰支座设计参数深化,期待合作
  10. terraform_有关使用terraform优化云成本的权威指南