how to develop mcu by gcc and vscode

记录下一下如何在windows,如何使用gcc+vscode对MCU进行开发

使用vscode + gcc编译MCU

安装vscode 以及各种插件

  1. 进入vsocde官网下载windows最新版本的vscode. 也可以在这里下载

  2. 双击安装程序,自己选择喜欢的安装路径
    选择自己喜欢的路径

  3. 然后一直下一步,此处强烈建议勾选(win10 用户安装后可以右键文件夹,使用vscosd打开)

强烈建议勾选

  1. 进入vscode 选择插件市场,安装中文(安装后会提示重启vscode),C++插件(Microsoft 系列), python插件(Microsoft 系列), Makefile插件, Git Graph插件
    插件市场搜索
    安装中文,提示重启
    安装C++
    安装Python
    安装makefile
    安装Git Graph

  2. 关闭vscode

安装 arm none eabi gcc 配置环境变量

  1. 进入arm none eabi gcc官网下载最新windows版本gcc工具链, 也可以从这里下载
    官网选择最新windwos 工具链
  2. 点击安装,选择自己喜欢的路径(记录下来后面要用),一直下一步直到安装完成
    选择安装路径
  3. 进入windows编辑环境变量,在当前用户PATH 添加arm none eabi gcc安装路径的bin路径.(路径要到bin文件夹,添加环境后需要重启所有终端)
    编辑当前用户环境变量
    将arm none eabi添加到环境变量

安装mingw-w64 配置环境变量

  1. 进入mingw-w64 github选择最新w64devkit-x64,也可以从这里下载
    进入w64devkit github下载最新压缩包
  2. 解压文件,将解压出来的文件放到自己喜欢的路径(记录下来后面要用)
    解压压缩包
    将解压出来的文件压移动到自己喜欢的 路径
  3. 进入windows编辑环境变量,在当前用户PATH 添加w64devkit安装路径的bin路径.(路径要到bin文件夹,添加环境后需要重启所有终端)
    将w64devkit添加到环境变量

