vscode开发stm32

vscode开发stm32

由于不想使用盗版的Kei软件(也不能跨平台),所以尝试了用其它工具进行STM32的学习。这里用的是vscode配置STM32, eclipse和Clion也是可以进行STM32的开发,但是这俩个感觉好占用内存。

开发环境及准备工具

开发环境:UOS Linux, 这里我使用的板子是野火的stm32f103vet6 指南者

所需工具及下载:

  1. Vsiual Studio Code
  2. openocd
  3. cmake
  4. ARM GCC Toolchain

安装openocd

sudo apt install openocd

安装cmake (在安装cmake之前要安装make)

安装make(如果已经安装了make就不必再执行这条命令)

sudo apt install make

安装cmake

sudo apt install cmake

配置 ARM GCC Toolchain

这里我们开始需要添加 ARM GCC的环境配置

sudo vim /etc/profile

在打开的文件最后,添加以下内容:

ARM_GCC=/home/mingxuan/apps/gcc-arm-none-eabi  #arm-none-eabi-gcc的家目录,这里填你自己的就好
PATH=${ARM_GCC}/bin:${PATH}
export ARM_GCC PATH

效果图如下:
vscode开发stm32_第1张图片

source /etc/profile

source /etc/profile 这条命令好像只在当前终端生效,我一般都是等软件基本上配置好后注销或重启。

配置openocd

我们从openocd的board文件中拷贝一份文件,并重命名为stm32f103vet6.cfg,只需简单的更改其内容即可。Linux中,openocd的scripts文件默认在/usr/share/openocd/路径中

sudo cp /usr/share/openocd/scripts/board/st_nucleo_f103rb.cfg  ./stm32f103vet6.cfg

对其内容进行更改

sudo vim /usr/share/openocd/scripts/board/stm32f103vet6.cfg 

更改好的内容如下(我这里用的是野火的dap仿真器,接口使用的jtag):
vscode开发stm32_第2张图片

配置vscode

安装好vscode后,在UOS或Deepin上(这俩个可以说是一家人),系统文件目录的默认打开就会替换成vscode,可以运行下面命令更换过来。

xdg-mime default dde-file-manager.desktop inode/directory

打开vscode安装相应的插件:
vscode开发stm32_第3张图片

下载好插件后,对cortex-debug进行配置,用于板子的调试:
点击vscode左侧RUN按钮,单击create a launch.json file,在弹出的选项中,选择cortex-debug即可创建相应的json文件
效果图如下:
vscode开发stm32_第4张图片

修改文件的内容,该文件的配置参考: Cortex-Debug Configuration

{
    "version": "0.2.0",
    "configurations": [
        {
            "type": "cortex-debug",
            "request": "launch",
            "servertype": "openocd",
            "cwd": "${workspaceRoot}",
            "executable": "./firmware.elf",
            "name": "Debug (OpenOCD)",
            "device": "STM32F103VE",
            "configFiles": [
                "board/stm32f103vet6.cfg"
            ]
        }
    ]
}

"executable"这个参数的内容填写你的编译好后的elf所在路径
** 配置文件中的configFiles: board/stm32f103vet6.cfg 就是我们在上文openocd中创建的文件**
至此,软件的所需的配置都基本上配置完毕。

用CubeMX生成项目(SW4STM32)

由于我的电脑上昨天重装,没有安装CubeMX, 这里就不做演示了。 网上也有好多教程。

用vscode打开你生成的项目工程
打开后会弹出选项,选择一个工具集就好。
如果因为一些原因导致没有弹出来,我们可以点击下面的按钮。
效果如下图:

vscode开发stm32_第5张图片
使用cmake编译程序非常方便,点击图中的build即可:
vscode开发stm32_第6张图片

最终的效果图:
vscode开发stm32_第7张图片







折腾

工程目录文件手动配置(这个太麻烦,我就是自己折腾,不推荐)

~~~实在不想写了,后面的工程配置中的内容,看着不多,写起来好麻烦~~~

我们将进行从头到尾的工程配置,不使用CubeMX工具进行生成,现在我们需要去官网上下载HAL库的包,地址:F1系列的HAL包

找一个位置建一个文件夹,名为 Template。

