Windows下使用Vscode开发STM32

前言

使用arm-gcc编译工具链,openocd开源调试工具,makefile脚本

vscode安装

vscode下载

Windows下使用Vscode开发STM32_第1张图片

Windows下使用Vscode开发STM32_第2张图片

vscode安装

以管理员身份运行->我同意此协议,一直下一步
Windows下使用Vscode开发STM32_第3张图片

然后勾选上一下两个选项,下一步直到完成。
Windows下使用Vscode开发STM32_第4张图片

插件安装

安装图中框选中的插件
Windows下使用Vscode开发STM32_第5张图片

环境搭建

gcc-arm-none-eabi下载安装

gcc-arm-none-eabi下载

https://developer.arm.com/downloads/-/gnu-rm

选择win32.zip下载,选择原因是win32是windonws版本,.exe与.zip的区别是前者通过安装,后者解压后使用
Windows下使用Vscode开发STM32_第6张图片

在C盘中创建VscodeTools文件夹(该路径(C:\VscodeTools)决定了后续工具链接的选择路径),将gcc-arm-none-eabi-10.3-2021.10-win32.zip解压到当前位置,得到gcc-arm-none-eabi-10.3-2021.10文件夹,然后就可以将gcc-arm-none-eabi-10.3-2021.10-win32.zip压缩包删除了
Windows下使用Vscode开发STM32_第7张图片

到此,gcc-arm-none-eabi安装完成

openocd下载安装

Download pre-built OpenOCD for Windows

https://gnutoolchains.com/arm-eabi/openocd/

这里我选择了20211118这个版本(原因是我对新版本的操作语法不熟悉)
Windows下使用Vscode开发STM32_第8张图片

将openocd-20211118.7z解压到C:\VscodeTools中去,得到OpenOCD-20211118-0.11.0,然后就可以将openocd-20211118.7z压缩包删除了
Windows下使用Vscode开发STM32_第9张图片

到此,openocd安装完成

make工具下载安装

Make for Windows

https://gnuwin32.sourceforge.net/packages/make.htm

点击setup下载
Windows下使用Vscode开发STM32_第10张图片

以管理员身份运行,然后next
Windows下使用Vscode开发STM32_第11张图片

Windows下使用Vscode开发STM32_第12张图片

Windows下使用Vscode开发STM32_第13张图片

Windows下使用Vscode开发STM32_第14张图片

Windows下使用Vscode开发STM32_第15张图片

Windows下使用Vscode开发STM32_第16张图片

Windows下使用Vscode开发STM32_第17张图片

Windows下使用Vscode开发STM32_第18张图片

配置make的环境变量,打开高级系统设置(可以通过搜索框搜索高级系统设置快速打开),进入环境变量
Windows下使用Vscode开发STM32_第19张图片

双击path
Windows下使用Vscode开发STM32_第20张图片

添加make环境,重启电脑后生效
Windows下使用Vscode开发STM32_第21张图片

工程搭建测试

用STM32CubeMX生成一个工程,使用串口输出->测试成功
Windows下使用Vscode开发STM32_第22张图片

Windows下使用Vscode开发STM32_第23张图片

