How to develop mcu with Linux

记录下一下如何在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插件


  1. 关闭vscode

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

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

安装mingw-w64 配置环境变量

  1. 进入mingw-w64 github选择最新w64devkit-x64,也可以从这里下载

  1. 解压文件,将解压出来的文件放到自己喜欢的路径(记录下来后面要用)

  1. 进入windows编辑环境变量,在当前用户PATH 添加w64devkit安装路径的bin路径.(路径要到bin文件夹,添加环境后需要重启所有终端)

测试是否可以正常编译

  1. 可以从这里下载一份使用gcc编译的工程
  2. 选择文件夹,右键使用vscode打开
  3. 进入vscode 使用快捷键 “ctrl + `”打开终端,终端尽量选择git bash.(git bash 需要安装git)


4. 使用make clean;make -j命令进行编译,看到输出了elf代表gcc + vscode编译环境搭建成功

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

安装python环境

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

安装pycod, 以及安装pack包

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

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

  1. 步骤一提示不在环境便令,则添加到环境变量
  2. 检查pyocd是否安装成功,输出版本号则安装成功.(添加环境后需要重启所有终端)
1
pyocd -V

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

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

使用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

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

配置调试环境

  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进行调试