> 技术文档 > 使用Clion+OpennOCD开发MSPM0系列单片机_openocd clion

使用Clion+OpennOCD开发MSPM0系列单片机_openocd clion

本教程使用的工程已经上传到github   https://github.com/ktkuri132/Auto_Run_Car_MSPM0_H.git
基于Clion开发环境本身是要使用makefile或是CMake来进行构建项目的,由于TI官方对GCC工具链有一定的支持,自家CCS支持GCC工具链编译,当然也支持原生makefile编译,提供了链接脚本和启动文件,大约在两年前有人在TI的论坛上问道MSPM0是否支持OpenOCD,有没有对应的.cfg配置文件,当时TI回答道没有,不支持OpenOCD,但是我最近再去搜索的时候,居然有了,支持OpenOCD的配置文件已经合并在最新的发行版了

之前的大版本v0.12.0里边是没有的

这样的话就能像开发stm32一样开发mspm0了,首先需要创建一个clion支持的cfg文件,里面填上OpenOCD的烧录器的目标板,

source [find interface/xds110.cfg]transport select swdsource [find target/ti_mspm0.cfg]adapter speed 10000

这个ti_mspm0.cfg是最新版的OpenOCD才支持的,一定要下到最新版的,其次就是CMakeLists.txt文件,我这里有一个一直在用的CMakeLists.txt文件

set(CMAKE_SYSTEM_NAME Generic)set(CMAKE_SYSTEM_VERSION 1)cmake_minimum_required(VERSION 3.22)# 设置目标处理器架构,芯片型号,和目标板简称set(CMAKE_SYSTEM_PROCESSOR cortex-m0plus)set(Target_Board MSPM0xx)set(Board_Name mspm0g3507)# 指定交叉编译工具链arm-none-eabi-gcc,添加到环境变量中,或者在此处直接指定绝对路径#这里将原有使用arm-gcc编译器注释了,转而使用ti里的arm-gcc,编译文件大小有一定的优化#set(CMAKE_C_COMPILER arm-none-eabi-gcc)#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(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY)# 项目名称project(MSPM0ARC_H_MCU1 C CXX ASM)set(CMAKE_CXX_STANDARD 17)set(CMAKE_C_STANDARD 11)# 添加关于硬件浮点的支持的相关编译选项if(\"${Target_Board}\" STREQUAL \"STM32F1xx\") message(STATUS \"${Target_Board}\") add_compile_options(-mfloat-abi=soft) add_link_options(-mfloat-abi=soft)elseif (\"${Target_Board}\" STREQUAL \"STM32F4xx\") message(STATUS \"${Target_Board}\") add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16) add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16)elseif(\"${Target_Board}\" STREQUAL \"STM32H7xx\") message(STATUS \"${Target_Board}\") add_compile_options(-mfloat-abi=hard -mfpu=fpv5-d16) add_link_options(-mfloat-abi=hard -mfpu=fpv5-d16)elseif (\"${Target_Board}\" STREQUAL \"MSPM0xx\") message(STATUS \"${Target_Board}\") add_compile_options(-mfloat-abi=soft) add_link_options(-mfloat-abi=soft)elseif(\"${Target_Board}\" STREQUAL \"\") message(FATAL_ERROR \"Unknown target board\")endif ()# 指定芯片型号的相关编译选项if(\"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-m4\" OR \"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-m7\" OR \"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-m3\" OR \"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-m0plus\") add_compile_options(-mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb) add_link_options(-mcpu=${CMAKE_SYSTEM_PROCESSOR} -mthumb -mthumb-interwork)elseif(\"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-a7\" OR\"${CMAKE_SYSTEM_PROCESSOR}\" STREQUAL \"cortex-a8\" OR ) add_compile_options(-mcpu=${CMAKE_SYSTEM_PROCESSOR}) add_link_options(-mcpu=${CMAKE_SYSTEM_PROCESSOR})endif()add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0)add_link_options(-specs=nosys.specs -lc -lm)# 此处忽略C++17中的操作绝对地址(寄存器)的警告#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -Wno-register\")# 进行汇编文件的预编译add_compile_options($<$:-x$assembler-with-cpp>)add_compile_options(-w)# 提供编译选项,根据不同的编译类型进行不同的优化,常见的编译类型有Debug,Release,RelWithDebInfo,MinSizeRelif (\"${CMAKE_BUILD_TYPE}\" STREQUAL \"Release\") message(STATUS \"Maximum optimization for speed\") add_compile_options(-Ofast)elseif (\"${CMAKE_BUILD_TYPE}\" STREQUAL \"RelWithDebInfo\") message(STATUS \"Maximum optimization for speed, debug info included\") add_compile_options(-Ofast -g)elseif (\"${CMAKE_BUILD_TYPE}\" STREQUAL \"MinSizeRel\") message(STATUS \"Maximum optimization for size\") add_compile_options(-Os)else () message(STATUS \"Minimal optimization, debug info included\") add_compile_options(-Og -g)endif ()# 添加链接脚本file(GLOB_RECURSE LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/*.ld)# 添加链接选项,生成map文件add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map)add_link_options(-T ${LINKER_SCRIPT})#添加源文件file( GLOB_RECURSE SOURCE_FILES ${CMAKE_SOURCE_DIR}/source/*.c)# 生成可执行文件add_executable(${PROJECT_NAME}.elf main.c ti_msp_dl_config.c ${SOURCE_FILES} ${LINKER_SCRIPT})#添加头文件路径include_directories(${CMAKE_SOURCE_DIR})target_include_directories(${PROJECT_NAME}.elf PUBLIC ${CMAKE_SOURCE_DIR} include include/core include/core/ti/driverlib include/core/third_party/CMSIS/Core/Include include/bsp include/control include/core include/hw include/mw include/rtos)#添加芯片宏定义add_definitions( -D__MSPM0G3507__ # 定义芯片型号# -DUSE_STDPERIPH_DRIVER)# 定义其他类型的可执行文件set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex)set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin)# 生成hex和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}\")

