使用arm-gcc编译工具链,openocd开源调试工具,makefile脚本
gcc-arm-none-eabi下载
https://developer.arm.com/downloads/-/gnu-rm
选择win32.zip下载,选择原因是win32是windonws版本,.exe与.zip的区别是前者通过安装,后者解压后使用
在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压缩包删除了
到此,gcc-arm-none-eabi安装完成
Download pre-built OpenOCD for Windows
https://gnutoolchains.com/arm-eabi/openocd/
这里我选择了20211118这个版本(原因是我对新版本的操作语法不熟悉)
将openocd-20211118.7z解压到C:\VscodeTools中去,得到OpenOCD-20211118-0.11.0,然后就可以将openocd-20211118.7z压缩包删除了
到此,openocd安装完成
Make for Windows
https://gnuwin32.sourceforge.net/packages/make.htm
配置make的环境变量,打开高级系统设置(可以通过搜索框搜索高级系统设置快速打开),进入环境变量
用STM32CubeMX生成一个工程,使用串口输出->测试成功
生成代码后,通过code打开文件夹,创建.vscode文件夹,在其中创建c_cpp_properties.json、settings.json、tasks.json、launch.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
}
{
"files.encoding": "gbk"//设置编码模式为GBK(GB2312)编码(即简体中文编码)
}
{
"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: 将任务标记为可通过 "运行生成任务" 命令访问的生成任务
}
]
}
{
//扩展中下载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下载程序(下载前先将下载器连接到板子上)
gcc-arm-none-eabi对代码的优化程度不及AC5(MDK的编译器),下图给出对于相同的代码,两者编译出的代码大小