简单来说,这些 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 闪烁功能,并且需要一个全局变量计数:
步骤:
-
找到 /* USER CODE BEGIN PV */,加入变量:
/* USER CODE BEGIN PV */ int led_toggle_count = 0; // 我加的代码 /* USER CODE END PV */ -
(你的代码截图中未显示,但在下面会有) 找到 main() 函数内部的 /* USER CODE BEGIN 3 */ (通常在 while(1) 里面):
codeCwhile (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 */ }
总结与警告
-
严禁修改标签本身:不要删除或修改 /* USER CODE BEGIN ... */ 这行注释本身,哪怕少一个空格,工具都可能识别不到,导致你的代码丢失。
-
对号入座:尽量按 C 语言规范放置代码(变量放 PV,头文件放 Includes),虽然你全写在一个区域里也能编译通过,但代码会很难看且难以维护。
-
如果代码被覆盖了:如果你不小心写在外面并重新生成了代码,去你的工程文件夹下的 Backup 目录(如果开启了备份)或者用 Git 版本控制找回。
2156

被折叠的 条评论
为什么被折叠?