有了两个文件了和你自己的项目文件之后,就可以用Clion打开你的文件夹,首先他会要你选择工具链,这里把ti文件夹里的gcc工具链添加进来,

没有下的可以在ti的ccs里面创建一个arm-gcc的工程,然后他会自己下一个,下好了之后就可以在ti的文件夹里找到刚刚下载好的工具链了,然后再将arm-none-eabi-gcc.exe添加进来,g++它会自动识别的,

此前的使用Clion的基础配置网上已经由很多人讲了,我就不重复了,此前如果没有用过CMake,那就只关注这里,就行了

在target_include_directories里面添加自己的头文件路径,在上面那个file里添加自己的源文件路径,如果还是不知道的就在我的工程里看吧

 最后如果前面的配置成功的话编译烧录这是最后一步

添加一个OpenOCD的运行配置,弄好之后就可以编译烧录了,本教程由于有Clion使用基础的人来说比较轻松,没有使用过Clion的可能比较吃力,本来想追加一个VScode配置教程的,但是使用VScode的配置就比较麻烦了,还不如就用ccs,这里我点了一个小灯,

效果是这样的:

如果有些细节有疑惑不能成功的多多去网上看其他教程,比如stm32配置CLion,stm32配置OpenOCD等等,都是大差不差的,MSPM0使用CLion主要是想用CLion的环境生态,我此前开发stm32大部分用Vscode,后来才用的CLion,感觉CLion可以在嵌入式开发中代替一部分Keil的角色,但是既然OpenOCD既然支持了MSPM0,那其他基于OpenOCD的集成开发环境比如像PlatformIO应该也快了(现在目前它还不支持),这个图上的MSPM0G3507和调试探针XDS110