STM32CubeMX生成main.c、main.h文件解读
main.c
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
/* 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 BEGIN
和USER CODE END
,如果用户要在自动生成的代码里添加自己的功能代码,应该插在这些注释的中间,这样STM32CubeMX
下次重新生成代码时,将保留这些代码。
参考链接
【HAL库&CubeMX】2-底层开发代码规范
STM32注释风格参考
https://blog.csdn.net/qq_25144391/article/details/105699616
自用STM32注释规范
STM32 HAL库入门指南