生成代码后,通过code打开文件夹,创建.vscode文件夹,在其中创建c_cpp_properties.json、settings.json、tasks.json、launch.json四个文件夹
Windows下使用Vscode开发STM32_第24张图片

  • c_cpp_properties.json
{
    "configurations": [
        {
            "name": "win32",
            "includePath": [
                "${workspaceFolder}/**"//头文件路径
            ],
            "defines": [//宏定义
                "_DEBUG",
                "UNICODE",
                "_UNICODE",
                "__GNUC__"
            ],
            //指定编译器路径,与gcc-arm-none-eabi的解压路径有关
            "compilerPath": "C:/VscodeTools/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc.exe",
            "cStandard": "c99",//C语言模式
            "intelliSenseMode": "clang-x64"
        }
    ],
    "version": 4
}
  • settings.json
{
    "files.encoding": "gbk"//设置编码模式为GBK(GB2312)编码(即简体中文编码)
}
  • tasks.json
{
    "version": "2.0.0",
    "tasks": [
        //创建 编译 任务
        {
            "type": "shell",//定义任务是被作为进程运行还是在 shell 中作为命令运行
            "label": "build",//任务标签
            "command":"make",//要执行的命令。可以是外部程序或 shell 命令
            "group": "build"//任务的执行组。build: 将任务标记为可通过 "运行生成任务" 命令访问的生成任务
        },
        //创建 烧录 任务
        {
            "type": "shell",//定义任务是被作为进程运行还是在 shell 中作为命令运行
            "label": "download",//任务标签
            "command":"openocd",//要执行的命令。可以是外部程序或 shell 命令
            "args": [//调用此任务时要传递给命令的参数
                //指定调试器配置文件,并给出路径(这里我使用的是CMISM-DAP),share/openocd/.....前的就是OpenOCD解压路径
                //如否使用的是st-link v2,那么就将cmsis-dap.cfg替换为stlink-v2.cfg,这些配置文件按下路径都可以找到
                "-f","C:/VscodeTools/OpenOCD-20211118-0.11.0/share/openocd/scripts/interface/cmsis-dap.cfg",
                //指定芯片,并给出路径(这里我使用STM32F1系列),share/openocd/.....前的就是OpenOCD解压路径
                "-f","C:/VscodeTools/OpenOCD-20211118-0.11.0/share/openocd/scripts/target/stm32f1x.cfg",
                //配置调试器使用硬件复位(SWD:srst_only;JTAG:trst_only)
                "-c","reset_config srst_only",
                //初始化调试器和挂起目标芯片
                // "-c","init","-c","halt",
                //指定烧录文件,APP.elf(APP应该更换为Makefile中TARGET的值) ,并在烧录完成后复位退出连接
                "-c","program build/APP.elf reset exit"
            ],
            "problemMatcher":[
                "$gcc"
            ],
            "group": "build"//任务的执行组。build: 将任务标记为可通过 "运行生成任务" 命令访问的生成任务
        } 
    ]
}
  • launch.json
{
    //扩展中下载Cortex-Debug,配合该文件可进行在线调试
    "version": "0.2.0",
    "configurations": [
        {
            "cwd": "${workspaceRoot}",//运行命令的目录
            "type": "cortex-debug",//配置类型
            "request": "launch",//启动
            "executable": "build/APP.elf",//可执行程序的路径,APP.elf(APP应该更换为Makefile中TARGET的值)
            "name": "Debug Microcontroller",//名称
            "servertype": "openocd", //GDB服务器类型
            "runToEntryPoint": "main",//适用于启动/重启/重置,忽略附加。如果启用,调试器将运行直到给定函数开始。
            "configFiles": [//调试时使用的OpenOCD/PE GDB服务器配置文件(OpenOCD -f选项)
                //指定调试器配置文件,并给出路径(这里我使用的是CMISM-DAP),share/openocd/.....前的就是OpenOCD解压路径
                //如否使用的是st-link v2,那么就将cmsis-dap.cfg替换为stlink-v2.cfg,这些配置文件按下路径都可以找到
                "C:/VscodeTools/OpenOCD-20211118-0.11.0/share/openocd/scripts/interface/cmsis-dap.cfg", 
                //指定芯片,并给出路径(这里我使用STM32F1系列),share/openocd/.....前的就是OpenOCD解压路径           
                "C:/VscodeTools/OpenOCD-20211118-0.11.0/share/openocd/scripts/target/stm32f1x.cfg",
            ],
        },
    ]
}

在main.c中添加串口重定向代码

//加入以下代码,支持printf函数
//GCC环境下串口重定向
#ifdef __GNUC__
	int _write(int fd, char *ptr, int len){
		for(int i = 0; i < len; i++){
			while((USART1->SR&0X40)==0); 
			USART1->DR = (uint8_t) *(ptr+i);
		}
		return len;
	}
//MDK环境下重定向
#else
	#pragma import(__use_no_semihosting)             
	//标准库需要的支持函数                 
	struct __FILE{ 
		int handle;
	};
	FILE __stdout;       
	//定义_sys_exit()以避免使用半主机模式    
	void _sys_exit(int x){ 
		x = x; 
	}
	int fputc(int ch, FILE *f){
		while((USART1->SR&0X40)==0){}//循环发送,直到发送完毕
		USART1->DR = (uint8_t) ch;  
		return ch;
	}
#endif

在main函数的while(1)循环中添加测试代码

HAL_Delay(500);
printf("测试成功\r\n");

编译和下载

按住ctrl+shift+b,将跳出两个任务,先点击build,等待编译完成
再ctrl+shift+b,选择download下载程序(下载前先将下载器连接到板子上)

Windows下使用Vscode开发STM32_第25张图片

运行结果
Windows下使用Vscode开发STM32_第26张图片

总结

gcc-arm-none-eabi对代码的优化程度不及AC5(MDK的编译器),下图给出对于相同的代码,两者编译出的代码大小
Windows下使用Vscode开发STM32_第27张图片

你可能感兴趣的:(单片机开发问题记录,stm32,windows,vscode)