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

【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个回答
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进来就行。
STM32F103-34799 回答时间: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++开发应用程序

每天一顶。
1234下一页

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版