news 2026/3/10 2:40:56

STM32CubeMX的main.c开头介绍

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 版本控制找回。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/5 11:13:49

Informed RRT*实现椭圆启发式采样

我来为您添加Informed RRT*功能&#xff0c;在找到第一条路径后使用椭圆采样来加速收敛。以下是需要新增的函数和修改&#xff1a; 以下代码只含新增的部分 class RRTStar { private:// 在私有成员变量中添加bool pathFound;double bestPathCost;std::shared_ptr<Node> g…

作者头像 李华
网站建设 2026/3/5 3:22:11

27.MPSOC FPGA 驱动PCF8574

上一篇记录了AHT20,本篇记录下PCF8574&#xff0c;原理类似&#xff1a;#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/ioctl.h> #include <linux/i2c-dev.h> #include <errno.h> …

作者头像 李华
网站建设 2026/3/5 2:29:46

通信系统仿真:数字调制与解调技术_(28).Simulink通信系统仿真

Simulink通信系统仿真 1. Simulink概述 1.1 Simulink简介 Simulink是MATLAB的一个附加产品&#xff0c;主要用于动态系统建模、仿真和分析。Simulink提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;使用户可以通过拖放操作来构建复杂的系统模型。在通信系统仿真…

作者头像 李华
网站建设 2026/3/8 14:41:16

论文AIGC率太高?5个超实用降AI工具分享,AI率降低80%以上

最近身边好多同学都在为论文的AI率头疼。明明自己认真改过好几遍了&#xff0c;查重系统还是显示AIGC率爆表&#xff0c;导师那关根本过不去。现在用AI工具辅助确实提升了效率&#xff0c;但怎么让内容更“人性化”&#xff0c;避免被系统标红&#xff0c;这才是关键。 我自己试…

作者头像 李华
网站建设 2026/3/4 23:24:04

团队合并与拆分的判断标准

团队合并与拆分的判断标准&#xff0c;核心是服务于组织的战略目标、效率和敏捷性。合并的判断标准主要基于“协同增效”和“规模效益”&#xff0c;当多个团队目标高度一致、资源重叠或需要集中力量办大事&#xff08;如攻坚核心项目&#xff09;时&#xff0c;应考虑合并。 而…

作者头像 李华