当前位置: 首页 > news >正文

STM32CubeMX的main.c开头介绍

简单来说,这些 USER CODE BEGIN 和 USER CODE END 包裹的区域是“代码保护区”

1. 这些区域是什么?为什么要这样设计?

STM32CubeMX 是一个图形化配置工具,它可以自动帮你生成底层驱动代码(如 GPIO 初始化、时钟配置等)。

  • 问题在于:当你修改了图形化配置(比如把 PA5 改成了 PA6)并再次点击 "Generate Code" 时,工具会重新生成整个文件。

  • 保护机制:工具在重新生成代码时,会保留USER CODE BEGIN 和 USER CODE END 之间的内容,而覆盖/删除这两个标签之外的所有内容。

核心规则:

你写的任何代码,必须、且只能写在 BEGIN 和 END 之间!
如果你把代码写在这些标签外面,下次生成代码时,你的心血就会被删掉。

2. 这些缩写是什么意思?(功能详解)

这些标签按 C 语言文件的标准结构排列,意思如下:

A. /* USER CODE BEGIN Includes */
  • 含义:头文件包含区。

  • 怎么加内容:如果你需要用 printf 或者你自己写的驱动(例如 oled.h),把 #include 写在这里。

    /* USER CODE BEGIN Includes */ #include <stdio.h> #include "oled.h" /* USER CODE END Includes */
B. /* USER CODE BEGIN PTD */ (Private Typedef)
  • 含义:私有类型定义。

  • 怎么加内容:如果你需要定义结构体(struct)或枚举(enum),写在这里。

    codeC
    /* USER CODE BEGIN PTD */ typedef struct { int x; int y; } Point; /* USER CODE END PTD */
C. /* USER CODE BEGIN PD */ (Private Define)
  • 含义:私有宏定义。

  • 怎么加内容:写 #define 宏常量。

    codeC
    /* USER CODE BEGIN PD */ #define SENSOR_ADDR 0xA0 /* USER CODE END PD */
D. /* USER CODE BEGIN PM */ (Private Macro)
  • 含义:私有宏函数。

  • 怎么加内容:一般用来写简单的宏计算,平时用得较少。

E. /* USER CODE BEGIN PV */ (Private Variables)(最常用)
  • 含义:私有全局变量。

  • 怎么加内容:你的全局变量(Global Variables)必须定义在这里。

    codeC
    /* USER CODE BEGIN PV */ uint8_t rx_buffer[10]; int count = 0; /* USER CODE END PV */
F. /* USER CODE BEGIN PFP */ (Private Function Prototypes)
  • 含义:私有函数声明。

  • 怎么加内容:如果你自己在文件底部写了子函数,需要把函数声明(原型)放在这里,防止编译警告。

    codeC
    /* USER CODE BEGIN PFP */ void My_LED_Blink(void); /* USER CODE END PFP */
G. /* USER CODE BEGIN 0 */
  • 含义:早期用户代码。

  • 怎么加内容:这块区域位于 main() 函数定义之前。通常用于某些极其特殊的、需要在进入 main 之前就处理的逻辑,或者用于存放函数的具体实现(有些人喜欢把函数体写在 main 前面,就可以写在这里)。大多数情况留空即可。


3. 如何操作?(举例)

假设你要做一个简单的 LED 闪烁功能,并且需要一个全局变量计数:

步骤:

  1. 找到/* USER CODE BEGIN PV */,加入变量:

    /* USER CODE BEGIN PV */ int led_toggle_count = 0; // 我加的代码 /* USER CODE END PV */
  2. (你的代码截图中未显示,但在下面会有) 找到main()函数内部的/* USER CODE BEGIN 3 */(通常在 while(1) 里面):

    codeC
    while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 我加的代码 led_toggle_count++; // 我加的代码 HAL_Delay(500); // 我加的代码 /* USER CODE END 3 */ }

总结与警告

  1. 严禁修改标签本身:不要删除或修改 /* USER CODE BEGIN ... */ 这行注释本身,哪怕少一个空格,工具都可能识别不到,导致你的代码丢失。

  2. 对号入座:尽量按 C 语言规范放置代码(变量放 PV,头文件放 Includes),虽然你全写在一个区域里也能编译通过,但代码会很难看且难以维护。

  3. 如果代码被覆盖了:如果你不小心写在外面并重新生成了代码,去你的工程文件夹下的 Backup 目录(如果开启了备份)或者用 Git 版本控制找回。

http://www.cnnetsun.cn/news/69944.html

相关文章:

  • 26.MPSOC FPGA linux读AHT20传感器
  • 嵌入式系统时序图完全指南:从原理到实战
  • 小团队与大团队的管理差异
  • [CISCN2019 华东南赛区]Web4
  • AI编程革命!Claude Skills大揭秘:小白也能快速上手的Agent开发神器,大模型开发者必看!
  • 内点法求最优潮流附matlab代码
  • 三相PWM整流器有限集模型预测电流控制附Simulink仿真模型
  • 光伏四可“可观”功能:光伏电站全景数字化的底层支撑技术
  • 如何用FLUX.1-dev镜像在本地部署下一代AI绘画模型?
  • 基于 Comsol 移动网格方法的激光熔池流动数值模拟
  • BLDC无刷直流电机Matlab仿真:转速电流双闭环控制及有感无感换相方式研究
  • [光学原理与应用-491]:水冷机、零气模块CDA、功率计等影响266皮秒紫外激光器的种子源1064nm功率稳定性结果的主要因素有哪些?
  • 昆仑通态MCGS与欧姆龙E5CC温控器通讯实战:PID模式及输出启停控制
  • 通达信〖逆势突破强牛〗指标公式 逆市环境中率先突破前期重要压力位 较强内在上涨动力
  • 基于扰动观测器的永磁同步电机(PMSM)模型预测控制(MPC)仿真探索
  • AEB联合仿真算法设计:Carsim2019.0+Matlab/Simulink2021a实现...
  • Java毕设选题推荐:基于springboot个人博客系统的设计与实现基于SpringBoot+Vue个人博客系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot停车场车位预约系统基于Java springboot停车场管理系统停车位预约【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Java毕设选题推荐:基于springboot的无人化、线上化、数据化海洋馆预约系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • Ascend C高级API应用:InitGlobalMemory与Pad操作的底层原理
  • Java毕设选题推荐:基于Java Web的新能源汽车信息咨询服务基于SpringBoot+Vue的新能源汽车信息咨询服务的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:OPA 集成指南:从原理到实践
  • Object.defineProperty和Proxy实现拦截的区别
  • 若依物联网
  • PSEN1抗体:如何揭示阿尔茨海默病致病机制与治疗新靶点?
  • Docker Engine 升级指南:保障容器安全的关键步骤
  • 基于zigbee灯光控制照明及色温调节系统的设计与实现(有完整资料)
  • 7、Python高级语法:描述器、属性与元编程实战
  • 【开题答辩全过程】以 基于java技术的校园一卡通系统的设计与实现为例,包含答辩的问题和答案
  • 11、Python 包与应用开发全解析