STM32CubeMX生成main.c、main.h文件解读

STM32CubeMX生成main.c、main.h文件解读

main.c

/* USER CODE BEGIN Header */
/* 用户代码开头 开始 */
/**
  ******************************************************************************
  * @file (文件)          : main.c
  * @brief(简介)          : Main program body
  ******************************************************************************
  * @attention(注意)
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * 本软件的许可条款见本软件组件根目录中的LICENSE文件
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  * 如果本软件未附带LICENSE文件 则按原样提供
  *
  ******************************************************************************
  */
/* 用户代码开头 结束 */
/* USER CODE END Header */
/* STM32CubeMX自动添加的头文件 */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"

/* 用户私有头文件 */
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* 添加用户头文件 */

/* 用户头文件结束 */
/* USER CODE END Includes */

/* 用户私有类型定义 */
/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
/* 添加用户变量类型 */

/* 用户变量类型结束 */
/* USER CODE END PTD */

/* 用户私有定义 */
/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* 添加用户私有定义 */

/* 用户私有定义结束 */
/* USER CODE END PD */

/* 用户宏定义 */
/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
/* 添加用户宏定义 */

/* 用户宏定义结束 */
/* USER CODE END PM */

/* 用户私有变量 */
/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
/* 添加用户定义的私有变量 */

/* 用户私有变量结束 */
/* USER CODE END PV */

/* STM32CubeMX自动生成私有函数原型(自动生成的私有函数类型说明) */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* 添加用户定义的私有函数类型说明 */

/* 用户定义的私有函数类型说明结束 */
/* USER CODE END PFP */

/* 用户私有代码(程序) */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* 用户程序开始0 */

/* 用户程序结束0 */
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */
  /* 用户程序开始1 */

  /* 用户程序结束1 */
  /* USER CODE END 1 */

  /* MCU配置 */
  /* MCU Configuration--------------------------------------------------------*/

  /* 复位所有外设、初始化闪存接口和Systick(系统堆栈初始化) */
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */
  /* 用户程序初始化开始 */

  /* 用户程序初始化结束 */
  /* USER CODE END Init */

  /* 配置系统时钟 */
  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* 用户系统的初始化开始 */

  /* 用户系统的初始化结束 */
  /* USER CODE END SysInit */

  /* 初始化所有已配置外设(对配置过的端口进行初始化) */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */
  /* 用户程序开始2 */

  /* 用户程序结束2 */
  /* USER CODE END 2 */

  /* 无限循环 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  /* 添加开始While循环前的用户程序 */
  while (1)
  {
    /* While循环 */
    /* USER CODE END WHILE */

    /* While循环 */
    /* USER CODE BEGIN 3 */
    /* 开始用户程序3 */
  }
  /* 结束用户程序3 */
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration(系统时钟配置)
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
   *  根据RCC_OscInitTypeDef结构中指定的参数初始化RCC振荡器
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
   *  初始化CPU、AHB、APB和时钟总线
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
/* 开始用户程序4 */

/* 结束用户程序4 */
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  *         发生错误时执行该函数
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* 用户代码开始 错误处理程序调试 */
  /* User can add his own implementation to report the HAL error return state */
  /* 用户可以添加自己的实现 以报告HAL错误的返回状态 */
  __disable_irq();
  while (1)
  {
  }
  /* 用户代码开始 错误处理程序调试 */
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  *         报告发生 assert_param 错误的源文件名称和源文件行号
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

main.h

/* C语言头文件模板 */
/* 定义 以防止头文件被递归包含(防止过定义) */
/* Define to prevent recursive inclusion -------------------------------------*/
/* ifndef == if not defined 用于检查__MAIN_H宏是否未定义 */
/* 确保头文件的内容只在第一次包含时被编译 */
#ifndef __MAIN_H
#define __MAIN_H