测试是否可以正常编译

  1. 可以从这里下载一份使用gcc编译的工程
  2. 选择文件夹,右键使用vscode打开
    vscode打开文件夹
  3. 进入vscode 使用快捷键 “ctrl + `”打开终端,终端尽量选择git bash.(git bash 需要安装git)
    选择git bash
  4. 使用make clean;make -j命令进行编译,看到输出了elf代表gcc + vscode编译环境搭建成功
    运行make指令

使用vscode + gcc + pyocd调试, 烧录MCU

安装python环境

  1. 关闭梯子打开Microsoft Store,搜索python,安装python3.12
    Microsoft Store安装python

安装pycod, 以及安装pack包

  1. 在终端中使用pip 安装pyocd
1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyocd

成功安装pyocd

  1. 如果需要更新pip 则运行,然后重新运行上面安装pyocd命令
1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --upgrade pip

提示更新pip
更新pip

  1. 步骤一提示不在环境便令,则添加到环境变量
    python 包路径添加的环境变量

  2. 检查pyocd是否安装成功,输出版本号则安装成功.(添加环境后需要重启所有终端)

1
pyocd -V

检查pyocd版本号

  1. 创建一个pack包的文件夹,我这里放在了~/AppData/Local/cmsis-pack-manager
1
mkdir -p ~/AppData/Local/cmsis-pack-manager

创建存放各种pack的文件夹

  1. 将网络下载的pack包放进我们指定的文件夹.一般pack包命名为,芯片厂家+芯片型号+版本号.pack,我们把pack放进指定文件夹时应遵循~/AppData/Local/cmsis-pack-manager/芯片厂家/芯片型号/版本号.pack.下图我举例了2个pack包应该如何放置(放置规则并非强制,而是遵循pyocd 自带包管理的风格)
    pack包布局

使用pyocd擦除,烧录,读取,

  1. 擦除flash.c表示全片擦除.-t 后面跟着芯片型号(可以通过Keil 魔术棒中的targer查看,也可以通过解压pack,查看pdsc文件). –pack 后面跟着本地pack包路径
1
pyocd erase -c -t lcm32f067 --pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack

擦除演示

  1. 烧录指定.hex文件.-t 后面跟着芯片型号(可以通过Keil 魔术棒中的targer查看,也可以通过解压pack,查看pdsc文件). –pack 后面跟着本地pack包路径. 直接跟.hex路径
1
pyocd flash -t lcm32f067 --pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack build/lcp067-gcc-bl.hex

烧录演示

  1. 从MCU读取指定位置(0x08000000)指定长度(0x10000)的flash,保存成.bin(flash.bin),然后通过工具链转换成.hex
1
2
3
4
5
6
## pyocd 读取flash保存成.bin(可以根据需要修改,芯片名,芯片pack地址,要读取的地址,要读取的长度,要保存的文件名)
pyocd cmd -t lcm32f067 --pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack -c "save 0x08000000 0x10000 flash.bin"

## 使用工具链将.bin转换为.hex(可以根据需要修改.bin起始的地址,要保存的文件名)
arm-none-eabi-objcopy -I binary -O ihex flash.bin flash.hex --change-addresses 0x08000000

读取转换演示

  1. 统一简单的烧录脚本,在工程文件夹下创建一个flash.sh的脚本,脚本内容如下.需要烧录时运行.flash命令即可
1
2
3
4
5
#可以根据需要修改,芯片名,芯片pack地址,烧录app时不建议加入这条指令
pyocd erase -c -t lcm32f067 --pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack

#可以根据需要修改,芯片名,芯片pack地址,.hex文件路径
pyocd flash -t lcm32f067 --pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack build/lcp067-gcc-bl.hex

bootloader 擦除烧录脚本演示

vocode 安装调试插件

  1. 安装Arm CMSIS Solution, Arm CMSIS Debuger, Arm Keil Studio
    安装调试插件

配置调试环境

  1. 在项目工程.vsocde文件夹下创建 launch.json文件,文件内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
{
"version": "0.2.0",
"configurations": [
{
"name": "CMSIS Debugger: pyOCD",
"type": "gdbtarget",
"request": "launch",
"cwd": "${workspaceFolder}",
"program": "${workspaceFolder}/build/lcp067-gcc-bl.elf",//替换成自己的elf文件路径
"gdb": "arm-none-eabi-gdb",

"initCommands": [
"monitor reset halt",
"break main"
],
"target": {
"server": "pyocd",
"port": "3333",
"serverParameters": [
"--target",
"lcm32f067", //替换成自己的芯片
"--pack",
"-pack ~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack" //替换成自己的pack路径
],
"options": {
"frequency": 1000000,
"allow_no_cores": true
},
"override": {
"memory_map": [
{
"name": "RAM",
"start": 536870912, //替换成自己芯片的RAM起始地址
"size": 4096, //替换成自己芯片的RAM大小
"access": "rwx"
},
{
"name": "FLASH",
"start": 134217728, //替换成自己芯片的ROM起始地址)
"size": 4096, //替换成自己芯片的RAM大小
"access": "rx",
"is_boot_memory": true
}
]
},
}
}
]
}


  1. pyocd支持J-Link, ST-Link, Dap-Link等,进行调试前需先插入自己的Link,可运行pyocd命令查看Link是否被正常识别
1
2
3
4
5
6
pyocd list -p

# Probe/Board Unique ID Target
-----------------------------------------------------------
0 Arm DAPLink CMSIS-DAP 3a19509cefa9954e01 n/a

  1. 连接好调试线,打开供电.在vscode 选择调试,选择CMSIS Debugger: pyOCD进行调试
    正常进入调试

使用vscode + gcc + pyocd实现live watch调试,仍然无法在运行时修改变量

vscode 安装Cortex—Debug

安装Cortex—Debug

配置调试环境

  1. 在项目工程.vsocde文件夹下创建 launch.json文件,文件内容如下(pyocd + cortex-debug配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
{
"version": "0.2.0",
"configurations": [
{
"name": "cortex-debug + LiveWatch",
"type": "cortex-debug",
"request": "launch", // 也可以写 "attach",都行
"cwd": "${workspaceFolder}",
"executable": "${workspaceFolder}/build/lcp067-gcc-bl.elf", //修改自己的elf文件



"servertype": "external",
"gdbTarget": "localhost:50000",

"runToEntryPoint": "main",
// 如果想要进入调试时自动烧录(app没有校验)请"preLaunchCommands"取消注释,将"overrideLaunchCommands"进行注释
"preLaunchCommands": [
"set mem inaccessible-by-default off",
"monitor reset halt"
],

// 如果不想要进入调试时自动烧录(app有校验,使用pyocd 命令手动烧录再进行调试)请"preLaunchCommands"进行注释,将"overrideLaunchCommands"取消注释
// "overrideLaunchCommands": [
// "set mem inaccessible-by-default off",
// "file ${workspaceFolder}//build/lcp067-gcc-bl.elf", //修改自己的elf文件
// "monitor reset halt"
// ],

"preLaunchTask": "Start pyOCD gdbserver", // ★ 和上面的 task label 对上

"liveWatch": {
"enabled": true,
"samplesPerSecond": 10 // live wath扫描频率
},

"showDevDebugOutput": false
},
{
"name": "CMSIS Debugger: pyOCD",
"type": "gdbtarget",
"request": "launch",
"cwd": "${workspaceFolder}",
"program": "${workspaceFolder}/build/lcp067-gcc-bl.elf",
"gdb": "arm-none-eabi-gdb",

"initCommands": [
"set mem inaccessible-by-default off",
"monitor reset halt",
"break main"
],
"target": {
"server": "pyocd",
"port": "3333",
"serverParameters": [
"--target",
"lcm32f067",
"--pack",
"~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack"
],
"options": {
"frequency": 1000000,
"allow_no_cores": true
},
"override": {
"memory_map": [
{
"name": "RAM",
"start": 536870912,
"size": 4096,
"access": "rwx"
},
{
"name": "FLASH",
"start": 134217728,
"size": 4096,
"access": "rx",
"is_boot_memory": true
}
]
},
}
}

]

}


  1. 在项目工程.vsocde文件夹下创建 tasks.json文件,文件内容如下(pyocd + cortex-debug配置)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
{
"version": "2.0.0",
"tasks": [
{
"label": "Start pyOCD gdbserver",
"type": "shell",
"command": "pyocd",
"args": [
"gdbserver",
"--port", "50000",
"--telnet-port", "50001",
"--target", "lcm32f067",
"--pack", "~/AppData/Local/cmsis-pack-manager/Keil/LCM32F0xx_DFP/0.4.70.pack"
],
"isBackground": true,
"problemMatcher": {
"owner": "external",
"pattern": { "regexp": ".*", "message": 0 },
"background": {
"activeOnStart": true,
"beginsPattern": ".*",
"endsPattern": "GDB server listening on port 50000"
}
},
"presentation": {
"reveal": "always",
"panel": "dedicated"
}
}
]
}


  1. pyocd支持J-Link, ST-Link, Dap-Link等,进行调试前需先插入自己的Link,可运行pyocd命令查看Link是否被正常识别
1
2
3
4
5
6
pyocd list -p

# Probe/Board Unique ID Target
-----------------------------------------------------------
0 Arm DAPLink CMSIS-DAP 3a19509cefa9954e01 n/a

  1. 连接好调试线,打开供电.在vscode 选择调试,选择cortex-debug + LiveWatch进行调试
    正常进入调试,且支持live watch