目的:引导初学者使用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++编写代码的代价就是:代码量增大