使用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

posted @ 2024-04-16 16:42  阴月无雨  阅读(716)  评论(0)    收藏  举报