因为实在用不习惯Keil的界面,遂决定直接将项目迁移到CLion中。由于项目中含有mbed,所以迁移的过程中出现了不少问题,在此记录。
前期主要参考教程
CLion交叉编译的基本配置:配置CLion用于STM32开发【优雅の嵌入式开发】
mbed的迁移:Mbed在自己的stm32F103RCT6系列平台移植适配
但是在实际编译的过程中还是遇到不少问题,总结套路就是
- 遇到no such file or directory:
- 找到这个文件所在路径
- 再确定编译器链接指定路径
- 把文件移动到指定路径即可
- 编译有问题,特别是在删除了文件夹中文件后,记得清理缓存再重新编译
问题
-
error: unknown type name ‘TIM_HandleTypeDef’;
解决方法:
-
没有解除对TIM定时器的限制,进入
stm32l4xx_hal_conf.h
文件中,将一个宏定义解除注释#define HAL_TIM_MODULE_ENABLED
-
-
出现重复定义:CMakeFiles/SX1280_L476RG_DemoApp.elf.dir/Src/stm32l4xx_hal_msp.c.obj: in function
HAL_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
中重复定义的内容删除即可
- 将CLion自动生成的
-
<rt_sys.h>
:No such file or directory解决方法:
- 因为CLion链接的头文件路径是在
GNU-Tools-ARM-Embedded\arm-none-eabi\include
当中,没有这个文件,所以拷贝一份过去即可。
- 因为CLion链接的头文件路径是在
-
找不到C++标准库文件,报错。在CLion中是可以直接点击进入这个头文件的,但是编译器在编译时找不到这个文件。
问题分析:
- 搜索文件时发现文件路径是C++,因为这个项目中是C与Cpp文件混合,因此可能是编译器在处理时出现了问题。
解决方法:
- 修改最开始索引
mbed.h
的文件。我这里是main.c
,把main.c
改为main.cpp
,保证编译器使用的是g++
。
-
无法正确转换preinclude语句,导致这个函数没有被包含
解决方法:
-
报错的宏定义全部放在了
mbed_config.h
当中,而在CMakeList中没有preinclude,所以直接在编译选项中加上-include mbed_config.h
add_definitions(-include mbed_config.h)
-
-
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))
- 表明编译器无法识别
-
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"]
-