news 2026/2/23 5:56:01

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/2/21 22:51:12

STL deque 的详细特征

STL deque 的详细特征 基本特性 #include <deque> using namespace std;deque<int> dq; // 声明一个int类型的双端队列 双端队列&#xff1a;允许在两端进行高效插入和删除动态数组&#xff1a;支持随机访问&#xff0c;可以像数组一样通过下标访问内存结构&a…

作者头像 李华
网站建设 2026/2/18 21:11:20

9.快速修改铜皮

铺铜后&#xff0c;需要进行细微调整。常规的方法使用鼠标拉扯铜皮边缘修改&#xff0c;很痛苦&#xff01;&#xff01;&#xff01;且效率非常低。技巧&#xff1a;1.选中要修改的铜皮2.如图所示&#xff1a;先选中modify&#xff0c;然后修改&#xff0c;然后重新铺铜。注意…

作者头像 李华
网站建设 2026/2/19 17:32:58

10.是否要成为全栈工程师?

1、软件工程师 嵌入式软件工程师 硬件工程师的关系一、各自的核心工作1. 软件工程师&#xff08;通常指“纯软件/应用层工程师”&#xff09;工作内容&#xff1a;负责非硬件相关的软件逻辑&#xff0c;比如&#xff1a;业务功能开发&#xff08;如APP界面、数据处理算法、网络…

作者头像 李华
网站建设 2026/2/10 14:10:01

兰顿蚂蚁——CAD二次开发

效果如下:private static void OnTick(object sender, EventArgs e){if (_currentStep > _maxSteps){Stop();return;}// 检查是否暂停if (_isPaused)return;Document doc Application.DocumentManager.MdiActiveDocument;Database db doc.Database;var ed doc.Editor;usi…

作者头像 李华
网站建设 2026/2/22 6:51:43

进程优先级和切换

第一部分&#xff1a;进程优先级 (Process Priority&#xff09;系统中的进程成百上千&#xff0c;但 CPU&#xff08;核&#xff09;可能只有几个。谁先用 CPU&#xff1f;这就涉及到竞争性。为了合理分配资源&#xff0c;必须要有优先级 。1. PRI 与 NI&#xff1a;一对“相爱…

作者头像 李华