RT-Thread论坛
直播中

大彭

11年用户 1133经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[问答]

cubemx生成的main.c报错怎么解决?

之前可以编译成功,但是开启软件i2c后编译报错。我使用git将工程还原后重新编译仍然报错,不知道是哪里出了问题,因为main.c文件我没有修改过。报错信息如下:

  • arm-none-eabi-gcc "../cubemx/Src/main.c"
  • arm-none-eabi-gcc "../cubemx/Src/STM32f1xx_hal_msp.c"
  • arm-none-eabi-gcc "../applications/key_embedded.c"
  • arm-none-eabi-gcc "../applications/led_embedded.c"
  • arm-none-eabi-gcc "../applications/main.c"
  • ../cubemx/Src/main.c:326:24: error: macro "Error_Handler" passed 1 arguments, but takes just 0
  • void Error_Handler(void)
  •                         ^
  • ../cubemx/Src/main.c:327:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
  • {
  • ^
  • make: *** [cubemx/Src/subdir.mk:21: cubemx/Src/main.o] Error 1
  • make: *** Waiting for unfinished jobs....
  • "make -j12 all" terminated with exit code 2. Build might be incomplete.


main.c报错部分如下:


  • /**
  •   * @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 */
  •   __disable_irq();
  •   while (1)
  •   {
  •   }
  •   /* USER CODE END Error_Handler_Debug */
  • }


截图如下:



回帖(1)

1653339509.516700

2025-10-11 16:09:55

我们注意到报错信息指出在main.c文件中的第326行有一个关于宏"Error_Handler"的错误。错误信息没有完整显示,但通常这种错误可能是由于宏定义问题或者函数定义问题导致的。

根据描述,问题是在开启软件I2C后出现的,并且即使用git还原工程后仍然报错。这很奇怪,因为还原后应该回到之前能编译的状态。这里可能的原因有:
1. 还原不彻底,可能有些文件没有被git跟踪,所以还原操作没有覆盖这些文件。
2. 编译环境发生了变化(比如编译器版本、配置等)。
3. 依赖项(如库文件)发生了变化。
4. 工程配置(如Makefile或IDE配置)被修改了。

由于报错信息中提到了多个文件的编译命令,包括:
   ../cubemx/Src/main.c
   ../cubemx/Src/stm32f1xx_hal_msp.c
   ../applications/key_embedded.c
   ../applications/led_embedded.c
   ../applications/main.c

这里有两个main.c文件,分别在cubemx/Src/和applications/目录下。这可能是问题的关键。通常,一个工程不应该有两个main.c文件,因为main函数只能有一个。

报错信息指向的是cubemx/Src/main.c的第326行。让我们看一下这个位置附近的代码(通常这个错误可能是由于缺少分号或者括号等语法错误,但这次是宏相关的错误)。

常见的错误情况:
1. 在调用宏时,可能缺少参数。
2. 宏定义本身有错误。

由于我们没有看到完整的错误信息,我猜测错误信息可能是:
   error: macro "Error_Handler" passed X arguments, but takes just 0
或者类似的信息。

在STM32 HAL库中,Error_Handler通常是一个无参数的宏,它可能被定义为:
   #define Error_Handler() _Error_Handler(__FILE__, __LINE__)
或者直接定义为:
   #define Error_Handler() while(1)

如果在代码中调用Error_Handler时带了参数,就会报错。

在main.c中,通常会出现这样的调用:
   if (HAL_Init() != HAL_OK) {
     Error_Handler();
   }

注意,这里是无参数的。

但是,如果我们在代码中错误地写成了:
   Error_Handler(参数);

那么就会报错。

但是您提到您没有修改过main.c,所以可能是CubeMX生成时就有问题?或者还原的版本可能有问题?

另外,请注意,您有两个main.c文件。在applications/main.c中可能也有一个main函数,这会和cubemx/Src/main.c中的main函数冲突,导致重复定义。但这里报的是编译错误,不是链接错误,所以先解决编译错误。

建议步骤:

1. 检查报错的main.c文件的第326行(以及附近)的代码,看看Error_Handler是如何被调用的。是否带有参数?如果是,去掉参数(除非宏定义允许参数)。
2. 确认Error_Handler的宏定义。它通常在main.c的开头被定义,或者在一个头文件中(比如stm32f1xx_hal_conf.h或者main.h中)。检查这个宏的定义,看它是否接受参数。
3. 如果确认代码没有问题,那么考虑是否是因为头文件包含顺序或者宏定义冲突导致的问题。比如,可能在某个地方重新定义了Error_Handler,或者包含了不同的头文件。