现在我们要将下载好的包中的内容拷贝到我们创建的文件Template(也可以创建别的名字)中,
在Template中建立几个文件夹,名为 Drivers, startup 。

  1. 将STM32Cube_FW_F1_V1.8.0/Drivers 中的CMSIS和STM32F1xx_HAL_Driver这两个目录拷贝到我们刚建立的Drivers中。

  2. 删除Template/Drivers/CMSIS中除Device和Include以外的目录。

  3. 删除Template/Drivers/STM32F1xx_HAL_Driver目录中除Inc和Src以外的目录。

  4. 将STM32Cube_FW_F1_V1.8.0/Projects/STM3210E_EVAL/Templates中的Inc和Src, 拷贝到Template中

  5. STM32Cube_FW_F1_V1.8.0/Projects/STM3210E_EVAL/Examples/UART/UART_Printf/SW4STM32/中的syscalls.c 拷贝到Template/Src中。

  6. Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xe.s 拷贝到Template/startup中

  7. Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker/STM32F103XE_FLASH.ld 拷贝到Template中
    Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates中剩下的文件用不到了,想删就删,不删也没关系.

改写一下CubeMX生成的cmake

#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE!
SET(CMAKE_SYSTEM_NAME Generic)
SET(CMAKE_SYSTEM_VERSION 1)
cmake_minimum_required(VERSION 3.7)

# specify cross compilers and tools
SET(CMAKE_C_COMPILER_WORKS 1)
SET(CMAKE_C_COMPILER arm-none-eabi-gcc)
SET(CMAKE_CXX_COMPILER_WORKS 1)
SET(CMAKE_CXX_COMPILER arm-none-eabi-g++)
set(CMAKE_ASM_COMPILER  arm-none-eabi-gcc)
set(CMAKE_AR arm-none-eabi-ar)
set(CMAKE_OBJCOPY arm-none-eabi-objcopy)
set(CMAKE_OBJDUMP arm-none-eabi-objdump)
set(SIZE arm-none-eabi-size)

SET(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32F103XE_FLASH.ld)

#Uncomment for hardware floating point
#SET(FPU_FLAGS "-mfloat-abi=hard -mfpu=fpv4-sp-d16")
#add_definitions(-DARM_MATH_CM4 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING -D__FPU_PRESENT=1)

#Uncomment for software floating point
#SET(FPU_FLAGS "-mfloat-abi=soft")

SET(COMMON_FLAGS
    "-mcpu=cortex-m3 ${FPU_FLAGS} -mthumb -mthumb-interwork -ffunction-sections -fdata-sections \
    -g -fno-common -fmessage-length=0 -specs=nosys.specs -specs=nano.specs")

SET(CMAKE_CXX_FLAGS_INIT "${COMMON_FLAGS} -std=c++11")
SET(CMAKE_C_FLAGS_INIT "${COMMON_FLAGS} -std=gnu99")
SET(CMAKE_EXE_LINKER_FLAGS_INIT "-Wl,-gc-sections,--print-memory-usage -T ${LINKER_SCRIPT}")

PROJECT(Template C CXX ASM)
set(CMAKE_CXX_STANDARD 11)

#add_definitions(-DARM_MATH_CM4 -DARM_MATH_MATRIX_CHECK -DARM_MATH_ROUNDING -D__FPU_PRESENT=1)
add_definitions(-DUSE_HAL_DRIVER -DSTM32F103xE)

file(GLOB_RECURSE SOURCES 
"startup/*.*" 
"usr/*.*" 
"Drivers/CMSIS/Device/ST/STM32F1xx/Include/*.*")

list(APPEND SOURCES
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_cortex.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_dma.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_exti.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_flash_ex.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_gpio_ex.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_pwr.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_rcc_ex.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_tim_ex.c;
        Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_uart.c;
        Src/main.c;
        Src/stm32f1xx_it.c;
        Src/syscalls.c;
        Src/system_stm32f1xx.c;
        Src/stm32f1xx_hal_msp.c;
)

include_directories(Inc Drivers/STM32F1xx_HAL_Driver/Inc
        Drivers/STM32F1xx_HAL_Driver/Inc/Legacy
        Drivers/CMSIS/Device/ST/STM32F1xx/Include
        Drivers/CMSIS/Include
        usr/led # 自己也是第一次这么麻烦的配置工程文件,用于测试自己手动建立的项目能否成功.
        )

add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT})

set(CMAKE_EXE_LINKER_FLAGS
    "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map")

set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)
set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)

add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD
        COMMAND ${CMAKE_OBJCOPY} -Oihex $ ${HEX_FILE}
        COMMAND ${CMAKE_OBJCOPY} -Obinary $ ${BIN_FILE}
        COMMENT "Building ${HEX_FILE}
Building ${BIN_FILE}")

编译报错问题

编译好后会报错,删除main.h中的#include “stm3210e_eval.h” 即可

经过测试,没想到能够点亮小灯,出乎我的意料,哈哈。

你可能感兴趣的:(嵌入式)