rt-studio+clion+cubemx联合使用(使用scons进行整合)

前言

以前在clion中使用rt-thread的方式

1. 使用的cubemx生成的方式: 这种方式只能使用rt-thread的内核版本
2. 自己去把rt-thread的源码拷贝到对应的工程中,再编写对应的CMakelists文件进行管理

思考

  1. 我的想法是通过rt-studio创建项目,然后通过工具转成cmakel编译的工具,然后根据官方提供的工具env来实现这个功能

概述

  1. 本次是最初的构建方案,可能在一些方面做的不是很好,后面学会了更好的解决方案再来处理.
  2. 本次是需要编写一些SConscript脚本文件(这里是参考rt-thread的官方源码进行的)
  3. 本次是使用的是stm32f407zgt6为硬件环境
  4. 本次使用的版本为rt-thread 5.0.2

使用RT-Studio创建一个项目文件

项目创建

在这里插入图片描述

处理报错问题

v

测试项目程序

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

Env的配置(参考官网,这里不做说明)

使用Env生成cmake构建工具

在这里插入图片描述
在这里插入图片描述

scons --target=cmake

在这里插入图片描述

使用Clion打开

在这里插入图片描述

修改py脚本文件

原始的脚本文件

在这里插入图片描述

这里我们直接去rt-thread源码找一个f4的参考源码文件进行修改

在这里插入图片描述
在这里插入图片描述

修改后的py脚本文件

import os

# toolchains options
ARCH = 'arm'
CPU = 'cortex-m4'
CROSS_TOOL = 'gcc'

# cross_tool provides the cross compiler
# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR
PLATFORM = 'gcc'
EXEC_PATH = ''

if os.getenv('RTT_EXEC_PATH'):
    EXEC_PATH = os.getenv('RTT_EXEC_PATH')

BUILD = 'debug'
PLATFORM = 'gcc'
if PLATFORM == 'gcc':
    # toolchains
    PREFIX = 'arm-none-eabi-'
    CC = PREFIX + 'gcc'
    AS = PREFIX + 'gcc'
    AR = PREFIX + 'ar'
    CXX = PREFIX + 'g++'
    LINK = PREFIX + 'gcc'
    TARGET_EXT = 'elf'
    SIZE = PREFIX + 'size'
    OBJDUMP = PREFIX + 'objdump'
    OBJCPY = PREFIX + 'objcopy'

    DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections'
    CFLAGS = DEVICE + ' -Dgcc'
    AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb '
    LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,Reset_Handler -T linkscripts/STM32F407ZG/link.lds'

    CPATH = ''
    LPATH = ''

    if BUILD == 'debug':
        CFLAGS += ' -O0 -gdwarf-2 -g'
        AFLAGS += ' -gdwarf-2'
    else:
        CFLAGS += ' -O2'

    CXXFLAGS = CFLAGS

    POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'

在Env控制台,再次执行生成命令

scons --target=cmake

在这里插入图片描述
在这里插入图片描述

构建项目

在这里插入图片描述

创建SConscript文件来管理HAL库相关文件

在这里插入图片描述

内容填写(这里我们依然可以参考rt-thread源码提供的)

在这里插入图片描述
在这里插入图片描述

完整配置内容

import rtconfig
from building import *

# get current directory
cwd = GetCurrentDir()

# The set of source files associated with this SConscript file.

src = Split('''
CMSIS/Device/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cec.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_crc.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cryp_ex.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pwr_ex.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rng.c
STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c
''')

