stm32 C++开发初探

    听说stm32支持C++开发,就想尝试一下。好久没看过stm32了再重看一下。把keil 4卸了装了个keil MDK 5。装了MDK的时候记得把stm32用的pack装一下。

    工程建立:新建工程选择芯片,进入库文件选取界面。如下:

    stm32 C++开发初探_第1张图片

这里以使用简单GPIO为例说明一下库文件的选择。

勾选CMSIS中的core。Device中的Startup启动文件。然后开始勾选外设库,勾选时钟库RCC,GPIO库,然后一定勾选Framework,它是必要的什么标准外设库框架,其实它对应着misc.c也就是与中断优先级有关的库。不要单独去找misc,找不到的。如果不勾选它,其他对勾位置会呈黄色说明,勾选的库有问题。勾选没有问题的话对勾都会呈绿色。如下图:

stm32 C++开发初探_第2张图片

创建完之后没有main函数,右键SourceGroup1添加main.cpp在里面写上main函数编译一下。有可能一堆断言错:arrest_param什么的。这时候就点魔术棒C/C++中Define一栏中添加一个宏USE_STDPERIPH_DRIVER。如下图:

stm32 C++开发初探_第3张图片

然后在Debug中勾选你的调试方式我用的是J-link。我使用的开发板会有下不进去程序的情况。Error:Flash Download failed = "Cortex-M3".解决办法如下选择小魔术棒Utilities中的seting把ize从0x00080000改为0x00040000就行了。stm32 C++开发初探_第4张图片

然后就可以写C++程序了,我就写了一个Led闪烁的程序,比较简单。添加一个led.h文件。写一个类。

#ifndef _LED_H_
#define _LED_H_

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"

class Led{
	public:
		Led(){
			ledInit();
		};
		void led1On();
		void led1Off();
		void led2On();
		void led2Off();
		void ledDelay();
	private:
		void ledInit(void);
		GPIO_InitTypeDef GPIO_InitStruct;	
};

void Led::ledInit(void)
{
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG, ENABLE); 
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;	
	GPIO_Init(GPIOD, &GPIO_InitStruct);
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
	GPIO_Init(GPIOG, &GPIO_InitStruct);	
}

void Led::led1Off()
{
	GPIO_ResetBits(GPIOD, GPIO_Pin_13);	
}
void Led::led2Off()
{
	GPIO_ResetBits(GPIOG, GPIO_Pin_14);
}

void Led::led1On()
{
	GPIO_SetBits(GPIOD, GPIO_Pin_13);	
}

void Led::led2On()
{
	GPIO_SetBits(GPIOG, GPIO_Pin_14);
}

void Led::ledDelay()
{
	for(int32_t i=0xfffef; i>0; i--);
}

#endif

主函数文件main.cpp:

#include "stm32f10x.h"
#include "led.h"

int main()
{
	Led led;
	while(1)
	{
		led.led1On();
		led.led2On();
		led.ledDelay();
		led.led1Off();
		led.led2Off();
		led.ledDelay();
	}
}

编译下载就行了,功能简单就不在加注释了。

    stm32的GPIO有八种模式。每一个IO口都可以配置为中断模式。八种模式四种输入,四种输出分别如下:

typedef enum
{ GPIO_Mode_AIN = 0x0,//模拟输入
  GPIO_Mode_IN_FLOATING = 0x04,//浮空输入
  GPIO_Mode_IPD = 0x28,//弱下拉输入
  GPIO_Mode_IPU = 0x48,//弱上拉
  GPIO_Mode_Out_OD = 0x14,//开漏输出
  GPIO_Mode_Out_PP = 0x10,//推挽输出
  GPIO_Mode_AF_OD = 0x1C,//复用开漏输出
  GPIO_Mode_AF_PP = 0x18//复用推挽
}GPIOMode_TypeDef;

    用C++写stm32程序的感觉,用C和C++写都行,反正大多数人感觉就是C++更加的高大上,用C写还是用C++全看个人爱好了。没有必要非要用哪个。自己用着舒服就行了。

    keil工程链接

你可能感兴趣的:(stm32,C++开发)