另外,由于您有两个main.c文件,请确认工程设置中是否应该包含两个main.c?通常,应用程序的代码应该放在不同的文件中,并且避免出现两个main函数。

如果确实有两个main函数,则需要删除其中一个。通常CubeMX生成的main.c是必须的,而applications/main.c可能是您自己添加的,那么需要将其重命名,并且不要包含main函数,或者重新组织代码结构。

由于还原后仍然报错,请检查:
   - 是否完全还原?使用git status查看是否有未提交的更改。
   - 清除编译产生的中间文件,重新编译(因为可能是旧的目标文件导致问题)。

操作步骤:
   1. 使用git status查看是否有未提交的修改,如果有,可以暂存或丢弃。
   2. 如果之前编译过,执行make clean(或者您使用的编译系统的清理命令)清除所有中间文件。
   3. 重新生成代码:如果使用CubeMX,确保已经重新生成了代码(虽然还原了,但可能生成步骤遗漏)。
   4. 再次编译。

如果问题依然存在,请提供更详细的错误信息(完整的错误信息)以及main.c文件第326行附近的代码(包括Error_Handler的调用和宏定义部分),这样我们可以更准确地判断问题。

要解决您遇到的编译错误,问题可能源于多个方面。以下是详细的排查步骤和解决方案:


错误原因分析




  1. Error_Handler 宏相关错误

    报错指向 main.c:326Error_Handler,常见原因:



    • 宏定义被意外修改(如添加了多余的参数)。

    • 头文件包含顺序冲突或重复定义。

    • 代码还原不彻底(Git 未跟踪的文件未恢复)。




  2. 两个 main.c 文件冲突

    您的工程包含两个 main.c



    • cubemx/Src/main.c(CubeMX 生成的主文件)

    • applications/main.c(用户自定义文件)

      这是核心问题:两个文件可能都定义了 main() 函数,导致重复定义。






解决方案


步骤 1:检查 Error_Handler 宏定义


cubemx/Src/main.c 中找到第 326 行附近的代码:


if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK) {
  Error_Handler(); // 检查此行是否有异常
}


  • 确保调用时没有参数:正确的调用应为 Error_Handler()(无参数)。

  • 检查宏定义位置:在 main.c 顶部或 main.h 中,宏应类似:
    #define Error_Handler() _Error_Handler(__FILE__, __LINE__)

    如果被修改为带参数的宏(如 Error_Handler(err)),删除参数或恢复原始定义。



步骤 2:解决两个 main.c 的冲突



  • 删除或重命名自定义文件

    applications/main.c 重命名为其他名称(如 app_main.c),并移除其 main() 函数。确保只有一个 main()cubemx/Src/main.c 中。

  • 调整工程配置

    在 IDE(Keil/IAR/Eclipse)中移除 applications/main.c 的编译参与,避免冲突。


步骤 3:彻底清理工程


Git 还原可能未覆盖编译缓存或 IDE 配置:



  1. 清除编译生成文件

    • 删除 Debug/Release/ 等编译输出目录。

    • 执行 Build > Clean Project(IDE 中的清理选项)。


  2. 重置 CubeMX 代码

    • 重新生成 CubeMX 代码:打开 .ioc 文件,点击 Generate Code


  3. 检查未被 Git 跟踪的文件

    • 执行 git status 查看未提交的变更(如 main.hstm32f1xx_hal_conf.h)。

    • git checkout -- 丢弃本地修改。



步骤 4:验证软件 I2C 配置


若问题在开启软件 I2C 后出现:



  1. 检查 I2C 初始化代码

    main.cMX_I2Cx_Init() 函数中,确认无语法错误。

  2. 查看 HAL 库配置

    确认 stm32f1xx_hal_conf.h 中已启用 I2C:
    #define HAL_I2C_MODULE_ENABLED // 确保取消注释


步骤 5:检查头文件包含


main.c 顶部检查是否有重复或冲突的头文件:


#include "main.h"
#include "i2c.h"
// 避免重复包含 STM32 库头文件



最终建议



  1. 精简代码结构

    保留 cubemx/Src/main.c 作为唯一入口,将自定义逻辑移到 applications/ 下的其他文件(如 app.c),切勿保留多个 main.c

  2. 备份后彻底重建

    • 备份自定义代码。

    • 用 CubeMX 重新生成工程。

    • 逐个添加自定义文件,确保每次编译通过。




若仍报错,请提供:



  1. main.c 第 326 行附近的完整代码。

  2. Error_Handler 的宏定义位置。

  3. git status 的输出(确认无未提交变更)。

    这将有助于进一步定位问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分