C++点亮stm32LED灯

目的:引导初学者使用C++对STM32进行编程

1:在C语言中我们没有封装、继承、多态的概念,没有面向对象的程序思想。这些思想一般是源于C++语言的,C语言是面向过程的语言,C++是面向对象的编程语言。

但是在单片机开发中,我们是离不开面向对象的程序思想,如果你没有遇到过或者使用过,那么你的代码框架并不是特别的完美

以简单的LED为例子

LED状态结构体:

typedef struct
{
  uint8_t  Mode;                  //模式

  uint8_t  Status;                //当前状态
  uint16_t OffTimes;              //灭时间
  uint16_t OnTimes;               //亮时间(ms)
  uint16_t Counter;               //计数(计时)

  void (*OffFun)(void);           //灭函数接口
  void (*OnFun)(void);            //亮函数接口
}SL_TypeDef;

可以继续拓展或者删除参数

不仅仅是LED,还有其他外设:按键、显示屏 

2:基于Keil、STM32,用C++编写流水灯程序

在Keil MDK环境下,使用的是ARM编译器(Arm Compiler),V5和V6版本都是支持C++编程语言的。

 V5基础上

修改文件的属性-为C++和C文件,分别加入了class,在C++的设置中并没有报错,而在C文件属性下就报错了

V6基础上 

 

ST的开发库都已经做了支持,你会看到这么一段代码:

ST的开发库都已经做了支持,你会看到这么一段代码:

#ifdef __cplusplus
 extern "C" {
#endif

//这里C源代码

#ifdef __cplusplus
}
#endif


什么意思呢?

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

使用C++点亮LED--PA8和PD2

 只需要将文件的类型配置为C++即可,使用的是V5版本

#include "stm32f10x.h"                 

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_ResetBits(GPIOx, GPIO_Pin);
  }

  void Close(void){
    GPIO_SetBits(GPIOx, GPIO_Pin);
  }
};


int main(void)
{
  LED_Class LED1(GPIOD, GPIO_Pin_2, RCC_APB2Periph_GPIOD);
  LED_Class LED2(GPIOA, GPIO_Pin_8, RCC_APB2Periph_GPIOA);

  LED1.Init();
  LED2.Init();

  while(1)
  {
    LED1.Open();
    LED2.Open();
    

  }
}

使用C++编写代码的代价就是:代码量增大 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值