导言
众所周知,集成开发环境IDE可以大幅度地提高代码生产效率。对于一个用惯集成开发环境的开发者来说,转到古老的Keil5,Keil4开发多少有些难受与不适应。Keil5不仅界面还停留在一二十年前的老古董样式,在某些集成化与开发效率上仍有很大的改进空间,举个简单的栗子,仿真调试变量的查看是分开的,不能像Jetbrains家族产品那样断点调试时,自动显示变量值,代码错误标红改正后迟迟没有相应,这对于一个强逼症患者来说简直不可理喻。
在一番艰难的探索,借鉴诸多前辈的经验之后,在解决无法使用CLion进行在线烧录下载与调试之后,我选择依旧拥抱集成开发环境CLion, 使用STM32 + CLion+ STM32CubeMx + OpenOCD + MinGW + JLink的组合进行开发STM32 HAL库的开发。
需要特别提醒的是,这一套开发环境由于STM32CubeMx仅支持生成STM32 HAL项目代码,即只支持HAL库开发,对于库函数、寄存器开发方式存在很多限制。
基础环境安装
环境要求
软件
- Windows10
- CLion 2021.2.2(下载: CLion 2021.2.2)
- STM32CubeMx6.5.0(下载: STM32CubeMx6.5.0)
- MinGW(下载: mingw-18.0-without-git)
- OpenOCD(下载: openocd-20211118)
- Arm-none-eabi-gcc(下载: gcc-arm-none-eabi-10.3-2021.10-win32.zip
- JLink驱动(下载: JLink V7.66)
硬件要求
- STM32(STM32F103ZE)
- 仿真调试器(JLink V9)
辅助软件
- UsbDriverTool(下载: UsbDriverTool-2.1)
环境安装
在上面的列表中,已列出相应版本与下载链接,请自行下载安装,部分为压缩包,解压到根给目录下即可。下载安装/解压完成之后,请将MinGW、OpenOCD、Arm-none-eabi-gcc文件夹下的bin目录添加至系统环境变量。不会添加系统环境变量的,请自动移步百度搜索。
添加完成以后使用一下指令检查是否基础环境是否安装正确。若有版本内容输出即为正确。
gcc -v
make -v
arm-none-eabi-gcc -v
开发环境配置
CLion的初始配置
首先,我们先创建一个项目,点击File->New Project,在对话窗中左侧选项栏中选择STM32CubeMx,Location自定义,最后一个斜杠/部分为项目文件夹名称,这里我们约定为tmpTest。
我们开始配置Toolchain与CMake(CLion是基于CMake组织编译代码的)。等待”Running STM32CubeMx“提示框消失后,来到CLion项目主界面,单击顶部导航栏File,选择Settings设置按选项,再选择"Build,Execution,Deployment"编译、运行与部署项,单击"Toolchains"工具链(File->Settings->Build,Execution,Deployment->Toolchains)后,点击+号,选择MinGW类型,创建MinGW工具链。下面是各个选项的简单介绍与设置。
- Name: 工具链的名称,自定义,这里我们约定名称为STM32ToolChain。
- Environment: MinGW环境位置,选择之前MinGW安装/解压的位置即可。
- CMake: 选择默认的Bundle即可
- Make: 编译工具,若Environment配置正确,会自动检测。
- C Compiler: C语言编译工具,若Environment配置正确,会自动检测。
- C++ Compiler: C++语言编译工具,若Environment配置正确,会自动检测。
- Debugger: 调试工具位置,选择之前安装的Gcc-arm-none-ebai目录下文件夹bin内的arm-none-eabi-gdb.exe
接下来配置Cmake,位置"Toolchains"在下方,配置方法与Toolchains相似。还是首先点击+号,点击后会自动创建,不需要选择类型。
- Name: 自定义
- Build type: 编译类型,选择Debug,
- Toolchain: 工具链,选择刚创建的Toolchain,即本文前面的STM32ToolChain。
- 其他选项不需要配置,保持默认即可。
下面,我们还需要配置CLion的嵌入式开发环境选项,单击"Build,Execution,Deployment"选项内的"Embedded Development",分别选择OpenOCD、STM32CubeMx以.exe为结尾的主程序文件,OpenOCD的主程序文件在安装目录下的bin文件夹内。正确选择路径以后,单击Test检验是否选择正确,若出现绿色方框提示内容即为配置正确。
配置完上面三项以后,我们点击右下角的Apply,关闭Settings窗口。
STM32CubeMx的配置
接下来,我们需要STM32CubeMx的辅助,生成相应的系统核心与外设代码。在CLion内,打开tmpTest.ioc文件,双击"Open with STM32CubeMx",唤起STM32CubeMX。
进入STM32CubeMx主界面之后,单击STM32CubeMx界面顶部导航栏Home旁边的STMxx芯片类型,重新选择自己对应的芯片类型。进入界面以后,可在"Commercial Part Number"输入框中输入芯片类型关键字,快速查找,双击自己的芯片型号即可创建项目。
新建项目完成以后,来到项目"Pinout&Configuration"界面, 左侧导航栏点击"Categories"目录导航模式(默认),找到System Core->SYS项,将Debug一栏选择为“Serial Write”,开启SWD烧录调试模式(请根据自己的板子情况选择,有的支持JTAG,有的支持SWD,有的不支持仿真调试)。
配置完成以后,来到“Project Manager”界面,第一个页面是"Project", 第一栏Project Name请保持与之前的路径最后文件夹名称一致,以本文约定的tmpTest为例,这里只能是tmpTest,否则待会生成的代码会到别的文件夹去。
Application Structure前面部分不变,保持Advanced, 勾选后面的“Do not generate the main()”选项,不生成程序入口主函数main(),可以根据自己的习惯选择是否勾选,若勾选main函数待会会出现在文件夹Core/main.c中。
ToolChain/IDE一栏可以选择STM32CubeMx或SW4STM32(目前只试过这两个,其他的请自行测试),
来到第二个页面“Code Generator”,在“Generated files”栏内,勾选”Generate peripheral initialization as pair of '.c/.h' files per peripheral“
第三个页面"Advanced Settings", 最后一栏"Generated Function Calls","Generate Code"选项可以选择是否生成相应外设的初始化/配置代码,"Do not Generate Function Call"可以选择是否在代码生成是,自动在main()函数内调用,当在"Project"页面勾选"Do not generate the main()"时,此选项失效。
其他的选项不多作介绍,有需求、有兴趣的小伙伴请自行探索。
这里提示一下,当需要启用USART串口等外设时,需要"Pinout&Configuration"左侧导航栏中启用相应的功能。例如需要启用USART1串口,需要在Connectivity->USART1中选择模式,选择模式后在下方的Configuration中配置USART NVIC中断设置以及DMA,GPIO等。如果没有配置相那么相应的外设代码与文件,将不会自动生成在项目文件中。
STM32CubeMx的最后一步是单机界面右上方的"GENERATE CODE“,生成相应的STM32驱动与库文件。
CLion烧录与调试配置
到这里,我们已经完成了所有STM32CubeMx的配置,我们现在可以关闭STM32CubeMx,继续转向CLion烧录与调试环境的配置。
当我们在STM32CubeMx点击"GENERATE CODE"之后,CLion会自动检测识别相关变化,会弹出一个"Board Config Files"选项框,这里我们统一选择"st_nucleo_f103rb.cfg",选中以后点击"Copy to Project&Use"。
一般情况下,当我们完成上述步骤以后,CLion项目主界面右上角的锤子、三角以及类似虫子的符号会点亮,表示可编译,可运行,可调试状态。若没有,请重新阅读CLion初始化配置章节部分,检查是否配置正确。
我们点击锤子旁边的长方形选项框,选择"Edit Configurations"。一般,我们可以在"Run/Debug Configurations"界面中看到已经自动生成"CMake Application"/"OpenOCD Download &Run"两项,CMake使用默认设置,不需要我们配置。我们需要配置的是"OpenOCD Download & Run"。配置介绍如下方列表所示。
- Name: 自定义,
- Target: 下来选择第一项。
- Executable: 下拉选择第一项。
- GDB: 点击向下箭头符号,选择"arm-none-eabi-gdb.exe from 'STM32' toolchain 选项",即我们在Settings中配置的ToolChain中的debug。
- Board config file: 确保选项为带路径的"st_nucleo_f103fb.cgf"选项。没有请点击Assist,找到该选项,并在确认对话框中选择"Copy to Project&Use"
- 剩余的选项保持默认即可。
下面,我们需要设置JLink与OpenOCD连接配置,打开"st_nucleo_f103rb.cfg"文件,删除原本内容,填写如下内容。transport select选项为调试接口的协议,根据情况选择SWD,JTAG。
source [find interface/jlink.cfg]
transport select swd
source [find target/stm32f1x.cfg]
reset_config none
JLink驱动的修改
到这里,我们已经完成了大部分的环境配置工作,我们现在可以单击Build(锤子符号按钮)编译当前的项目,由于我们之前在STM32CubeMx Project中勾选了"Do not generate the main()",没有生成main主函数,会报错提示"undefined reference to `main'"
但是,我们目前还是无法进行仿真调试与在线烧录的。当我们单击Run(三角符号按钮)时,会出现下方的提示,表示为找到JLink设备。
Error: No J-Link device found
Error: No Valid JTAG Interface Configured.
具体的原因我也不太清楚,我的猜测是由于JLink的驱动程序并不是普通的WinUSB驱动程序,导致OpenOCD无法检测到相应的驱动。因而我们只需要修改成WinUSB类型驱动即可。
在前面环境要求章节中,我们已经给出UsbDriverTool的官网下载地址,请自行下载安装。
下面请运行USBDriverTool,进入主界面找到J-Link drvier或BULK interface(Interface 2),请确保Vendor生产商为SEGGER,避免选择错误。另外请不要选择JLink CDC UART Port,此选项是串口驱动。正确找到JLink驱动以后,双击进入Driver Selection选择界面,我们这里选择WinUSB,然后点击右下角Install,等待安装完成即可。
当我们需要还原出厂的原装驱动,相同的步骤,将选项WinUSB改为BULK interface(Interface 2)即可。
最后的配置工作
前面我们提及过,CLion是根据CMake来组织编译工作的,只有被CMake检索到的文件与代码才能被编译。CMake的项目配置文件是CMakeLists.txt,在配置完STM32CubeMx后,CLion已经为我们生成了CmakeLists.txt文件,并且完成了大部分配置工作,我们只需要添加include导入路径以及需要编译的代码文件即可。
这里,为了方便说明与供大家测试,我们以点灯实验为例。在项目文件夹tmpTest内,新建一个User文件夹,User文件夹内有一个包含main()程序入口主函数的main.c文件,主函数main内进行了系统的初始化以及时钟、LED针脚的配置。针脚端口请根据自己的开发板设置,我们以STM32F103ZET为例。
/*
*******************************************
* author: zhang
* fileName: main.c
* datetime: 2022/9/8
*******************************************
*/
#include "stm32f1xx.h"
int main() {
HAL_Init();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.Pin = GPIO_PIN_5;
GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStructure.Pull = GPIO_PULLUP;
GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, GPIO_PIN_RESET);
while(1) {
//
}
}
如下图所示,我们在Include_directories命令括号内,添加我们新建的User文件夹名称(CMake参数的分隔符为空格)。在file命令括号内添加"User/*.*",这里用到了正则表达式,表示编译User文件夹内的所有文件。
在我们第一次修改CMakeLists.txt时,CLion会提示"CMake project needs to be reloaded",这时请记得选择"Enable Auto-Reload",这样,当我们每次修改CMakeLists.txt文件时,CLion会帮我们自动加载,不需要我们手动操作了。
现在,正确完成上述操作之后,我们就可以通过CLion编写STM32代码,并完成烧录与调试工作了。这里再次介绍一下右上角三个常用按钮的功能,
- Build(锤子符号): 编译代码,会自动生成.bin以及.hex文件
- Run(三角符号):不同于常规的CLion C/C++项目,这里Run的功能是下载,将代码烧录到单片机。
- Debug(类虫子符号): 在线仿真调试,可加断点,查看变量值。
当我们单击Run按钮后,提示内容是红色的,别误以为是报错了。当消息输出框有" Programming Finished" 或右下角出现OpenOCD提示"Fireware Downloaded"即表示代码烧录成功。
Debug调试功能相信用过CLion的都会觉得好用,不会的小伙伴请自行探索。
结束语
以上就是STM32+CLion+JLink+STM32CubeMx+MinGW+OpenOCD+Arm-none-eabi开发环境配置的全部内容了,博主也是查询了大量的资料,鏖战两天两夜才完成了相关的配置,也算是一份小秘籍了,分享给大家。如有问题,请在下方评论区留言。
码文不易,请大家多多点赞,积极评论哦~
3 comments
想想你的文章写的特别好www.jiwenlaw.com
看的我热血沸腾啊https://www.237fa.com/
看的我热血沸腾啊