使用C++进行STM32开发

传统的STM32开发,使用的是C语言。C++中的一些高级特性,如引用、面向对象等,可以极大地提高代码的可读性和易维护性。

前置条件

开发板:STM32F103C8T6
开发环境:vscode+EIDE插件
编译器:arm-none-eabi-gcc v15.2.0

开发环境的适用方法,可以参考这篇博客:vscode+edie插件配置STM32开发环境,彻底摆脱KEIL

使用方法

还是以上述博客中的项目模板为例:

只需要将 main.c 文件改名为 main.cpp,就可以在main中使用C++特性了。

比如实现一个简单的 class LED

class LED
{
public:LED(GPIO_TypeDef *port, uint16_t pin, bool polarity = false): port_(port), pin_(pin), polarity_(polarity), state_(false){}void on(){if (this->polarity_ == true) {GPIO_SetBits(this->port_, this->pin_);} else {GPIO_ResetBits(this->port_, this->pin_);}this->state_ = true;}void off(){if (this->polarity_ == true) {GPIO_ResetBits(this->port_, this->pin_);} else {GPIO_SetBits(this->port_, this->pin_);}this->state_ = false;}void toggle(){if (this->state_ == true) {this->off();} else {this->on();}}bool state() const{return this->state_;}private:GPIO_TypeDef *port_;uint16_t pin_;bool polarity_; // true-高电平点亮,false-低电平点亮bool state_; // 当前状态:true-点亮,false-灭
};

其余初始化代码不变,定义 LED led{GPIOC, GPIO_PIN_13} 然后将死循环中的反转电平改为调用 led.toggle() 即可。

完整的程序如下所示:

/** **************************************************              STM32 blink gcc demo**  CPU: STM32F103C8*  PIN: PA1** *************************************************/#include "stm32f10x.h"class LED;void delay(int x)
{for (int i = 0; i < x; i++) {for (int j = 0; j < 1000; j++)__NOP();}
}int main()
{GPIO_InitTypeDef gpioDef;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);gpioDef.GPIO_Mode  = GPIO_Mode_Out_PP;gpioDef.GPIO_Pin   = GPIO_Pin_13;gpioDef.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOC, &gpioDef);auto led = LED{GPIOC, GPIO_Pin_13};while (true) {led.toggle();delay(5000);}
}

烧录,可以看到开发板上的LED正常闪烁。

注意事项

中断函数特殊处理

由于C++存在符号修饰特性,因此当定义中断服务函数的时候,一定要显示添加 extern "C" 关键字,否则可能会导致中断异常:

extern "C" void TIM2_IRQHandler(){// your code here
}

一个一劳永逸的方法是,在 stm32f10x_it.h 文件中直接声明好所有的中断函数,ST官方已做好适配:

/********************************************************************************* @file    Project/STM32F10x_StdPeriph_Template/stm32f10x_it.h* @author  MCD Application Team* @version V3.6.0* @date    20-September-2021* @brief   This file contains the headers of the interrupt handlers.******************************************************************************* @attention** Copyright (c) 2011 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __STM32F10x_IT_H
#define __STM32F10x_IT_H#ifdef __cplusplus
extern "C" {
#endif/* Includes ------------------------------------------------------------------*/
#include "stm32f10x.h"/* Exported types ------------------------------------------------------------*/
/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/
/* Exported functions ------------------------------------------------------- *//* System exception handlers */
void NMI_Handler(void);
void HardFault_Handler(void);
void MemManage_Handler(void);
void BusFault_Handler(void);
void UsageFault_Handler(void);
void SVC_Handler(void);
void DebugMon_Handler(void);
void PendSV_Handler(void);
void SysTick_Handler(void);
/* Peripheral interrupt handlers */
void WWDG_IRQHandler(void);
void PVD_IRQHandler(void);
void TAMPER_IRQHandler(void);
void RTC_IRQHandler(void);
void FLASH_IRQHandler(void);
void RCC_IRQHandler(void);
void EXTI0_IRQHandler(void);
void EXTI1_IRQHandler(void);
void EXTI2_IRQHandler(void);
void EXTI3_IRQHandler(void);
void EXTI4_IRQHandler(void);
void DMA1_Channel1_IRQHandler(void);
void DMA1_Channel2_IRQHandler(void);
void DMA1_Channel3_IRQHandler(void);
void DMA1_Channel4_IRQHandler(void);
void DMA1_Channel5_IRQHandler(void);
void DMA1_Channel6_IRQHandler(void);
void DMA1_Channel7_IRQHandler(void);
void ADC1_2_IRQHandler(void);
void USB_HP_CAN1_TX_IRQHandler(void);
void USB_LP_CAN1_RX0_IRQHandler(void);
void CAN1_RX1_IRQHandler(void);
void CAN1_SCE_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void TIM1_BRK_IRQHandler(void);
void TIM1_UP_IRQHandler(void);
void TIM1_TRG_COM_IRQHandler(void);
void TIM1_CC_IRQHandler(void);
void TIM2_IRQHandler(void);
void TIM3_IRQHandler(void);
void TIM4_IRQHandler(void);
void I2C1_EV_IRQHandler(void);
void I2C1_ER_IRQHandler(void);
void I2C2_EV_IRQHandler(void);
void I2C2_ER_IRQHandler(void);
void SPI1_IRQHandler(void);
void SPI2_IRQHandler(void);
void USART1_IRQHandler(void);
void USART2_IRQHandler(void);
void USART3_IRQHandler(void);
void EXTI15_10_IRQHandler(void);
void RTC_Alarm_IRQHandler(void);
void USBWakeUp_IRQHandler(void);#ifdef __cplusplus
}
#endif#endif /* __STM32F10x_IT_H */

当有 .cpp 文件中需要定义中断服务函数的时候,直接 #include "stm32f10x_it.h" 即可。

STL 适用建议

正常情况下,STL中的各种容器和算法可以正常使用,如 vector <algorithm> 等。但是由于嵌入式环境中内存资源有限,缺少内存管理器,所以 尽量避免使用 vector string 等涉及到动态内存分配的容器,而· array 等不涉及动态内存分配的静态容器可以正常使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1170411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南京GEO优化系统怎么联系

南京GEO优化系统怎么联系&#xff1f;这里有你想要的答案在数字化营销时代&#xff0c;GEO优化系统成为众多企业提升品牌曝光、增加流量的有力工具。不少人在寻找南京的GEO优化系统&#xff0c;其中大麦GEO优化系统备受关注&#xff0c;下面就为你详细介绍并告诉你如何联系。大…

Java毕设项目推荐-基于 Web Service 技术的警务数据交互平台设计与实现【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

通信原理篇---FSK/MSK和MPSK/QAM

我会用“高速公路运输系统”的比喻&#xff0c;为你清晰地解释这场“调制制式之争”。核心矛盾&#xff1a;频谱效率 vs. 抗干扰能力无线通信就像在一条极其拥挤的无线电波“高速公路”上运输数据。我们有两个核心追求&#xff1a;频谱效率&#xff1a; 在单位带宽&#xff08;…

Java毕设项目推荐-基于SpringBoot的校园设备维护报修系统基于springboot的高校教室设备故障报修信息管理系统【附源码+文档,调试定制服务】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

通信原理篇---多进制调制

我用一个“调制方式家族大比武”的比喻&#xff0c;为你一次讲清这五大数字调制技术的核心原理和特点。想象我们要用不同的方式&#xff0c;把一串0和1的“数字货物”装载到“载波卡车”上运走。一、MASK&#xff1a;多进制振幅键控&#xff08;“用音量大小说话”&#xff09;…

计算机Java毕设实战-基于springboot的高校教室设备故障报修信息管理系统校园报修维修系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

通信原理篇---数字基带信号PSD

