将Keil项目迁移至Clion

将Keil项目迁移至Clion目录


因为实在用不习惯Keil的界面,遂决定直接将项目迁移到CLion中。由于项目中含有mbed,所以迁移的过程中出现了不少问题,在此记录。

前期主要参考教程

CLion交叉编译的基本配置:配置CLion用于STM32开发【优雅の嵌入式开发】
mbed的迁移:Mbed在自己的stm32F103RCT6系列平台移植适配

但是在实际编译的过程中还是遇到不少问题,总结套路就是

  1. 遇到no such file or directory:
    • 找到这个文件所在路径
    • 再确定编译器链接指定路径
    • 把文件移动到指定路径即可
  2. 编译有问题,特别是在删除了文件夹中文件后,记得清理缓存再重新编译

问题

  1. error: unknown type name ‘TIM_HandleTypeDef’;

    解决方法:

    • 没有解除对TIM定时器的限制,进入stm32l4xx_hal_conf.h文件中,将一个宏定义解除注释

      #define HAL_TIM_MODULE_ENABLED
      
  2. 出现重复定义:CMakeFiles/SX1280_L476RG_DemoApp.elf.dir/Src/stm32l4xx_hal_msp.c.obj: in functionHAL_MspInit': D:\Project\embedded\Demo\SX1280_L476RG_DemoApp\Src/stm32l4xx_hal_msp.c:64: multiple definition of \HAL_MspInit’; CMakeFiles/SX1280_L476RG_DemoApp.elf.dir/Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_msp_template.c.obj

    解决方法

    • 将CLion自动生成的Src/stm32l4xx_hal_msp.c中重复定义的内容删除即可
  3. <rt_sys.h>:No such file or directory

    解决方法:

    • 因为CLion链接的头文件路径是在GNU-Tools-ARM-Embedded\arm-none-eabi\include当中,没有这个文件,所以拷贝一份过去即可。
  4. 找不到C++标准库文件,报错。在CLion中是可以直接点击进入这个头文件的,但是编译器在编译时找不到这个文件。

    问题分析:

    • 搜索文件时发现文件路径是C++,因为这个项目中是C与Cpp文件混合,因此可能是编译器在处理时出现了问题。

    解决方法:

    • 修改最开始索引mbed.h的文件。我这里是main.c,把main.c改为main.cpp,保证编译器使用的是g++
  5. 无法正确转换preinclude语句,导致这个函数没有被包含

    解决方法:

    • 报错的宏定义全部放在了mbed_config.h当中,而在CMakeList中没有preinclude,所以直接在编译选项中加上-include mbed_config.h

      add_definitions(-include mbed_config.h)
      
  6. error: expected ‘;’ before ‘void’

    154 | __WEAK void hal_deepsleep(void)

    问题分析:

    • 表明编译器无法识别 __WEAK 作为有效的语法,导致它期待在 void 之前有一个分号。这通常是因为编译器不理解 __WEAK 属性的定义。

    解决方法:

    • 和编译器有关,我使用的是 GCC for ARM (gcc-arm-none-eabi) 作为交叉编译器。全局搜索发现没有#define __WEAK attribute((weak))这样的语句,只在stm32l4xx_hal_def.h文件中类似的

      #if defined ( __GNUC__ ) && !defined (__CC_ARM) /* GNU Compiler */
        #ifndef __weak
          #define __weak   __attribute__((weak))
        #endif /* __weak */
        #ifndef __packed
          #define __packed __attribute__((__packed__))
        #endif /* __packed */
      #endif /* __GNUC__ */
      

      因此选择在这个文件中加上定义#define __WEAK attribute((weak))

  7. error: #error “Device has v7m MPU but it is not enabled. Add ‘MPU’ to device_has in targets.json”

    25 | #error “Device has v7m MPU but it is not enabled. Add ‘MPU’ to device_has in targets.json”

    解决方法:

    • 找到targets.json文件,并且通过搜索找到目标设备配置部分。比如我的设备为STM32L476,那就直接搜索,出现以下片段,然后在device_has属性后加上MPU即可。

      "NUCLEO_L476RG": {
              "supported_form_factors": ["ARDUINO", "MORPHO"],
              "core": "Cortex-M4F",
              "default_toolchain": "ARM",
              "extra_labels": ["STM", "STM32L4", "STM32L476RG"],
              "supported_toolchains": ["ARM", "uARM", "IAR", "GCC_ARM"],
              "inherits": ["Target"],
              "progen": {"target": "nucleo-l476rg"},
              "detect_code": ["0765"],
              "device_has": ["ANALOGIN", "ANALOGOUT", "CAN", "I2C", "I2CSLAVE", "INTERRUPTIN", "LOWPOWERTIMER", "PORTIN", "PORTINOUT", "PORTOUT", "PWMOUT", "RTC", "SERIAL", "SERIAL_ASYNCH", "SERIAL_FC", "SLEEP", "SPI", "SPISLAVE", "STDIO_MESSAGES", "MPU"],
              "release_versions": ["2", "5"]
      

  • 48
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 要将Keil工程迁移到STM32CubeMx,可以按照以下步骤进行操作。首先,新建一个工程文件夹,并将STM32CubeIDE的工作空间中的空白工程文件全部复制到该文件夹中。工作空间的地址可以在STM32CubeIDE中找到。\[1\]然后,删除旧工程中的"system_stm32f4xx.c"文件。接下来,在STM32CubeMx中重新生成代码,这将自动生成一个新的同名文件,这样就成功将工程迁移到新版本中了。请注意,只能从低版本迁移到高版本,不建议从高版本迁移到低版本,因为高版本向下兼容的常识是不可行的。\[2\]在迁移过程中,可能会遇到一些兼容性问题和错误。这是因为STM32CubeMx的版本更新非常快,所以建议在更新版本后,使用新版本打开旧工程时要注意这些问题。\[3\] #### 引用[.reference_title] - *1* [STM32项目Keil MDK迁移至STM32CubeIDE(不含LWIP和FreeRTOS)](https://blog.csdn.net/wujunfeng200808/article/details/128119979)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [STM32CubeMx在不同版本的工程迁移时生成的代码编译出错各种multiply defined](https://blog.csdn.net/wu10188/article/details/89692407)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值