使用C++做嵌入式开发
使用C++做嵌入式开发(1)-环境配置
环境版本:
1.开发板: 安富莱-v6
2.主控芯片:STM32F429BIT6
3.Keil-MDK为5.30版本
4.CMSIS为5.6.0版本
5.HAL库版本 V1.24.0
1.下载Keil-MDK
https://armkeil.blob.core.windows.net/eval/MDK530.EXE
下载Keil-MDK5.30并安装,创建基础例程:
2.更改编译器设置为AC6
由于AC5不支持C++的编译,需要将编译器设置为AC6.将USE MicroLIB去掉


更改完成后进行编译,如果版本正确的话应该无编译错误。

3.将main.c文件替换
将main.c文件替换为main.cpp文件:将原来main文件的拓展名更改为cpp,并重新加入工程


4.在C++文件中调用C文件
其实STM32的库文件已经做了对C++的兼容支持,每个H文件在开头和结尾都有:
#ifdef __cplusplus
extern "C" {
#endif
/**中间代码**/
#ifdef __cplusplus
}
#endif
这样的预编译定义,extern "C"的作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言(而不是C++)的方式进行编译。
除去STM32的库文件之外,我们要在自己原来代码H文件的头尾加入上述的预编译定义:如我在bsp.h中加入预编译定义:


到此环境配置完毕,可以愉快的使用C++面向对象的方法编程啦。
5.C++类操作GPIO
我们在main.cpp中定义一个LED类:
class LEDClass
{
private://私有属性
GPIO_TypeDef* gpio;
uint16_t pin;
public:
LEDClass(GPIO_TypeDef* gpio_x,uint16_t pin_x) // Constructor构造函数
{
gpio = gpio_x;
pin = pin_x;
}
void init(void)//LED初始化
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(gpio, &GPIO_InitStruct);
}
void open(void)//LED开
{
HAL_GPIO_WritePin(gpio,pin,GPIO_PIN_RESET);
}
void close(void)//LED关方法
{
HAL_GPIO_WritePin(gpio,pin,GPIO_PIN_SET);
}
void toggle(void) //LED反转方法
{
HAL_GPIO_TogglePin(gpio,pin);
}
};
接着在main函数中实例化一个LED,并进行初始化:
__HAL_RCC_GPIOC_CLK_ENABLE();
LEDClass LED_1(GPIOC,GPIO_PIN_13);
LED_1.init();
在while循环中每500ms翻转一次LED:
while (1)
{
bsp_Idle();
//每500ms进来一次
if (bsp_CheckTimer(0))
{
LED_1.toggle();
}
}
效果如下

完整工程链接:
链接:https://pan.baidu.com/s/1mxA5zwj0njGn14_gDMS0Lw?pwd=5kxw
提取码:5kxw
浙公网安备 33010602011771号