news 2026/6/23 18:07:02

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/6/19 1:58:42

26.MPSOC FPGA linux读AHT20传感器

一、vivado 工程搭建因为十分简单&#xff0c;不在赘述。生成平台文件&#xff0c;导出&#xff0c;建立vitis linux 设备树工程&#xff0c;不在赘述。生成的设备树文件&#xff1a;axi_iic_0: i2c80000000 {#address-cells <1>;#size-cells <0>;clock-names &…

作者头像 李华
网站建设 2026/6/23 13:28:36

嵌入式系统时序图完全指南:从原理到实战

嵌入式系统时序图完全指南&#xff1a;从原理到实战在嵌入式系统开发中&#xff0c;时序图是理解硬件交互的关键语言。本文将全面解析时序图的阅读、测量和应用技巧&#xff0c;帮助您掌握这一硬件工程师的核心技能。一、时序图基础&#xff1a;硬件通信的蓝本 1.1 时序图核心要…

作者头像 李华
网站建设 2026/6/23 0:47:58

小团队与大团队的管理差异

小团队与大团队在管理上的核心差异&#xff0c;根源于“复杂性”和“规模”两个维度。小团队&#xff08;如10人以下&#xff09;的管理依赖于“人治”和“默契”&#xff0c;追求的是极致的敏捷性、灵活性和高频的非正式沟通。 而 大团队&#xff08;如100人以上&#xff09;的…

作者头像 李华
网站建设 2026/6/22 9:02:16

[CISCN2019 华东南赛区]Web4

1.打开是一个欢迎界面 然后点击这个read something会跳转到这个页面 看到这个https://baidu.com&#xff0c;知道这里是可以 ssrf的&#xff0c;使用file看一下 发现触发了waf&#xff0c;使用其他的试一试&#xff0c;最后发现 直接加路径也能进行访问 还有一种方法就是使用lo…

作者头像 李华
网站建设 2026/6/23 17:22:17

内点法求最优潮流附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

作者头像 李华