由于不想使用盗版的Kei软件(也不能跨平台),所以尝试了用其它工具进行STM32的学习。这里用的是vscode配置STM32, eclipse和Clion也是可以进行STM32的开发,但是这俩个感觉好占用内存。
开发环境:UOS Linux, 这里我使用的板子是野火的stm32f103vet6 指南者
所需工具及下载:
sudo apt install openocd
安装make(如果已经安装了make就不必再执行这条命令)
sudo apt install make
安装cmake
sudo apt install cmake
这里我们开始需要添加 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
source /etc/profile
source /etc/profile 这条命令好像只在当前终端生效,我一般都是等软件基本上配置好后注销或重启。
我们从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后,在UOS或Deepin上(这俩个可以说是一家人),系统文件目录的默认打开就会替换成vscode,可以运行下面命令更换过来。
xdg-mime default dde-file-manager.desktop inode/directory
下载好插件后,对cortex-debug进行配置,用于板子的调试:
点击vscode左侧RUN按钮,单击create a launch.json file,在弹出的选项中,选择cortex-debug即可创建相应的json文件
效果图如下:
修改文件的内容,该文件的配置参考: 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, 这里就不做演示了。 网上也有好多教程。
用vscode打开你生成的项目工程
打开后会弹出选项,选择一个工具集就好。
如果因为一些原因导致没有弹出来,我们可以点击下面的按钮。
效果如下图:
~~~实在不想写了,后面的工程配置中的内容,看着不多,写起来好麻烦~~~
我们将进行从头到尾的工程配置,不使用CubeMX工具进行生成,现在我们需要去官网上下载HAL库的包,地址:F1系列的HAL包
找一个位置建一个文件夹,名为 Template。
现在我们要将下载好的包中的内容拷贝到我们创建的文件Template(也可以创建别的名字)中,
在Template中建立几个文件夹,名为 Drivers, startup 。
将STM32Cube_FW_F1_V1.8.0/Drivers 中的CMSIS和STM32F1xx_HAL_Driver这两个目录拷贝到我们刚建立的Drivers中。
删除Template/Drivers/CMSIS中除Device和Include以外的目录。
删除Template/Drivers/STM32F1xx_HAL_Driver目录中除Inc和Src以外的目录。
将STM32Cube_FW_F1_V1.8.0/Projects/STM3210E_EVAL/Templates中的Inc和Src, 拷贝到Template中
STM32Cube_FW_F1_V1.8.0/Projects/STM3210E_EVAL/Examples/UART/UART_Printf/SW4STM32/中的syscalls.c 拷贝到Template/Src中。
Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/startup_stm32f103xe.s 拷贝到Template/startup中
Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates/gcc/linker/STM32F103XE_FLASH.ld 拷贝到Template中
Template/Drivers/CMSIS/Device/ST/STM32F1xx/Source/Templates中剩下的文件用不到了,想删就删,不删也没关系.
#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” 即可
经过测试,没想到能够点亮小灯,出乎我的意料,哈哈。