/* 保证在C++编译器中正确处理C代码 */
/* 预处理指令 检查是否在C++环境中编译 这用于确保C++代码可以包含C语言库文件 */
#ifdef __cplusplus
/* 如果在C++环境中 这行代码将确保C语言库的符号链接时按照C语言的规则进行的 而不是C++的名称修饰规则 */
extern "C" {
#endif

/* STM32CubeMX自动生成 包含STM32F1系列的HAL库头文件 */
/* Includes ------------------------------------------------------------------*/
#include "stm32f1xx_hal.h"

/* 用户私有头文件 */
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
/* 用户私有头文件开始 */

/* 用户私有头文件结束 */
/* USER CODE END Includes */

/* 定义会被其他源文件使用的类型 */
/* 在程序中被公开(或导出)并可供其他程序或模块使用的数据类型 */
/* Exported 输出、导出 */
/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* 常量定义区域 */
/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* 宏定义区域 */
/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* 声明会被其他源文件使用的函数 */
/* 函数原型 */
/* Exported functions prototypes ---------------------------------------------*/
/* */
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* 私有定义 */
/* Private defines -----------------------------------------------------------*/

/* USER CODE BEGIN Private defines */

/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

注释里包含USER CODE BEGINUSER CODE END,如果用户要在自动生成的代码里添加自己的功能代码,应该插在这些注释的中间,这样STM32CubeMX下次重新生成代码时,将保留这些代码。

参考链接

【HAL库&CubeMX】2-底层开发代码规范
STM32注释风格参考
https://blog.csdn.net/qq_25144391/article/details/105699616
自用STM32注释规范
STM32 HAL库入门指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/899433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot基于微信小程序的同城优惠软件的开发-计算机毕设 附源码24287

Springboot基于微信小程序的同城优惠软件的开发 摘要 随着互联网技术的发展,网络购物越来越受到大家的欢迎。电子商务这一概念大家都不在陌生。通过互联网进行的商品贸易范围越来越广泛,从经典的电子商品、到化妆品、书籍等,发展到小吃商品&a…

PCL学习——点云基础

点云基础 一、什么是三维点云二、获取三维点云的几种方式三、主要挑战四、什么是PCL 一、什么是三维点云 三维点云(3D Point Cloud)是一种用于表示三维空间中对象或场景的数据结构。在最基础的形式中,它是一个包含多个三维坐标点&#xff08…

SpringBoot民宿预定信息管理系统-计算机毕业设计源码89828

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2研究背景 1.3论文结构与章节安排 2 民宿预定信息管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分…

Pytest日志收集器配置

前言 在pytest框架中,日志记录(logging)是一个强大的功能,它允许我们在测试期间记录信息、警告、错误等,从而帮助调试和监控测试进度。 pytest与Python标准库中的logging模块完美集成,因此你可以很容易地在…

Spring源码解析(35)之Spring全体系源码流程图

一、前言 画了一个spring全体系的流程图,spring容器创建过程,spring生命周期过程,AOP过程,Spring事务执行过程。 二、Spring体系源码图

【1024程序员节】之C++系列完结篇:Web编程

文章目录 一、Web编程1. 使用C标准库和第三方库2. 使用CWeb框架3. 使用C与JavaScript的集成4. 数据库交互5. 部署和运维 二、CppCMS框架构建Web应用1. 安装 CppCMS:2. 创建项目目录和文件3. 编写源代码4. 编译和运行5. 访问 Web 应用 三、HTTP介绍1. 请求头部字段&a…

Vue项目的创建

安装Vue工具 Vue CLI Vue CLI Vue.js 开发的标准工具,Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统 npm install -g vue/cli安装之后,你就可以在命令行中访问 vue 命令。你可以通过简单运行 vue,看看是否展示出了一份所有可用命令的…

qt QApplication详解

一、概述 QApplication是Qt应用程序的基础类,负责设置和管理应用的环境。它的主要功能包括:初始化应用程序、管理事件循环、处理命令行参数、提供全局设置(如样式和调色板)以及创建和管理主窗口。通常在main函数中创建QApplicati…

Netty简单应用

1.服务端构建 接收客户端请求,打印请求消息;消息采用内置String作为编码与解码器;开启信息输入监听线程,发送消息至客户端; 1.1 服务端消息处理类 import io.netty.channel.Channel; import io.netty.channel.Chann…

React实现购物车功能

今日学习React的useReducer,实现了一个购物车功能 文章目录 目录 效果展示 逻辑代码 CSS代码 效果展示 逻辑代码 import {useReducer} from "react"; import ./index.css; import { message} from antd;export function ShoppingCount(){// 初始化购…

去哪儿旅行携手 HarmonyOS SDK | 告别繁琐,常用信息秒级填充

背景 去哪儿旅行作为行业内领先的一站式在线旅游平台,多年来在日益加剧的市场竞争中积极寻求创新,凭借其优质的服务深受消费者青睐。2024年,去哪儿旅行适配HarmonyOS NEXT版本, 升级用户服务体验。 当前,去哪儿旅行应…

HTML+JavaScript 贪吃蛇游戏实现与详解

在网页开发的领域中,利用 HTML 和 JavaScript 能够创造出各种引人入胜的互动游戏。其中,贪吃蛇作为一款经典之作,以其简单易玩的特性和紧张刺激的挑战,一直深受玩家的喜爱。本文将详细阐述如何运用 HTML 和 JavaScript 来打造一个…

OPPO携手比亚迪共同探索手机与汽车互融新时代

10月23日,OPPO与比亚迪宣布签订战略合作协议,双方将共同推进手机与汽车的互融合作,这一合作也标志着两大行业巨头在技术创新和产业融合上迈出了重要一步,为手机与汽车的深度融合探索新的可能。 OPPO创始人兼首席执行官陈明永、OP…

鸿蒙网络编程系列3-TCP客户端通讯示例

1. TCP简介 TCP协议是传输层最重要的协议,提供了可靠、有序的数据传输,是多个广泛使用的表示层协议的运行基础,相对于UDP来说,TCP需要经过三次握手后才能建立连接,建立连接后才能进行数据传输,所以效率差了…

【PDF文件】默认被某种软件打开,如何进行修改?

当有时下载某种软件后,电脑中的PDF文件就默认由该种软件打开,每次需要右键选择打开方式才能选择需要的其他软件打开。如下图所示。 修改方法: (1)点击电脑的“设置”,选择应用 (2)…

Java一站式校园社区外卖系统小程序源码

一站式校园社区外卖系统,让校园生活更便捷! 🏫 开篇:校园生活的“新宠儿” 嘿,小伙伴们!今天要和大家分享一个超级实用的校园生活神器——“一站式校园社区外卖系统”!在这个快节奏的时代&…

一个开源可私有化部署的没有任何广告的网易云

优点 ✅ 使用 Vue.js 全家桶开发🔴 网易云账号登录(扫码/手机/邮箱登录)📺 支持 MV 播放📃 支持歌词显示📻 支持私人 FM / 每日推荐歌曲🚫🤝 无任何社交功能🌎️ 海外用…

歌手如何建立抖音百科?塑造个人形象!

在抖音这个充满无限可能的舞台上,明星们以独特的魅力吸引着亿万粉丝的目光。而抖音百科,作为明星们展示自我、塑造形象的又一重要窗口,正逐渐成为连接明星与粉丝的桥梁。 创建明星人物抖音百科,不仅是对明星过往成就的总结与回顾&…

WRB Hidden Gap,WRB隐藏缺口,MetaTrader 免费公式!(指标教程)

WRB Hidden Gap MetaTrader 指标用于检测和标记宽范围的柱体(非常长的柱体)或宽范围的烛身(具有非常长实体的阴阳烛)。此指标可以识别WRB中的隐藏跳空,并区分显示已填补和未填补的隐藏跳空,方便用户一眼识别…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券,共有6种优惠券样式(参考了常见的优惠券),文本内容仅为示例,您可在此基础上调整为你想要的文本 预览效果 通过模拟数据,实现点击使用优惠券让其变为灰色的效果(模…