if GetDepend(['RT_USING_SERIAL']) or GetDepend(['RT_USING_NANO', 'RT_USING_CONSOLE']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_usart.c']

if GetDepend(['RT_USING_I2C']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2c_ex.c']

if GetDepend(['RT_USING_SPI']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_spi.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_qspi.c']

if GetDepend(['RT_USING_USB']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pccard.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_pcd_ex.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_hcd.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_usb.c']

if GetDepend(['RT_USING_CAN']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_can.c']

if GetDepend(['RT_USING_HWTIMER']) or GetDepend(['RT_USING_PWM']) or GetDepend(['RT_USING_PULSE_ENCODER']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim_ex.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_lptim.c']

if GetDepend(['BSP_USING_ETH']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_eth.c']

if GetDepend(['RT_USING_ADC']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c']

if GetDepend(['RT_USING_DAC']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c']

if GetDepend(['RT_USING_RTC']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rtc_ex.c']

if GetDepend(['RT_USING_WDT']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_iwdg.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_wwdg.c']

if GetDepend(['RT_USING_SDIO']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_sdmmc.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sd.c']

if GetDepend(['RT_USING_AUDIO']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_i2s_ex.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sai_ex.c']

if GetDepend(['RT_USING_MTD_NOR']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nor.c']

if GetDepend(['RT_USING_MTD_NAND']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_nand.c']

if GetDepend(['BSP_USING_FMC']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fmc.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_fsmc.c']

if GetDepend(['BSP_USING_SDRAM']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sdram.c']

if GetDepend(['BSP_USING_EXT_FMC_IO']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_sram.c']

if GetDepend(['BSP_USING_ON_CHIP_FLASH']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ex.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_flash_ramfunc.c']

if GetDepend(['BSP_USING_LTDC']):
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc_ex.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma2d.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_ll_dma2d.c']
    src += ['STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dsi.c']

path = [cwd + '/STM32F4xx_HAL_Driver/Inc',
    cwd + '/CMSIS/Device/ST/STM32F4xx/Include']
# 在原有的基础上增加CMSIS相关的头文件目录
path += [cwd + '/CMSIS/Include']
# 添加启动文件
src  += ['CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.S']


CPPDEFINES = ['USE_HAL_DRIVER']
group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)

Return('group')

同理创建SConsript来管理rt-thread的drivers目录

在这里插入图片描述

内容编写参考rt-thread源码提供的

在这里插入图片描述
在这里插入图片描述

完整配置内容

Import('RTT_ROOT')
Import('rtconfig')
from building import *
import os

cwd = GetCurrentDir()
group = []
src = []
path = [cwd]

if GetDepend(['RT_USING_PIN']):
    src += ['drv_gpio.c']

if GetDepend(['RT_USING_SERIAL']):
    if GetDepend(['RT_USING_SERIAL_V2']):
        src += ['drv_usart_v2.c']
    else:
        src += ['drv_usart.c']

if GetDepend(['BSP_USING_TIM']):
    src += ['drv_tim.c']

if GetDepend(['BSP_USING_PWM']):
    src += ['drv_pwm.c', 'drv_tim.c']

if GetDepend(['RT_USING_SPI']):
    src += ['drv_spi.c']

if GetDepend(['RT_USING_QSPI']):
    src += ['drv_qspi.c']

if GetDepend('RT_USING_SPI_BITOPS'):
    src += ['drv_soft_spi.c']

if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
    if GetDepend('BSP_USING_I2C1') or GetDepend('BSP_USING_I2C2') or GetDepend('BSP_USING_I2C3') or GetDepend('BSP_USING_I2C4'):
        src += ['drv_soft_i2c.c']
        
if GetDepend(['RT_USING_I2C']):
    if GetDepend('BSP_USING_HARD_I2C1') or GetDepend('BSP_USING_HARD_I2C2') or GetDepend('BSP_USING_HARD_I2C3') or GetDepend('BSP_USING_HARD_I2C4'):
        src += ['drv_hard_i2c.c']

if GetDepend(['BSP_USING_ETH', 'RT_USING_LWIP']):
    src += ['drv_eth.c']

if GetDepend(['RT_USING_ADC']):
    src += ['drv_adc.c']

if GetDepend(['RT_USING_DAC']):
    src += ['drv_dac.c']

if GetDepend(['RT_USING_CAN']):
    src += ['drv_can.c']

if GetDepend(['RT_USING_PM', 'SOC_SERIES_STM32L4']):
    src += ['drv_pm.c']
    src += ['drv_lptim.c']

if GetDepend('BSP_USING_SDRAM'):
    src += ['drv_sdram.c']

if GetDepend(['BSP_USING_NAND1']):
    src += ['drv_nand.c']

if GetDepend('BSP_USING_LCD'):
    src += ['drv_lcd.c']

if GetDepend('BSP_USING_LCD_MIPI'):
    src += ['drv_lcd_mipi.c']

if GetDepend('BSP_USING_ONCHIP_RTC'):
    src += ['drv_rtc.c']

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32G0']):
    src += [os.path.join('drv_flash', 'drv_flash_g0.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F0']):
    src += [os.path.join('drv_flash', 'drv_flash_f0.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F1']):
    src += [os.path.join('drv_flash', 'drv_flash_f1.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F2']):
    src += [os.path.join('drv_flash', 'drv_flash_f2.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F4']):
    src += [os.path.join('drv_flash', 'drv_flash_f4.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32F7']):
    src += [os.path.join('drv_flash', 'drv_flash_f7.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32L4']):
    src += [os.path.join('drv_flash', 'drv_flash_l4.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32H7']):
    src += [os.path.join('drv_flash', 'drv_flash_h7.c')]

if GetDepend(['BSP_USING_ON_CHIP_FLASH', 'SOC_SERIES_STM32WB']):
    src += [os.path.join('drv_flash', 'drv_flash_wb.c')]

if GetDepend('RT_USING_HWCRYPTO'):
    src += ['drv_crypto.c']

if GetDepend(['BSP_USING_WDT']):
    src += ['drv_wdt.c']

if GetDepend(['BSP_USING_SDIO']):
    if GetDepend('SOC_SERIES_STM32H7') or GetDepend('SOC_SERIES_STM32F7') or GetDepend('SOC_SERIES_STM32L4') or GetDepend('SOC_SERIES_STM32L5'):
        src += ['drv_sdmmc.c']
    else:
        src += ['drv_sdio.c']

if GetDepend(['BSP_USING_USBD']):
    src += ['drv_usbd.c']

if GetDepend(['BSP_USING_PULSE_ENCODER']):
    src += ['drv_pulse_encoder.c']

if GetDepend(['BSP_USING_USBH']):
    src += ['drv_usbh.c']

path += [os.path.join(cwd, 'config')]

if GetDepend('BSP_USING_ON_CHIP_FLASH'):
    path += [os.path.join(cwd, 'drv_flash')]

# 增加头文件路径
path += [os.path.join(cwd)]
path += [os.path.join(cwd,'include')]
# 增加公共部分源文件
src += ['board.c','drv_common.c','drv_clk.c']

# 增加相关宏定义
CPPDEFINES = ['STM32F407xx','SOC_SERIES_STM32F4']
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES)

Return('group')

对于application目录的SConscript文件配置

rt-thread源码工程

在这里插入图片描述

自己创建的工程

在这里插入图片描述

在Env控制台,再次执行生成命令

scons --target=cmake

在这里插入图片描述

使用Clion进行构建

在这里插入图片描述

配置openocd进行程序下载测试

openocd 配置文件

在这里插入图片描述

配置烧录环境

在这里插入图片描述

烧录(ok)

在这里插入图片描述在这里插入图片描述

额外补充

项目名称修改

  1. 生成的项目名称都为rtthread,这里需要修改cmake.py脚本文件
    在这里插入图片描述
  2. 修改后

在这里插入图片描述
3. 在Env控制台中重新构建一次

scons --target=cmake

在这里插入图片描述

总结

  1. 如果在rt-studio中开启某个组件或软件包的时候,都需要在Env控制台中构建一下,用于动态更新CMakelists文件中的配置
  2. 个人的理解scons就是通过python脚本读取相应的配置文件,然后解析,安装指定的格式生成对应的构建配置文件
ESP32是一款32位的微控制器,而ESP-IDF是官方提供的用于开发ESP32的软件开发框架。Clion是一款集成开发环境(IDE),可以用于开发和调试ESP32项目。 在使用Clion进行ESP32开发之前,需要先搭建好ESP-IDF和Clion开发环境。以下是搭建ESP32+Clion开发环境的步骤: 1. 安装ESP-IDF:根据官方文档的指引,下载并安装ESP-IDF。确保安装的是与你的ESP32兼容的版本。 2. 安装Clion:下载并安装Clion,确保安装的是最新版本。 3. 配置ESP-IDF路径:打开Clion,进入File -> Settings -> Build, Execution, Deployment -> CMake,将ESP-IDF的路径添加到"CMake Options"中。例如,如果ESP-IDF安装在`/path/to/esp-idf`,则添加以下内容: ``` -DCMAKE_TOOLCHAIN_FILE=/path/to/esp-idf/tools/cmake/toolchain-esp32.cmake ``` 4. 创建ESP32项目:在Clion中创建一个新的CMake项目,并将ESP-IDF的示例项目导入到Clion中。可以通过以下命令将示例项目复制到你的项目目录中: ``` cp -r /path/to/esp-idf/examples/get-started/hello_world /path/to/your/project ``` 5. 配置CMakeLists.txt:打开项目中的CMakeLists.txt文件,并根据你的项目需求进行配置。确保设置了正确的目标硬件和端口。 6. 构建和烧录:在Clion中点击Build按钮,Clion将自动构建项目并生成可执行文件。然后,使用ESP-IDF提供的烧录工具将可执行文件烧录到ESP32上。 7. 调试:在Clion中配置调试器,可以使用GDB进行调试。在调试过程中,可以设置断点、查看变量的值等。 请注意,以上步骤仅为搭建ESP32+Clion开发环境的基本步骤,具体的配置和操作可能会因个人需求和环境而有所不同。建议参考ESP-IDF和Clion的官方文档以获取更详细的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

詩不诉卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值