你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU 实战经验】用C++开发STM32应用程序

[复制链接]
wuzhujian 发布时间:2014-3-29 02:35
开发单片机应用程序,目前大家用得最多的,还是C语言。
其实,ARM公司的MDK是支持C++开发的。
步骤如下:
1、选择菜单【Project】--->【Options for Target 'xxx'】(xxx是项目名称),在打开的对话框中,选择【c/c++】,在【Misc Controls】中,填入:--cpp。这样,MDK就支持c++,就认识c++相关关键字,比如:class、public、protect。
2、添加你写的C++源程序到项目中。

由于受WTL的影响,我习惯把c++类的定义和实现都放在.h或.hpp文件中。
这样的好处是:添加C++类的成员变量和函数比较方便,不会写错,另外就是,在代码中引用C++的类比较方便,只要包含.h或.hpp就行了。
缺点是:如果类的成员变量和成员函数比较多的话,阅读代码吃力。
对于缺点,对于我来说,也不算缺点。因为我习惯于写小代码,习惯于把复杂问题简单化。
说了那么多,现在上代码。一个简单的点亮LED的类,我把它叫CLed类,存放在led.hpp文件中。
led.hpp的内容如下:

  1. #pragma once
  2. #include
  3. template                                                            // On状态时的电平高低,默认低
  4. class CLed                                                                    // CLed类
  5. {
  6. public:
  7.     CLed(GPIO_TypeDef* gpio, int pins)                                        // 以端口和引脚构造函数
  8.     {
  9.         m_gpio     = gpio;
  10.         m_pins    = pins;
  11.     }
  12.     inline void On()                                                        // 点亮
  13.     {
  14.         if(T)
  15.         {
  16.             m_gpio->BSRR = m_pins;
  17.         }
  18.         else
  19.         {
  20.             m_gpio->BRR = m_pins;            
  21.         }
  22.     }
  23.     inline void Off()                                                        // 关闭
  24.     {
  25.         if(T)
  26.         {
  27.             m_gpio->BRR = m_pins;
  28.         }
  29.         else
  30.         {
  31.             m_gpio->BSRR = m_pins;            
  32.         }
  33.     }
  34.     inline void Switch()                                                    // 反转
  35.     {
  36.         m_gpio->ODR ^= m_pins;            
  37.     }
  38. protected:
  39.     GPIO_TypeDef*    m_gpio;                                                    // GPIO_TypeDef指针
  40.     int                m_pins;                                                    // 引脚
  41. };
复制代码

当要用到CLed类时,只要:
#include "led.hpp"
就可以了。

实例化CLed就很简单,比如:
  1.    CLed led1(GPIOC,GPIO_Pin_8|GPIO_Pin_9);                                // 定义GPIOC.8和GPIO9为led灯,高电平点亮
  2.     CLed led2(GPIOC,GPIO_Pin_6);                                                        // 定义GPIOC.6为led灯,低电平点亮

  3.     led1.On();
  4.     led2.On();
复制代码

MDK的优化效果不错,对于上述3个LED灯的点亮,只使用了2行汇编代码就实现了,分别led1的2个灯的点亮,和led2的1个灯的点亮。
这C++代码的执行效果,并不比C语言的低了。

完整的工程就不上了。
欢迎大家拍砖。
^_^
收藏 5 评论30 发布时间:2014-3-29 02:35

举报

30个回答
mr.hs 回答时间:2015-4-14 19:26:25
wuzhujian 发表于 2014-3-30 12:16
没人用C++开发单片机程序吗?

mbed上全是c++开发者
wkei007 回答时间:2015-4-14 17:17:36
哥们,看你自个在这里自娱自乐,把完整的工程上一下,让大家学习下呀,一起进步嘛
wu1169668869 回答时间:2015-4-15 00:20:32
c++只看过版本premiere
一行程序都没写过 2.gif
wuzhujian 回答时间:2014-3-29 03:03:48

RE:用C++开发STM32应用程序

再补充一下,GPIO引脚的初始化,可以调用ST的库函数来完成。
比如,如果使用的处理器是STM32F0,可以这样初始化引脚。
void Led_Init(void)
{
        GPIO_InitTypeDef gp;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
        gp.GPIO_PuPd        = GPIO_PuPd_UP;
        gp.GPIO_Mode        = GPIO_Mode_OUT;
        gp.GPIO_OType        = GPIO_OType_PP;
        gp.GPIO_Pin         = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        gp.GPIO_Speed        = GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&gp);
}
zydwh 回答时间:2014-3-29 08:50:33

RE:用C++开发STM32应用程序

C++开发STM32有何必要性和优点?
wuzhujian 回答时间:2014-3-29 09:44:35

RE:用C++开发STM32应用程序

自己查查C++与C之间的优缺点,我就不在此献丑了。
wuzhujian 回答时间:2014-3-30 12:16:51

RE:【MCU 实战经验】用C++开发STM32应用程序

没人用C++开发单片机程序吗?
wuzhujian 回答时间:2014-3-31 17:08:46

RE:【MCU 实战经验】用C++开发STM32应用程序

再发一个按键的C++类的实现。
#pragma once
#include ”stm32f10x.h“
template                                                                                                                        // 有效状态时的电平高低,默认低
class CKey
{
public:
CKey(GPIO_TypeDef* gpio, int pins)                                                                                // 以端口和引脚构造函数
{
m_gpio         = gpio;
m_pins        = pins;
}
int ReadKey()                                                                                                                        // 读键(读到是键位值,高为有效键值)
{
if(T)                                                                                                                                // 高电平为有效按键
{
return (m_gpio->IDR & m_pins);
}
else                                                                                                                                // 低电平为有效按键
{
return ((~m_gpio->IDR) & m_pins);
}
}
protected:
GPIO_TypeDef*        m_gpio;                                                                                                        // GPIO_TypeDef指针
int                                m_pins;                                                                                                        // 引脚

};
使用时,#include进来就行。
stm32f103vc 回答时间:2014-3-31 19:49:10

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

新思路,拓展 多谢
wuzhujian 回答时间:2014-4-1 12:45:31

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

用类封装功能,是面向对象的基本功。
C++是面向对象的,而C语言是面向过程的。
C++与C的比较,百度一下就行了。
wuzhujian 回答时间:2014-4-2 10:59:37

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

没人顶,自己顶。
wuzhujian 回答时间:2014-4-3 13:49:10

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

每天一顶。
wuzhujian 回答时间:2014-4-8 00:21:12

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

自己顶顶。
wuzhujian 回答时间:2014-4-10 00:19:58

RE:【MCU 实战经验】STM32F4: 用C++开发应用程序

每天一顶。
qianfan 回答时间:2015-4-14 19:45:53
之前我发的一个帖子,移植arduino的,就是用c++和c写的
123下一页
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版