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 版本控制找回。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值