keil5使用c++编写stm32控制程序

本文介绍了在Keil5环境下使用C++编写STM32控制程序的步骤,包括配置工程、重定向std::cout串口输出以及实现串口中断服务函数。通过示例展示了如何点亮LED和通过串口通信实现数据交互。

一、前言

想着搞个新奇的玩意玩一玩来着,想用c++编写代码来控制stm32,结果在keil5中,把踩给我踩闷了,这里简单记录一下。注意一定要按照如下流程进行操作,一步都不要跟丢了。

二、配置图解

所需要的一些文件放在百度网盘了。
先把最新的库函数和CMSIS安装好。
我这里为了方便就直接安装在了keil5的文件夹路径里。
在这里插入图片描述

废话不多说,直接上图解。
在这里插入图片描述
记得把use microlib的勾选去掉。配置和我图片上一样就没问题。

在这里插入图片描述
那这样配置过后会不会就好用了?当然不是,还要使用最新的标准库函数才行。
如何配置以后方便移植勒?当然是这样操作啦。
这里用的是普中科技32f103zet6板子的案例教程。
如图,找到你工程目录下的CMSIS把之前老版本的删除掉。
在这里插入图片描述
注意自己找到你最新的CMSIS的安装路径。
再把你Keil_v5\ARM\Packs\ARM\CMSIS\5.9.0\CMSIS\Core\Include里边的文件全部复制过去。
在这里插入图片描述
在把Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Include里边的system_stm32f10x.hKeil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Source里边的system_stm32f10x.c复制出来。 然后再继续在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Source\ARM找到你对应单片机的后缀文件。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后你工程目录的CMSIS下边就应该是这些文件。
在这里插入图片描述
2.再把Libraries下的STM32F10x_StdPeriph_Driver里的inc和src文件替换为最新的固件库的。
安装的最新的固件库的文件位置在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\StdPeriph_Driver里。
在这里插入图片描述
3.替换user文件下的如下文件
在这里插入图片描述
找到文件路径在Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\StdPeriph_Driver\templates文件下
在这里插入图片描述
在找打之前的Keil_v5\ARM\Packs\Keil\STM32F1xx_DFP\2.4.0\Device\Include里的这个文件在这里插入图片描述
用这些把之前的文件替换掉就行。
在这里插入图片描述
接下来先把你工程中的一些c结尾文件按如下配置
在这里插入图片描述

就可以编译运行了,但是直接运行会报错。
在这里插入图片描述
建议先进入stm32f10x_conf.h文件中把
”#include "RTE_Components.h"注释掉,因为我们按照做模板的配置操作的,没有进入之前的动态环境中去配置东西,如果选择了如下配置的东西就会在你的工程文件下生成RTE的一个文件夹。如果你选择了这样操作的话就不会报这个错误。如果要配置的话记得把依赖勾选完整,如果依赖勾选正确会显示绿色,如果不正确会显示黄色,这里不在赘述,纯粹是为你满足你们的好奇心。

当然现在也可以不用管,因为后边会配置自定义的串口输出,会勾选一些配置,到时候他就会自动生成这个RTE_Components.h所需要的环境。
在这里插入图片描述
在这里插入图片描述

这下配置好了,浅浅的点个灯吧,点灯大师已经准备上线了,直接操作。

写个led.h

/*  LED时钟端口、引脚定义 */
#ifndef _led_H
#define _led_H

#include "system.h"

#define LED_PORT 			GPIOC   
#define LED_PIN 			(GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define LED_PORT_RCC		RCC_APB2Periph_GPIOC

//这里是stm32的管脚的按位操作。
#define led1 PCout(1)  	//D2指示灯连接的是PC1管脚
#define led2 PCout(2)  	//D2指示灯连接的是PC2管脚

#ifdef __cplusplus

class Led{
   
   
public:
    Led(){
   
   LED_GPIO_Config();}
    void LED_GPIO_Config(void);
    void TurnOn( u16 port, bool status);
    ~Led(){
   
   std::cout<<std::move("I am relased!")<<std::endl;};
private:
	
};

#endif

在写个led.cpp

#include "led.h"

void Led::LED_GPIO_Config()
{
   
   
	GPIO_InitTypeDef GPIO_InitStructure;//定义结构体变量
	
	RCC_APB2PeriphClockCmd(LED_PORT_RCC, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = LED_PIN;  //选择你要设置的IO口
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;	 //设置推挽输出模式
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	  //设置传输速率
	GPIO_Init(LED_PORT, &GPIO_InitStructure); 	   /* 初始化GPIO */
	
	GPIO_SetBits(LED_PORT, LED_PIN);   //将LED端口拉高,熄灭所有LED
	
}

void Led::TurnOn(u16 port, bool status)
{
   
   
  if(status){
   
   
	GPIO_ResetBits(LED_PORT, port);}  //将LED端口拉高,熄灭所有LED
  else{
   
   
    GPIO_SetBits(LED_PORT, port);}
}

再写个main.cpp

#include "system.h"

int main(void)
{
   
   
	SysTick_Init(72);
	std::shared_ptr<Led> led = std::make_shared<Led>();
	while(1
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值