我来为你讲解数字基带信号的功率谱密度。这是理解信号带宽和系统设计的核心概念。我们会用“能量分布地图”的比喻&#xff0c;让你直观掌握PSD的精髓。核心问题&#xff1a;信号的能量在哪里&#xff1f;想象你要分析一条繁忙高速公路上的车流能量。你可以数每天有多少辆车&am…

【课程设计/毕业设计】基于springboot框架的大学生体测管理系统基于SpringBoot的大学生体测数据管理系统【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

通信原理篇---白噪声与滤波器

核心模型&#xff1a;白噪声与滤波器首先&#xff0c;我们有一个无处不在的“背景噪音”——高斯白噪声。“白”&#xff1a; 像白光一样&#xff0c;在所有频率上功率谱密度均匀分布。记作 N0/2N0​/2&#xff08;瓦/赫兹&#xff09;。“高斯”&#xff1a; 在任意时刻&#…

通信原理篇---MSK

我来为你介绍MSK&#xff08;最小频移键控&#xff09;。它是数字调制中的一位“优雅的舞者”&#xff0c;以恒包络和相位连续而著称。让我们用最直观的方式来理解它。1. 核心目标&#xff1a;解决什么问题&#xff1f;想象之前的数字频率调制&#xff08;FSK&#xff09;&…

Java计算机毕设之基于Java+SpringBoot的高校教室设备故障报修信息管理系统基于springboot的高校教室设备故障报修信息管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

智能对话引擎接口性能优化:AI架构师的HTTP_GRPC协议选型与序列化方案对比

智能对话引擎接口性能优化&#xff1a;AI架构师的HTTP/GRPC协议选型与序列化方案对比 引言&#xff1a;为什么接口性能是智能对话的“生命线”&#xff1f; 想象一个场景&#xff1a;用户在手机上向智能助手发送“帮我订明天去上海的机票”&#xff0c;等待2秒后才收到回复——…

服务器安全:防火墙深度配置指南

在互联网环境下&#xff0c;任何一台拥有公网 IP 的服务器都时刻处于扫描器的监视之下。如果不进行任何限制&#xff0c;服务器的每一个端口都相当于一扇向黑客敞开的门。防火墙&#xff08;Firewall&#xff09; 作为操作系统内核与外部网络之间的过滤层&#xff0c;其核心任务…

Java毕设项目:基于springboot的高校教室设备故障报修信息管理系统(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

Jmeter常用的断言

断言相当于检查点&#xff0c;它是用来判断系统返回的响应结果是否正确&#xff0c;以此帮我们判断测试是否通过。 常用的断言&#xff1a;响应断言、JSON断言、断言持续时间、XPath断言、BeanShell 断言一、响应断言1. 响应断言是最常用的一种断言方法&#xff0c;它可以对各种…

大盘风险控制策略分析报告 - 2026年01月16日 - 23:52:49

大盘风险控制策略分析报告 - 2026年01月16日body { font-family: "Microsoft YaHei", "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; line-height: 1.6; color: rgba(51, 51, 51, 1); max-wi…

【毕业设计】基于springboot的高校教室设备故障报修信息管理系统(源码+文档+远程调试,全bao定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

【课程设计/毕业设计】基于 Web Service 技术的警务数据交互平台设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

大模型训练_week3_day15_Llama概念_《穷途末路》

目录前言碎碎念&#xff1a;我翻山越岭&#xff0c;纵然这世间再也无人像你梳理llama架构&#xff0c;和transformer很像&#xff0c;新学到 embedding后的词向量RMSnorm&#xff0c;和qk矩阵融合的Rope旋转编码&#xff0c;SwiGLU激活函数&#xff0c;GQA分组查询注意力机制ll…

汇川中型PLC(AM、AC系列,CODESYS平台)高速采集(2ms)的一个方案

一、案例介绍高速数据采集要保证速度,也要保证时刻的准确性。在windows系统里,时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息,则可以由PLC来保证采样周期的稳定性。从V2.12版本开始,PLC-Recorder软件…