“ 从ubuntu20.04入门到完成stm32程序的调试。”
/ B9 S0 T3 C1 Y( _2 g4 }+ {9 w
/ i- h6 } h3 l. L6 [
" a1 t: @, d. H8 D! g
, l$ v. T; G; c8 D' {3 v1、更换软件源
; ?% V* g: O5 \2 c2 k4 A源文件(sources.list)* v2 r; y5 N$ l: N0 s
更改源(Ubuntu20.04对应的源)3 P) V- O6 P0 F( `2 h
更新源6 K* V! r" J/ e7 x8 |
/ w8 f' F) C* J" ] a; R' @' ^2、安装拼音输入法
+ A; s) x& D) N2 _: ^9 vRegion&Language->Language Support->Installed Languages6 y P" \7 p1 l3 x1 p4 H
Input Sources->"+"->chinese->Hanyu Pinyin
9 l5 a- T1 P0 j8 B9 m8 T. h' X5 t" P3 L) O) ~7 e! G
3、安装VSCode+ _' J( `) y4 n3 E7 X: N) b( x
下载.deb程序包
2 l& j; p8 b3 D使用dpkg安装
- B: ~5 p1 `, G& {, X, i4 ]调整设置
4 T! F B% ?4 [3 v9 [启用Title Bar4 _3 c% f4 |! v% ] C9 x7 R
安装插件
3 I6 m0 q% ~) E& D* t+ I {9 {: U; X
; J, @) k9 {' Z2 n# u* {- a, S4、安装Build Essential及gdb
3 L2 J2 M2 K6 W+ R i: Ebuild essential介绍9 f, Z" }$ g8 F, i2 k0 m. @* K
命令行安装build essential和gdb/ o" E* f k( B# o" q, Y; @& W
Linux C程序开发简介. N' j% ]2 X7 |- s, p1 Q
无makefile
- d, g( `* v$ y- O8 Q有makefile
3 U+ T9 S7 j4 H! o; `; Z生成.vscode文件下的debug配置文件
- Y# w* ?- G' t5 ^1 q" X8 P1 z生成task.json文件/ R! R% F: j7 k: `
生成launch.json文件+ e, L$ Y' G1 e! I8 S
生成c_cpp_properties.json文件
0 b- [+ m8 U8 O- \8 F V2 A% P( S" C% O2 G& P
5、安装Vim
5 M$ p' i* B+ F: m" }% I+ Y, I6 c3 O; O/ r& d
6、安装gcc-arm-none-eabi
+ D3 f5 Q6 A" w) A* e* I* ?下载嵌入式gcc编译器 e4 T! r) Z+ o' M( p& [
解压
2 A% s v2 P2 d% ^# \添加gcc-arm-none-eabi下的可执行文件命令到Terminal
1 f+ l. j0 m4 b. k+ X% _
' d- c( e7 D9 o& m( E: }( {% i7、安装stm32cubemx
% g- l/ {; [! l! P+ g7 J下载stm32cubemx- f. M2 ?1 o( s/ e0 E" `7 ?
安装# T+ L/ ^+ h- K6 `3 a
增加图标到菜单. \6 J0 P- }5 L) x
# t' C4 q! `" B8 y3 E9 c# L v8、使用stm32cubemx生成初始代码
+ F* y7 F$ r! A: p选择芯片->配置->Generate7 j6 Z4 `# w8 M9 I3 q$ ~4 I
勾选PinOut-Debug-SerialWire
" B/ J+ b9 s: d: Z. [8 z; s' R8 n2 _' E2 w) q v" `+ K: Q
9、配置VSCode
6 g+ u) `$ ?7 b. Y) p使用vscode打开上述生成的初始代码( r- k- Q: O u- S, {8 [
生成VSCode配置文件% g! l6 R( D( q+ C) x
c_cpp_properties.json+ a8 r2 o3 g* V+ K9 m8 @
task.json% ?# X2 _: y3 Z! R9 k9 K b
settings.json o$ a) n( F* \! y; i, @" T+ ]
宏定义包含
9 A# ^3 G$ k& Q; s$ f# a2 Hmake编译/使用ctrl+shift+B
( R# x4 y" Y# Q& u9 k+ r( M j0 I" B5 t
10、调试! a3 t1 B- n% q% D
安装openocd
# {$ B8 E# s% Y* j8 a& D/ e在tasks.json中使用openocd进行编译后的下载
/ ]5 b+ U- d( w/ L- ^! D9 Z使用openocd进行调试. }1 p4 u6 [: q* R4 J* H9 m3 [
安装Cortex Debug和Venus's Cortex-Debug插件- E3 ?# M: f2 U# C" X/ P; ^4 q$ T8 k
添加调试配置' |. u2 U! H" s. W
选择cortex debug,生成launch.json/ o/ o- x I0 M3 U
调试
( z9 n* \! v# e" k# U8 E6 H5 x7 J/ i( @! o) ?% _8 M7 Z
11、使用VSCode串口工具
4 T6 l( A! C% j9 ~, ^, {. c安装serial monitor# X5 f% P7 N: Q7 _* k. N3 Z T
查看连接的usb
# n2 N/ ^* |- O( D7 s加权限
0 ]4 l, f3 r: ^$ P
+ w8 E; K2 X0 [" q. v$ ]12、使用git3 K* n" b# S" V
01更换源
: `# b# H$ ?1 B. q$ V1、源文件(sources.list)
1 [9 w: B* W, h5 w4 H; F- jchen@ubuntu:/etc/apt$ ls -a+ M1 ]1 Q! I& H( l; `7 r% Q! |
. apt.conf.d preferences.d sources.list trusted.gpg.d! n: h* n. Q H4 ]3 ?* i4 O' I
.. auth.conf.d sources.bak sources.list.d6 d6 \9 k4 r, i; P+ U% ` O3 {
, z1 @- a0 h2 j6 M J2、更改源(Ubuntu20.04对应的源)4 a; y0 I& J* c5 R) r8 ~% A2 z
- chen@ubuntu:/etc/apt$ sudo gedit sources.list
复制代码- #阿里源(Ubuntu20.04)1 ]$ @. `$ ~5 h- _1 Z
- deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse# f1 I0 f9 k- D( O( I
- deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse( l" D, ^# J; q/ Z9 h% d- F1 e1 y
- deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse2 t" u5 a% J8 p5 ]5 [$ B" g( u
- deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse- V7 e" J- n3 R' P7 q/ C
- deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
# z3 ?# D: Q) g r b8 P - deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
' I: X" r1 b& C* X2 D# V" X) B - # deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse! L$ F0 ^3 i5 [8 _5 t
- # deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse/ a3 h* B1 }5 W' ^
- deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse7 M7 r) U& e$ V! {! I1 E8 n
- deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
复制代码- #清华源(Ubuntu20.04)2 [5 W2 R0 K8 V
- # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
: h6 {( f, d/ H8 ~ - deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
; d& d1 t: R/ o9 W& v - # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
) X5 ~& X9 u- T0 X j - deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
9 m+ ~* f7 V8 z) k! U. h( x; j& s - # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse: Y8 K9 b$ c( ^" v# R9 O
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
7 w5 S. J! v0 r( Q; ~0 C - # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse$ D/ A7 O- s; x
- deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse8 U8 [1 Y% l1 _( Y5 I* O! A* F( J
- # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse; U* f; [* m& ]7 i# U, s0 H
- 7 X$ O, G7 R3 @, I
9 s/ M- T: {; N0 k8 m- # 预发布软件源,不建议启用, j0 D9 Y# ^0 h$ s
- # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse2 a" ^/ q# D& V9 A( U
- # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
复制代码- #中科大源(Ubuntu20.04)8 [( \5 ^$ L; _8 O, {6 m
- deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
/ S- h5 Z. u9 p; X( k; h$ J - deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse2 c/ K+ Y/ f* V# w
- deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
s' [/ _. H3 w! o - deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
9 \. A k# | P - deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
2 C: Y; S% ] J! }0 [# s - deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
0 F7 K/ u# `; Y) M& L8 | - deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse; N5 x! b# I7 }
- deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
+ J: t3 y; a$ o. ]& v( H+ e - deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
. ?+ d. S4 z! t6 l3 \' N( P. E - deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
复制代码
# o/ J. ?2 C" V" p' i3、更新源
/ `- F [# e4 p A1 Z0 d0 }, @) U7 v9 j- X' m/ ~
02安装拼音输入法
2 k. x* j Y. G ^1、Region&Language->Language Support->Installed Languages1 Y" i3 }; G9 i* _/ N
; ~% b( ?. i6 K& M+ \2 Y$ \+ Y0 h; r
8 R5 b# n1 {4 V- m9 e3 q
2 I/ f' s0 q8 z1 W2、Input Sources->"+"->chinese->Hanyu Pinyin. ?) M* g6 c/ p- x; B
- chen@ubuntu:~$ sudo apt-get install ibus-pinyin
7 W, L9 w/ }& x4 ^5 O& a% `6 e - chen@ubuntu:~$ ibus restart9 L( Y! W/ J& n4 X8 L, D
- chen@ubuntu:~$ ibus-setup
复制代码 ' M o; e4 G/ x* r
- ?% X# [+ ]- t6 D9 C
( ?. i0 p0 i. {2 G6 F' a) Y
]( e! S$ T* L$ d! k4 z( I8 M5 U9 Q0 g: A- ]9 d- h
/ A7 t2 `5 E1 s4 `
9 p9 x6 ]8 l; W7 n. d03安装VSCODE
2 {& R( q) Q* Q2 }' w6 i4 ~3 p1、下载.deb程序包https://code.visualstudio.com/
2 E+ J' M( t! H- `& N6 q6 X, }. ]/ {
2、使用dpkg安装(在Terminal中Ctrl+Shift+C为复制,Ctrl+Shift+V为粘贴)
/ r9 d9 v5 @; ]; ^* d- chen@ubuntu:~/Downloads$ sudo dpkg -i code_1.89.1-1715060508_amd64.deb
& Y6 x- p2 x- Q( y/ e# t - chen@ubuntu:~/Downloads$ code .
复制代码
1 {% Q( d c3 K+ g3、调整设置
+ a! v& f. E4 Z7 H! ?启用Title Bar:View->Appearance->Editor Actions Position->Tab Bar
0 |% Y/ ^4 v. l% X2 q* |9 p) b8 Q% L7 i# `" o$ G! c( ~
* o$ s8 H4 Z+ l, j3 D+ {& E& R
% v) L1 x, ~/ V" t" Q7 r$ D
4、安装插件: j' o( ] h) V
git安装# ]7 r) x8 { v* r4 m6 n, {" h
Download Git for Linux(https://git-scm.com/download/linux)* d3 h4 Q) [( j& K% K" I
2 C! O, C: {+ D3 @% H) K3 G4 d& C
: N7 U4 V" A: C8 y) e8 {! r
# v% K9 P9 n8 @% g- e8 C: P9 L
$ D9 F6 Z$ X3 {' }% O! r; V+ T8 E5 w2 w
命令行直接安装(Ctrl+Alt+T呼出Terminal)
" @2 d# V8 n& n- chen@ubuntu:~$ sudo apt-get install git& F3 K: z7 r+ Y& s" o9 {
- chen@ubuntu:~$ git --version
复制代码 0 \% [( O- X' o% v ~
git设置
9 |$ s9 _* q) K/ ]# g( K \+ a& ^+ L& q
6 U8 Q! r' W; |2 q$ t6 D& j2 ?
0 Q B- L5 k+ B
- git clone https://gitee.com/kevinkerry/linux-stm32.git
8 _% U4 o1 H# K1 F - git config --global user.name 'kevin.kerry'
* p4 ]; b6 {# N) Y% r - git config --global user.email 'ct15762287606@outlook.com'- ^, v& m I L+ {! Z- z: r2 z
5 o d; O& ?1 ]" j+ v- " m' @1 R% I5 n" c0 r0 v4 |
- #示例
; U3 I; i) G2 x4 j3 m& P" e - chen@ubuntu:~/prj_vscode$ git clone https://gitee.com/kevinkerry/linux-stm32.git
! Q) |2 z) r: i/ H. h - Cloning into 'linux-stm32'... u% n# z. v( E. b0 G" _' w- K
- Username for 'https://gitee.com': ct15762287606@outlook.com/ z1 K# q6 W. J' ]# _) a2 ^! ~
- Password for 'https://ct15762287606@outlook.com@gitee.com':
9 I7 d! N) @, a% t: C! M# B - remote: Enumerating objects: 4, done.
. O' f+ f; [0 q# D$ q" i" v6 } X - remote: Counting objects: 100% (4/4), done.
2 g- }2 v, b- n% D - remote: Compressing objects: 100% (4/4), done.
+ g* Q( K) K# f6 X F' o5 Z- z, z - remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 03 z+ j- V+ v( ^* y' [) [- u) a
- Unpacking objects: 100% (4/4), 1.79 KiB | 1.79 MiB/s, done.8 F! t5 f+ @; _& Z% |3 G# D
- chen@ubuntu:~/prj_vscode$ ls
5 O2 N- |* X# |+ D- H+ E - linux-stm32
复制代码
/ R7 o. a: ]7 ~* w0 bGitLens — Git supercharged插件安装
/ t2 ^& q8 {( T8 W6 Q: m
4 { T1 q# u/ f6 J$ Y, F' l
6 D* M3 W1 |- H% L+ i9 B
% P+ C: b$ P3 h% }% A2 {Git History
% [: M* i$ f$ d
; g& S! g3 L4 K* K3 U, j
. e, s! _+ n/ R
% a+ A/ ], y2 N U3 O8 p
Bracket Pair Color DLW$ p9 j2 S) C4 U1 r+ h
# J2 Q- o# I- K2 p1 R! Y) j
/ N1 F# G6 X* ]1 M/ }
0 c4 N0 T0 Y% ~) s; B* OArm Assembly
6 k5 d1 u4 X) C! q: q a
1 R" U! Q$ f K
4 j+ e `/ V% q& ^% ]; D
. }9 l4 D5 A" e/ j5 }/ {$ ~
Venu's Cortex-Debug( j( R! c6 V ] U
( r- }) @5 ~9 e5 }# \
" n# M" X1 q" n, r
2 V! U* y0 M T6 v! W2 K4 zC/C++$ z( z7 |5 u5 u& y0 M2 o
6 Y# _1 x% w( {/ z. }3 Q
h1 r2 l) \: d" l4 q' s \
% e* j) ~4 O9 y0 V5 A v" E
04安装Build Essential及gdb- I8 j4 Z7 ]& g& f7 W% A
1、build essential介绍8 x8 P' _3 l( {0 v, ]
build-essential 指的是编译程序必须的软件包。它本身不是一个软件,而是一个工具集,包含了在Linux开发程序的一些必要的软件包,包括但不限于gcc、g++、make等。
5 b* t6 L7 `! U* b: w. q' \$ P# t* ^3 G
查看该软件包的依赖关系,可以看到以下内容:# c* W) ~8 X% z( Y
- chen@ubuntu:~$ apt-cache depends build-essential
+ G" I/ ~( ^6 T( k, B - build-essential- o. \6 C2 G; ~2 h# s3 N, O
- |Depends: libc6-dev% a6 x& F7 w6 D4 o3 s6 m
- Depends: <libc-dev>
! | ?9 j4 x& t - libc6-dev
9 ~! M, v, q$ ?- Q6 H3 \0 x- A - Depends: gcc
" ~& J4 `9 k: N) C! S o7 C( p - Depends: g++' ~" R9 _" I4 ]3 T* f3 T9 T
- Depends: make6 @- |! d, d% N, X
- make-guile
* J, O% x: b# u - Depends: dpkg-dev
复制代码
; D3 U: B% ~1 O* ~也就是说,安装了该软件包,编译c/c++所需要的软件包也都会被安装。因此如果想在Ubuntu中编译c/c++程序,只需要安装该软件包就可以了。0 z! l1 x. q* T0 ?5 L
! v5 ?2 m$ A8 O; N. B/ ^- ^2、命令行安装build essential和gdb; A" j* c1 t/ ^2 _( b
有时候可能会需要安装gdbserver
% H- w% e* ?/ z) x4 M$ X- chen@ubuntu:~$ sudo apt-get install build-essential gdb
复制代码 , v3 h, a& [! w. X
3、Linux C程序开发简介9 u: v: Y6 w% Y& o
3.1 无makefile' B/ M9 B& N+ s+ ?# @) ?; x
- chen@ubuntu:~$ mkdir linux_c. N/ s7 w$ [' K7 R
- chen@ubuntu:~$ cd linux_c
1 M, }3 Y% p ~" D - chen@ubuntu:~$ touch hello.c
0 ]# H% ~ f; A9 e - chen@ubuntu:~$ sudo vi hello.c3 S) B- X: Q* a+ O$ n
- chen@ubuntu:~$ cat hello.c
- q6 K: J+ _% K2 P# |4 g - #include <stdio.h>
# W* c' { E) y$ B+ e: A E - int main(int argc,char *argv[])
- J$ s1 q5 ~3 r2 g* c" A - {
. [9 W& U3 ]; X9 }* o u& _ - printf("hello world\n");, ]+ t6 B0 r0 v
- }' V" V5 n+ X! c) G1 J& x7 w
- chen@ubuntu:~$ gcc hello.c9 `$ z$ H+ \( ^: P1 _
- chen@ubuntu:~$ gcc hello.c -o hello% X& l [& y K1 M' X, o/ I7 S) T
- chen@ubuntu:~$ ls -al
6 M9 M. l, X0 ~6 ], Q$ \, ^5 o - total 525 R9 u5 A F2 }) \
- drwxrwxr-x 2 chen chen 4096 May 16 18:32 .
) J* Z: T' n; n; g9 A6 L - drwxrwxr-x 4 chen chen 4096 May 16 17:37 ..1 a7 `4 `3 ~1 ?7 r
- -rwxrwxr-x 1 chen chen 16696 May 16 18:29 a.out |; l9 J2 W1 k y! ?; E h# ~
- -rwxrwxr-x 1 chen chen 16696 May 16 18:32 hello. s3 W, a, I0 F" a5 q
- -rw-rw-r-- 1 chen chen 82 May 16 18:29 hello.c3 u2 i; s \$ z- G0 _
- chen@ubuntu:~$ ./a.out: N7 [; [; }( R+ c: j4 o
- chen@ubuntu:~$ ./hello
复制代码 + f, @) [# R* j* ~9 k9 I/ p, |+ M) ^
3.2 有makefile
6 i( K c6 b P2 }; I3.2.1 创建程序文件- chen@ubuntu:~/prj_vscode/linux-c$ touch main.c input.c calcu.c input.h calcu.h
复制代码
& l% Z8 j; ^9 G- Y0 e: I- d! Hmain.c
0 W: ~: A6 B# B" P% M0 W# d+ V9 p, M- #include <stdio.h>' O6 s! S, V% [
- #include "input.h"/ U; b" y7 n( P2 [8 S
- #include "calcu.h"# y. b* J H1 i; q7 [4 U
, f/ f; `0 P+ P( r$ V- # ?8 H! W$ y0 g! `2 B8 K* i0 y# N- U7 d
- int main(int argc, char *argv[])+ i7 v. A% p' k: f2 ~/ u. G. F& p
- {- T& s1 Q! g9 ^9 E0 M+ m0 p
- ) G/ y6 R5 N4 E6 B
- / H$ q: n* C' ?8 v
- int a, b, num;" \8 \. T. H5 R& ?( m* e
- ( _. v% n! X" N5 T* {4 |
" r" @. f* c* l2 c& h, U- input_int(&a, &b);" K( J U. i/ |& k$ ^
- num = calcu(a, b);
% v- |: [; }7 s7 n0 ^ - printf("%d + %d = %d\r\n", a, b, num);" B/ H$ h9 g# f. v, B/ m# \% t* v
- 7 c* ?; X( h! f1 K
- }
复制代码 & [+ k8 v" e* X
input.h- #ifndef _INPUT_H% L" f l! |7 u. Y6 R, s5 s' F) @
- #define _INPUT_H
/ G! {; q$ H6 ~4 g S - 9 C- S& i7 I. n$ \. K7 D0 Q# [$ t- X! f( a
- void input_int(int *a, int *b);0 E' F, ~2 ]4 z+ C/ e! X% H$ c1 K
2 b; S2 ~ c: d- #endif
复制代码 4 s2 E, E1 H2 R5 u! Z
input.c
4 c9 U: x) S$ z5 z- #include <stdio.h>
3 A# u& s! e1 A, s' h- t - #include "input.h"6 e' G3 O$ |( A* H
- 7 _; E% p3 n/ _* q5 c
- ' I+ i" m, n/ o
- void input_int(int *a, int *b)
6 L) ]9 W0 n; l5 H- \5 B1 z - {, f! P" j( K* F8 K
- printf("input two num:");5 X, _! o9 }0 `2 p/ r
- scanf("%d %d", a, b);
2 L) C! K$ o5 A2 ?& o - printf("\r\n");
6 Z X# M& t) h/ H3 c8 @) @ - }
复制代码 : e( w. `8 a) x( L* h/ a5 ]1 ]9 C; D
calcu.h- #ifndef _CALCU_H( c1 k' X* l; L
- #define _CALCU_H; J, r" [0 G/ v4 J s/ v8 U
- " o6 E% O- H8 V) K1 u
0 B% j" I3 z6 K- o- int calcu(int a, int b);
9 H# x. K% x! g% E- d6 u R - #endif
复制代码
# d; ]1 o7 I- ~2 G0 V' Scalcu.c
' T( M6 z; t& A: X% ^- #include "calcu.h"
k' I' j5 d, J: O- b P- { q! x - 0 W9 n `; B* }8 _; Y
- 4 V0 O# i: |+ J4 N* H5 U. n; k, Q
- int calcu(int a,int b)2 E* i7 }) k) K9 Q
- {7 K9 d- G! _* B! \, H) i
- return (a+b);* G6 |# I5 `, l$ b3 b3 d, j
- }
复制代码 $ j) N8 B! i) a& y+ R0 C
3.2.2 编译测试一下
' ^% r8 v# L0 Z' x2 ^; a9 [- chen@ubuntu:~/prj_vscode/linux-c$ gcc main.c input.c calcu.c -o main8 g- Q0 Y6 C) I! f+ R2 d+ p* Y' j
- chen@ubuntu:~/prj_vscode/linux-c$ ./main& D& m9 g4 T) F; l
- input two num:23 565 v3 S7 a% u- ~. w( {1 T8 W& Q1 z
- % j4 a9 C! }7 m
- 3 B& D. T3 M* q
- 23 + 56 = 79
/ M. A) v% y: M: q0 n: B ]4 L - chen@ubuntu:~/prj_vscode/linux-c$
复制代码- chen@ubuntu:~/prj_vscode/linux-c$ touch Makefile
9 O* j( _5 e! m4 F+ O, w - chen@ubuntu:~/prj_vscode/linux-c$ cat Makefile5 M: o+ z( j( u
- main: main.o input.o calcu.o) E, E5 z4 V+ @2 {& K) }
- gcc -o main main.o input.o calcu.o5 E, N1 E5 {3 I5 R4 | m
- main.o: main.c
! _2 A+ F3 L! v$ }+ m) G - gcc -c main.c
8 X- |; J# U( O7 `+ z8 r - input.o: input.c, Z9 {9 H8 \' l& t' ?) W
- gcc -c input.c; n L" ]7 p# y& @9 G
- calcu.o: calcu.c
5 W! g5 C2 F' p u - gcc -c calcu.c8 Q( Q+ ~6 L7 }1 F
- ^. w% L: ^$ f4 H: R {
" s3 \8 r6 l: k7 w3 Y- clean:# m# ` T* M! P
- rm *.o
? j7 b1 ?1 u - rm main
B6 j: K1 h6 K+ ~( C1 }$ U - chen@ubuntu:~/prj_vscode/linux-c$ make clean" v r1 @( }* ^5 ]
- chen@ubuntu:~/prj_vscode/linux-c$ make
复制代码 - }4 `# |! n5 Q2 g+ C
4、生成.vscode文件下的debug配置文件' o9 i) O# {# Z/ I
tasks.json:该文件主要用于配置编译的选项,如果使用makefile或者cmake进行编译,则用该文件调研make或者cmake命令进行配置。. Q( D. B; h+ ?3 K! s' u6 u
launch.json:该文件主要对debugger进行设置
3 k0 ~" D- p) c ]# y+ }2 u6 Hc_cpp_properties.json:编译器路径和intellisense设置
& U8 ?* X3 H5 S% h" q) b1 |' |, n. h! F- s$ R& T+ B
4.1、生成task.json文件3 g2 e# o& f# [4 s8 k0 M
5 @5 K M& Q2 Q! g2 _/ ]2 C
. w; G$ }$ U+ u# v3 g
图4.1.1 Run C/C++File. J; X1 K" d" ?, Y3 L
' |8 d3 n4 e, `. K6 Y" U, j
4 b) s7 q3 ^4 d" ]( y' H2 f. X1 b: p( G7 f7 e3 c3 o7 S* H
修改生成的task.json文件如下
; C9 x- D; e4 z! g- {
+ ^7 f+ z) d4 A6 G9 S - "tasks": [
6 s( T$ P* c+ w/ }9 d - {' b3 j' ?% i; j2 Y6 p
- "type": "cppbuild",
. E; R! ^6 M2 a) n; d5 T - "label": "C/C++: gcc build active file",
) u" b: X( a H! p" ^ - "command": "/usr/bin/gcc",
" V7 Q3 v# ~" s( {' H' ` - "args": [
9 B/ l, u0 w3 A/ S - "-fdiagnostics-color=always",# J* `4 T! A: M; a5 ^
- "-g",
! s' S/ |! V; X6 J) t - "${file}",' c4 e+ [' U: K" E" l1 p
- "-o",
& a1 `" A8 o$ K8 d2 D \! H - "${fileDirname}/${fileBasenameNoExtension}". _# t; W3 a j
- ],
! r/ Z% G$ ]! b" A4 I4 f - "options": {
. G/ _- h: R, r! e7 s+ M - "cwd": "${fileDirname}"1 }& y' G0 S! Y! `$ T( q4 {
- },
# k3 F8 {. i2 A* y+ _ - "problemMatcher": [
* J, P9 j6 S9 G( H6 a- c - "$gcc"8 i9 }6 `& b5 I; h0 R1 d9 I
- ],
. t$ _4 ^* i* i" s9 |0 a - "group": {/ V+ P0 n+ {0 E7 _$ A3 ?' b. A
- "kind": "build",
: a- i$ T" ~5 |6 b - "isDefault": true- Y' G; W( h c
- },0 h+ e4 Y, f) B2 \0 K" n! i
- "detail": "Task generated by Debugger."2 ?$ @/ j+ S1 a% r1 p4 L; j
- }2 a; z( B" e: O% z
- ],
$ C8 P! N0 Y, m; j: w - "version": "2.0.0"- {9 a# V) X8 }5 a# @
- }
复制代码
0 C- c& Q; C( D U& C; M修改如下- {2 v5 l6 u2 a' j
- "version": "2.0.0",' T9 \& ]$ G) E" }8 x: B
- "tasks": [
0 w5 F: v4 H9 }4 L* [2 }5 N/ I - {
. u$ I' [( h( A6 G" s( a/ [ - "type": "shell",. I6 q8 {. f- B( f9 g2 Y
- "label": "C/C++: g++ build active file",
, {! |, w% |. R* B4 P9 O - "command": "/usr/bin/g++",
- E( E u" V) g - "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"]," J6 p' b3 W0 F# t% Z
- "options": {
, w: [8 o: I$ t/ M - "cwd": "/usr/bin"2 m: r1 V3 |/ X! U" A9 u
- },% f. {1 M$ ] A+ D' d$ B
- "problemMatcher": ["$gcc"],
# _& A$ q3 x* X+ ^1 V& a - "group": {
% e' T; S# \ E6 t! l4 b - "kind": "build",
+ R( P. v' ?% w: P" L0 i+ z/ h/ p - "isDefault": true9 n: o: _. D, u
- },- ?% B! F8 w! a' P0 Y
- "detail": "Task generated by Debugger.", C+ B" @) F' D2 U
- } `0 ], B) z9 T( c4 E
- ]
7 g0 v8 @3 ]; ^; B0 D - }
复制代码 0 H% K/ x" q+ ^/ I, Y4 H
command 代表使用什么程序去执行文件,这里使用的是g++. args表示的是传递给g++的参数,表明使用了什么文件(-g 后面的file文件所指内容),生成了什么文件(-o 后面文件所指的内容)。所以这command 和 args两行参数表达的意思是:使用g++编译器将${file}文件进行编译,生成${fileDirname}/${fileBasenameNoExtension}文件。$ e: z1 M( o0 N& p# U! l, h
/ g5 N2 a: ]/ A. x
上面部分是对单个c++文件或者多个c++文件进行编译。但是如果一个项目使用makefile进行编译,则如何使用vscode 进行配置呢?我们这里进行讲解。由于我们使用make进行编译,所以我们将command命令后面加上make,args后面添加相应的参数。比如我们需要进行debug 所以要控制makefile 中所有的gcc编译命令后添加-g。不然的话,就会出现,编译成功了。但是debug的时候,断点无效,所有的执行都是一下子执行完的情况。由于在我们的makefile 中通过TAG = dbg来控制加不加编译选项-g,如图3所示。所以这里我们的参数添加了"TAG=dbg",这里根据不同的makefile进行不同的配置。5 p& y6 [" ?# S) H. c/ Q1 ^
- {
- D& t( ?5 [8 S* l' T - "version": "2.0.0",# Z2 S! y) t+ F7 |$ J+ \, y
- "tasks": [" g# h7 }2 t. j5 C
- {
" e% |5 n0 W4 @4 r) X - "type": "shell",
0 {2 J# `: T( P" F - "label": "Build",8 m; w) t/ W4 M& {5 `9 C4 P% T
- "command": "make",
" \# ]; w' T1 p; | - "args": ["NTHREADS=1", "TAG=dbg"],, }3 p. d- U2 z! o, h
- ! f& Y' t$ T6 c9 _, j
- " k& n4 [+ A$ D% [5 t1 z u
- "group": {
4 M) y' |5 F; q0 ~% ]. a( a+ o9 b - "kind": "build",
/ Q2 M$ }7 T, z# C5 l( p: Q - "isDefault": true/ E) q( p9 @! f
- },
8 W# q0 L- _* z2 @ - // "detail": "compiler: /usr/bin/g++"
6 H; U( T6 T r: O8 Q - }
/ F( L N! U+ V7 C/ R; g - ; o f, M" Q# @% [- @- i
- }
复制代码
4 z0 a. |3 s7 }" D& h一种可行的Makefile文件内容(gcc后添加-g命令)8 V2 ^! f: J% h$ l
- main: main.o input.o calcu.o! R! m l. M5 [: c! c
- gcc -o main1 main.o input.o calcu.o
6 X' A. o& [9 K- q( Q - main.o: main.c) d& `6 ~3 f; T- [' ?) Y8 G
- gcc -c -g main.c; E# F/ `8 |# J7 x* _
- input.o: input.c
" {: J, z2 \3 T8 ^0 y( X- D& ]) R1 Z - gcc -c -g input.c
8 q- I9 W+ @* ]$ o& L/ h - calcu.o: calcu.c
+ q* d; P2 Z, Y+ S0 n - gcc -c -g calcu.c' o* N1 M& m( a6 A/ P* P0 p1 V
- : @7 P2 n5 c# i3 _9 |
' a7 r P( H9 f, p1 r8 I; f1 E- clean:+ m2 }% s0 Z8 f/ R/ c5 f! v) J
- rm *.o5 r$ L' W; {# H4 c0 f- a! N
- rm main
复制代码
m4 X7 j* t$ r' p1 t4.2、生成launch.json文件
3 N( M) v# z& p2 \" u% F(注意只有在.c文件中才会有下图中右上角的图标显示)$ W9 N: y( r# U3 `6 z0 a- v
7 `- J. O9 a6 z* l4 C! w; Y
, m# h) v) d6 o0 G* |0 P- i/ ^
2 [! I9 Z% L' i: `7 b
! {- L9 S1 h" u3 M) B/ b
图4.2.1 添加调试配置文件
$ b3 r% f! a1 W- {
. \' U' c V6 S - "configurations": [
: i G8 W3 ^" M x `: A - {
- y. Y d9 n" R# [- F& U9 m* c - "name": "C/C++: gcc build and debug active file",
8 R* y& D6 f O; e' ?. M9 Z3 U8 N - "type": "cppdbg",5 r* n) V4 b8 N# X3 E; Z) z! r
- "request": "launch",
+ X ?; ?9 z D1 `5 ?0 v' b - "program": "${fileDirname}/${fileBasenameNoExtension}",
d6 ^; c/ y. D/ |1 x* f - "args": [],
2 a) Z$ g# _( N+ u3 r# G, b$ y - "stopAtEntry": false,2 u8 [5 a- Z& E" w0 @
- "cwd": "${fileDirname}",% `. f: ], F, t+ b4 C7 X
- "environment": [],
3 `: K' t2 n/ y$ n8 P8 |& o( p5 L! j - "externalConsole": false,3 T( _! T' v0 i* U8 L! x) O! c& c2 E2 c
- "MIMode": "gdb",8 i" L) x; _7 u9 V; _
- "setupCommands": [
$ J, {+ n+ {& A$ o$ e# b% `: W5 x - {$ @9 T4 d8 X+ @$ u& Q
- "description": "Enable pretty-printing for gdb",! v9 O+ p J- F1 k0 s0 L( g" a
- "text": "-enable-pretty-printing",
" }0 U1 U7 Y, O7 I4 x' F4 s - "ignoreFailures": true7 V/ U3 L. o3 y$ ~& y
- }, P1 E+ S' }+ Y+ _3 a
- {
7 X# q: I7 T1 r3 U. E, V - "description": "Set Disassembly Flavor to Intel",; {/ I1 ]. T3 l" Z
- "text": "-gdb-set disassembly-flavor intel",
7 [# c( {2 o5 w6 Z - "ignoreFailures": true
2 U5 Q& u/ l0 D+ f8 C, S) @0 ]4 O - }$ u! E/ k% c0 p6 R/ f" C" U1 w+ h
- ],
. _3 E- }9 W8 p3 r }- | - "preLaunchTask": "C/C++: gcc build active file",9 w8 k! X+ C% P7 X6 T% r7 B; T
- "miDebuggerPath": "/usr/bin/gdb"5 i( T, ^" P) M& q& R0 x
- }* D- e3 W# a+ u, }- [& @. v
- ],# v8 r$ j$ B& l- P
- "version": "2.0.0"
3 d, b- j3 V9 M' F - }
复制代码 k8 ^% e1 U4 p: s$ ^* r1 a0 t
修改生成的launch.json文件如下# Z; s% l' W: V
- {
! Z8 m( x+ J, Q% `7 ? - "configurations": [
: N; P& V1 `( W* Z* r5 I - {
+ f. f8 ]7 ]+ Z3 r% a- x5 @6 p - "name": "C/C++: g++ build and debug active file",! j/ V2 T! M9 q" `2 I
- "type": "cppdbg"," v( b% {, @7 J' j
- "request": "launch",
1 K' A9 g: ?9 J# F* E" i. r, Z" [ - "program": "${workspaceRoot}/a.out",3 ~: f" m4 G# `1 @6 D0 f) e
- "args": [ "1232"],
9 d+ A f- {. ?$ }7 U9 m - "stopAtEntry": false,( T! { a8 T- z5 Z. x
- "cwd": "${workspaceRoot}",
/ u- r8 y9 d, V+ X D - "environment": [],
; t: M$ f/ B) t( v - "externalConsole": false,
2 w- Z; y. b% g! S1 F8 { - "MIMode": "gdb",; |/ D" U2 A4 }& Y: {
- "setupCommands": [
k) q* u1 M! k$ S/ | - {
! `. G1 g& e; V+ A& y3 O4 r - "description": "Enable pretty-printing for gdb",
1 U3 _ j4 D2 j) U' o - "text": "-enable-pretty-printing",
7 `+ d9 c. @2 b! L% p - "ignoreFailures": true6 k; i9 S/ C0 n8 ^2 N
- },4 c7 E& N- {( x. R* E
- { Y+ S4 W$ S$ a2 |& X
- "description": "Set Disassembly Flavor to Intel",1 U: ?1 p4 O8 f* ]" O$ l# T* J
- "text": "-gdb-set disassembly-flavor intel",
, ?% x7 N S5 z9 K) `* z1 i% y - "ignoreFailures": true* b9 ]2 V! p9 E/ W
- }7 _6 d5 B/ p& k; Y* z
- ],6 R% F5 Y# E% R+ k3 F8 `4 k
- "preLaunchTask": "Build",
9 t/ m* Q- B, b" y7 m - "miDebuggerPath": "/usr/bin/gdb"
0 q: C$ O k6 J% @8 z- M, s - }
( y7 ~2 b9 e; q - ], l1 f0 D2 k0 F c; x/ U, _, X
- "version": "2.0.0"9 @' W, P7 c3 S; r' [7 W) X; s# P
- }
复制代码 " x* x1 b. U, @' S/ A; q4 R
"program"选项代表,需要进行调试的程序,所以这里需要修改为对应的文件。"PreLaunchTask" 代表debug流程的前序任务,这里的内容需要和tasks.json中的label相同。"args"可以添加执行程序的过程中,需要添加的参数。在下面的代码中,我们就添加了cacti程序,以及参数。
8 S# K% U, b3 n7 \8 P _# Q# E% V+ g6 [& R
4.3、生成c_cpp_properties.json文件
+ @4 G: f' [* N/ ~1 k5 P$ ^ctrl+shift+p 搜索C/C++:Edit configurations(UI) 即可生成该文件$ I8 X. U. X9 F" f4 z
- {7 c6 K6 l0 g% ^5 ]' j: Y% s
- "configurations": [6 A2 }6 @' n; B1 y" o
- {
" w' P7 ~9 H# b' ~8 K$ Z+ e - "name": "Linux",
2 p: L% B S h+ I! b: O - "includePath": ["${workspaceFolder}/**"],7 W6 G* Z7 L& R" M* i9 \$ H B
- "defines": [],
" u8 g- M# q8 y" [# z1 E' \1 G - "compilerPath": "/usr/bin/gcc",6 h/ p0 q$ a6 q7 h) h: i2 e
- "cStandard": "c11",& N1 O7 n7 n% ]& A: E c* T# d
- "cppStandard": "c++17",
+ f3 B+ N! c5 M$ [2 r' T& X - "intelliSenseMode": "clang-x64"+ I$ C* C, W% U9 F. _0 ^
- }
0 _. a% g4 s3 T6 E$ z' S - ],6 c" S' R$ ^7 e. ^
- "version": 4
% f, h# X0 D# a) O) T - }
复制代码 $ w8 v% t) {- G n- a( q
05安装Vim
4 m4 z c$ y5 f' w! P1、命令行安装8 r7 s8 ^' n1 I3 r; Y/ D
- chen@ubuntu:~$ sudo apt-get install vim# ?, E' M' I& M4 T+ X
- chen@ubuntu:~$ touch a.txt
9 M* \$ s8 L) l9 { - chen@ubuntu:~$ sudo vi a.txt
复制代码
8 }: i w$ c. [3 j06安装gcc-arm-none-eabi5 N4 N) X; U* z+ w+ o' J3 K
1、下载嵌入式gcc编译器
( n! `/ A5 ?6 X8 R/ K& }3 H( g4 `3 [https://developer.arm.com/downloads/-/gnu-rm
5 R1 Y0 l6 B; S; n) Q6 r [5 r- ~5 M$ g7 G% z8 j: ?3 T
4 ^; s* m$ ~3 _) @/ f8 y# U- I: L0 H' Z) v! D. x
2、解压gcc-arm-none-eabi-10.3-2021.105 z. ^: l1 N, ?7 q; p' J T
- chen@ubuntu:~$ tar -vxjf gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2
! v2 O( V* g( J, J, f# }5 S - #对于bz2、gz文件解压 Y @2 _/ o' e, J' T3 ]
- tar -vxjf test1.tar.bz2
v+ t B" w' k# h - tar -vxzf test2.tar.gz* A6 ~: I* r6 Q7 P5 H
- #对于bz2、gz文件压缩9 f3 U( R2 L8 r5 h; _: _8 M
- tar -vxjf test1.tar.bz2
9 Q! r: g9 M- J; e" G9 f5 u: y8 } - tar -vxzf test2.tar.gz
复制代码
: C# X0 ^$ x, ~2 s, s8 V9 i3、添加gcc-arm-none-eabi下的可执行文件命令到Terminal(终端)
3 j6 \- a* \/ B+ F0 |, n- chen@ubuntu:~$ sudo gedit .bashrc
1 ~, Y' s3 t) f/ k. C0 B; r - #在文末添加下面一行- X+ Q% s4 X" B* f$ B1 `
- export PATH=$PATH:~/gcc-arm-none-eabi-10.3-2021.10/bin$ j& Q7 G& X' l! v# b9 V
- #添加上述行
2 L2 ~, |8 i% q - chen@ubuntu:~$ source ~/.bashrc+ s/ M8 I7 z( x) ~# |) l
- chen@ubuntu:~$ arm-none-eabi-gcc --help2 K# W* x, n ?* \) X
- chen@ubuntu:~$ arm-none-eabi-gcc -v
复制代码
/ Q) x2 \9 `: \8 w% K+ u X% D07安装stm32cubemx
" q Y% T3 N4 L Y' H5 u1、下载stm32cubemx2 ]9 e' h3 H1 }% t
https://www.st.com/zh/development-tools/stm32cubemx.html8 J. Q5 {! l4 I: O) x
4 w/ \9 B! E# B* [1 @9 S! m* R1 P
. s8 X& u7 i4 h2 D* j" X& H
3 O. G }# W3 [) l _1 y' R2、安装- chen@ubuntu:~/Downloads$ unzip en.stm32cubemx-lin-v6-11-1.zip8 y/ d$ p* ?& z# T% b' ]( m
- chen@ubuntu:~/Downloads$ sudo chmod 777 SetupSTM32CubeMX-6.11.1+ }' p# ^. H% d5 i2 c& o! a
- chen@ubuntu:~/Downloads$ ls -l% g: W2 @0 p& \; U
- -rwxrwxrwx 1 chen chen 539136342 Apr 11 09:41 SetupSTM32CubeMX-6.11.19 ]! |8 d$ y. i0 n! @# k8 v# ~& d/ u5 f2 z
- chen@ubuntu:~/Downloads$" {% F7 ]3 d* O& v# P& S
- chen@ubuntu:~/Downloads$ sudo ./SetupSTM32CubeMX-6.11.1
% S7 p {. x) L" `6 o1 L - chen@ubuntu:~/Downloads$ find /usr -name STM32CubeMX
( Q" S- `. v) P# x d$ A, b - chen@ubuntu:/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX$ ./STM32CubeMX
复制代码
' H& ]: U; Z" I) a- i7 y* W3、增加图标到菜单
$ j8 i5 x. Q d R& K7 ^- chen@ubuntu:~$ /usr/share/applications/
0 B1 O$ A; B7 J: X L - chen@ubuntu:/usr/share/applications$ sudo touch stm32cubemx.desktop
8 l3 i! z6 a! W8 a. r) P3 D4 Q - chen@ubuntu:/usr/share/applications$ sudo gedit stm32cubemx.desktop
8 r% @5 T; `7 {. E* S. B3 d6 G - chen@ubuntu:/usr/share/applications$ cat stm32cubemx.desktop
m0 f& c) L3 w* y4 f - [Desktop Entry]% w+ O7 b8 W1 K
- Type=Application
+ y2 j( K1 h; F: ?/ B - Name=STM32CubeMX
* s# \: e* M9 i0 Z0 P. V - Comment=STM32 Development Environment5 L, K1 k7 X# ]
- Encoding=UTF-8. t/ I8 G4 N: g7 {1 e5 N
- StartupNotify=true( j8 X3 o w {) Y0 Q
- Terminal=false' `4 U3 c8 X6 T9 z- U9 ~% s
- Categories=Development;java;c;c++;
/ l/ U- m8 H7 x. x- z1 G) g - #icon= ##########图标的路径,自己找一个就行! [3 ]& r2 K: I$ {. z0 i9 l
- Exec= /usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/STM32CubeMX L1 k0 f/ U+ E7 `" N& Z& x+ Z
- chen@ubuntu:/usr/share/applications$
复制代码 * S8 Y5 q# O, W- z/ P5 A2 r% N2 M
08使用stm32cubemx生成初始代码
: C6 C1 X8 ~" m* F1、选择芯片->配置->Generate
1 Y9 t' b* B. f. {: I
6 L; m" J F5 E3 K t; A
5 f5 J; z8 h1 \$ k' h5 i; \. H( k3 Z4 _) C- \3 P% }# x
2、一定要记得勾选PinOut-Debug-SerialWire否则后面下载程序时会报错Error: init mode failed (unable to connect to the target) 。这个是巨坑,一定要小心!!!!!!!!!!
& k" z# l2 h& }( Z. E( k2 k- o, y7 @' D1 K- G
+ c2 v- z" X" o# u+ F
- _/ G- E' F( K3 @ v
09配置VSCode4 V) q- [2 }! z4 Z7 w e
1、使用vscode打开上述生成的初始代码; m$ I1 v/ p, E5 `* `2 d+ H
2、生成VSCode配置文件
8 W# m! [* G$ D& e2.1 c_cpp_properties.jason
$ B& A; `9 |* Wctrl+shift+p->Edit Configurations(JSON)生成.vscode/c_cpp_properties.json文件
/ T$ ?, L( `% |+ M, U- D( k$ D+ M7 Q6 G# U/ l8 ^, q
3 S' H6 D4 z! q) O6 j( i+ Z
- {
6 r2 z) j& |* B( ] - "configurations": [8 d9 P4 u4 u* @& e
- {/ s- S; L. } X# J% f5 G: u
- "name": "Linux",. u, u4 h5 E9 j+ }7 r
- "includePath": [9 k% x) O `+ c4 a+ o2 J# Y$ e
- "${workspaceFolder}/**"7 K- }( d; x$ P- h- o1 ]+ \
- ],
& @" z5 V4 G: K, k7 I - "defines": [* R9 p1 }9 t2 ^; B+ N
- "USE_HAL_DRIVER",
( `- v' ~- L7 ]# _5 k% E ? - "STM32F103xB"$ ]& j0 o/ b9 \. C
- ],8 d% q. `8 [1 F4 D) [8 \) S4 p/ R: Y
- "compilerPath": "/home/chen/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc",
4 J8 Q2 P! G: q! z" a' c - "cStandard": "c99",1 w3 `9 C. C3 p: K) q+ r
- "cppStandard": "gnu++14",
# ]! K1 B) U7 Z N - "intelliSenseMode": "gcc-arm"* B! ]: H- H( v/ L6 w
- }8 h: \ l4 m$ I, w
- ],. |# d, u: q5 |+ ?6 D3 \. A; I
- "version": 4: M0 k& w9 t c% `1 C1 W
- }
复制代码 3 a' a1 }* _" S5 x" A0 Y
2.2 task.json
: H8 T0 {2 `. I5 `+ a' D$ O: ~修改好task.json即可使用ctrl+shift+B对stm32工程进行编译$ H& r) O$ B! Q% h4 N
7 ^ _( U+ F+ O
8 v7 a" C! C) A3 a
{3 |% o4 j( b# }% c# N8 @' W1 Y' X# o
9 }' }7 U5 t6 O' M( B1 D
, _. y% V: v* a9 H( o$ k/ s- |& l! {" r1 K3 a
- o, Y$ q& m) G( N3 C$ C- a7 ~& u2 W
* u9 S/ B3 T% l1 ^
6 C! x" O' N. R9 ~# [8 s8 G修改如下:! h8 O, }: l7 ]' m4 j/ k- g8 Y
- {
8 C0 R9 V8 v8 z4 r/ w - // See https://go.microsoft.com/fwlink/?LinkId=733558* D/ B# D0 L' z0 Q
- // for the documentation about the tasks.json format' E4 }( ~: f @- u
- "version": "2.0.0",! I& s7 w& g3 J, q
- "tasks": [) Y, ^$ [8 C5 X3 T8 b. L
- {
4 n8 A9 h, u; t+ X+ K4 {3 f/ N - "label": "Build", // 标签名1 j; X$ m0 U( V+ r. B: ?" T
- "type": "shell", // 终端(shell)型的任务# Z# {1 b: \# b* |
- "command": "make", // *执行的命令
N) A: N* V; K - "args": [ // 命令的参数% ]& ?% C; O' N1 C) u5 Q
- "-j6" // 表示六线程同时编译. G1 V) V; H9 U
- ],0 N2 O/ A! u6 c
- "problemMatcher": ["$gcc"], // 表示如果出现了编译报错,问题面板会显示 gcc类型的错误7 E/ y7 `3 X3 o( t5 S* p0 t" O, P
- "group": {/ f0 M% V% a, F6 L3 r4 S6 r% a
- "kind": "build",
, Q7 O* n$ H/ O1 g5 N. n' X; I9 B) ~: M - "isDefault": true
9 b* A9 ^% l& c$ z$ d$ ? - }
& g0 }. u, Y- S9 x7 J0 ^ - }
( d; r% p3 H" s" T
8 p/ h' G8 _, e& g/ V' o9 z- }
复制代码 / C- C) r: G3 C I, @& l
2.3 settings.json
) a$ T# w3 }( ?* x X0 T5 u" O3 e- y: Q# ~
3、上述”defines“字段中的定义应包括stm32cubemx生成的Makefile文件中相关的宏定义
1 D4 L6 J; U# ^, k0 Z0 C1 ?2 c9 W* c( E8 K, H- s" l7 z+ l) D2 v9 N
; t- ^ s8 J( A) V0 N
% C% f. n# u% {0 @3 K8 x b4、make编译/使用ctrl+shift+B
& Y% p/ T2 M/ K! N, a- chen@ubuntu:~/prj_vscode/linux-stm32/test$ make clean
" ?: ]- |+ c. u6 D4 v J$ k - chen@ubuntu:~/prj_vscode/linux-stm32/test$ make
复制代码 ) R* w8 _% g* E/ h3 U9 v4 S6 f
10调试1 e* o8 k6 z" |0 t! n' ?
1、安装openocd- chen@ubuntu:~$ sudo apt-get install openocd
. v$ X+ w1 a" f1 r! F" s - chen@ubuntu:~$ whereis openocd% @8 e% O; a& H7 c+ m' B4 s z
- openocd:
3 \1 s' ~4 h+ F( g6 L% x - /usr/bin/openocd
- |9 x% O4 F; c8 b - /usr/share/openocd 8 V# i2 J% z) Z, m
- /usr/share/man/man1/openocd.1.gz
! ]% X: Z: ]' f - /usr/share/info/openocd.info-2.gz ! i/ [; E& F# K/ X- c
- /usr/share/info/openocd.info.gz
) W' ]+ Z' d7 ?2 H" F Q - /usr/share/info/openocd.info-1.gz) e. \( m* j( O# S
- chen@ubuntu:~$ 4 R2 N, h6 t' y
- //连接好stlinkv2-1到电脑和pcb板,输入以下命令。完成连接! [( o6 D* r6 O
- chen@ubuntu:/usr/share/openocd/scripts$ openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg
复制代码 ) ]' B8 l; ~8 F0 K1 q
2、在tasks.json中使用openocd进行编译后的下载
1 X+ n2 i! v: h" S4 v
, \5 G& U |3 ?5 U2 C在原本的tasks.json中追加popenocd的相关内容
$ I2 |; i2 a: `- {" c9 E. E* a f
- // See https://go.microsoft.com/fwlink/?LinkId=733558
8 D+ E' {0 p8 \1 P- R2 ^; Z4 [# \7 ~2 } - // for the documentation about the tasks.json format+ ]4 P; k4 X3 G
- "version": "2.0.0",% K' t; D8 O+ I6 j9 y* ^/ A
- "tasks": [9 D M! U4 Y# t/ F0 e
- {
) z' P+ C: c) M9 y* y- T - "label": "Build", // 标签名
" w R# Y3 t6 ~: W; r - "type": "shell", // 终端(shell)型的任务# B, h# o) _9 g# n7 ?! o7 `3 D
- "command": "make", // *执行的命令: e! u. |. t3 C b; U) R7 x" [
- "args": [ // 命令的参数. q: k2 x$ R7 O. A0 M9 k
- // "-j6"表示六线程同时编译
: m" B3 O8 P _* e; R - ],
, i# B3 `7 \6 {" A, R6 a. W; W - //"problemMatcher": ["$gcc"], // 表示如果出现了编译报错,问题面板会显示 gcc类型的错误, k; \4 u5 h& u; k, G
- "group": {/ y) p$ n4 Z+ u8 t$ \/ g
- "kind": "build",
# ^3 N8 l7 K r) v - "isDefault": true' t P/ U: F6 s+ v/ H, l' F
- }& y2 j) T0 N2 R8 ]
- },
6 C$ U, d7 R0 z7 b4 x7 s - {
4 W6 c% O7 g$ ^+ ` - "dependsOn":"Build", // 任务依赖4 R$ f1 D- Q0 @; \& a
- "label": "Build and Download",
5 g2 }7 ~. t0 z4 j9 x3 j5 A7 R3 X* q - "type": "shell",
x6 z% P! }* ^; o# S - "command": "openocd",
, O. n4 Z% Q1 G+ q6 ~ - "args": [+ o h- Q! q% t z; o( R/ S) L7 f k) ~
- "-f",. S' [2 I5 ~+ w2 y* T
- "/usr/share/openocd/scripts/interface/stlink-v2.cfg",
, s% I5 x8 t1 n- m7 H- V& R - "-f",
3 ?- v) b I4 A8 K* h, W, K( n4 c - "/usr/share/openocd/scripts/target/stm32f1x_stlink.cfg",/ L5 n6 c) y( e8 j1 [, ?
- "-c",; ~1 [0 W6 Q% l0 K5 v1 ~% W
- "program ./build/${workspaceFolderBasename}.elf verify reset exit"8 H5 S: q% ?7 Z. l9 s! {$ c1 n
- ],% F3 ]! Q$ s* y7 R: E z
- "problemMatcher": []( a& z1 A! ]% J( O# ~* a
- }
% ]9 e, M9 w8 V" Y! b \: Z -
4 p$ t H x. \0 u( m3 A9 R% {
- h4 W9 \; f& w' X& V- }
复制代码 m+ r6 z# W( a
这个任务要求先进行 Build任务,然后通过命令打开 openocd,加载两个配置文件(-f interface/stlink.cfg 和 -f target/stm32l1.cfg),同时,这个 -c 的选项后面跟着的就是openocd成功加载后执行的内置命令,这里我们让它下载、验证、reset,然后直接退出,这样就实现了一条龙式的下载。
: n v5 @; X; C+ K
6 G7 r$ ], W( ]% X D
% R' \ H, ^- _- i
5 v+ N* Z7 m* _7 T0 ~5 A
; l o2 ]/ W! a {) K5 E. {: i, T8 X G1 f9 `9 ~# _! G; {9 G
3、使用openocd进行调试0 o2 ]; H! R! Z1 e
3.1 安装Cortex Debug和Venus's Cortex-Debug插件(第二个插件一定要安装,否则会报错Failed to launch OpenOCD GDB Server: Timeout.), U9 c7 c/ d( o5 g& t) b. d5 a' b% B
; ^" H# K k( U# U( o4 I0 u
3 E9 d: i, ?& R, \
8 q8 G% E! F% L
* C# P( ]9 c) u
' K& }" q3 \& [6 m9 C
3.2、 添加调试配置
n; K/ f; z. r! `: X! o$ M# v8 x6 C/ R1 t, R
" `9 Y8 X% O" O; l# |" x2 p
2 o' O8 M" T& g/ ~7 c
3.3 选择cortex debug,生成launch.json,并修改内容如下: S8 i/ B$ k8 i" G
& P1 P2 U9 g7 i$ {3 \0 S2 u9 b8 N
. J" \, u7 }! w9 i, M
+ N) s8 j l8 U! V: a3 Z4 ]! Q/ k- {
" A8 r( C6 l0 X2 F H: N( j - // 使用 IntelliSense 了解相关属性。* P* j) q% b$ C, ], I! \
- // 悬停以查看现有属性的描述。
* P& f1 _# b3 S' z+ S+ u" v - // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=8303877 [. ~) s1 ]* a( ~/ F
- "version": "0.2.0", z# n* v& P" V1 n9 Z
- "configurations": [$ z, |% A" J: j0 U% p7 y
- {/ M6 H9 m$ c( q5 k
- "name": "Cortex Debug",
" ^1 m* E3 V- J' t& f1 x7 i - "cwd": "${workspaceRoot}", // 输出路径
% p x! t' o( d8 n# b9 X; `# y - "executable": "./build/${workspaceRootFolderName}.elf", // 要调试的程序
: b3 D1 z. E4 V+ _- [- O* g - "request": "launch",
. u' @/ `7 E0 ?; o) S) z( P' O) k - "type": "cortex-debug",2 M1 b) a( B0 v# n" l/ I5 g0 Z
- "servertype": "openocd", // 调试器选择
/ O1 x0 w; ?$ r& D - "device": "STM32F103C8", // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php U3 n. [1 S/ l- P+ y5 i$ L
- //"svdFile": "./STM32L15xC.svd", // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载, C4 f2 ]1 d% z$ D- o, d3 b7 y; a: S
- "interface": "swd",# `5 f/ r1 ]4 W# {, g$ b, I8 W
- "configFiles": [
% }' W1 w. n& |" s* U - //"${workspaceRoot}/openocd.cfg", // *可以通过加载该文件来配置
% S! q& a: q( d9 i, j - "/usr/share/openocd/scripts/interface/stlink-v2.cfg",8 H! E, u3 z" q0 X1 Q7 R6 j
- "/usr/share/openocd/scripts/target/stm32f1x.cfg"
) V+ n: o& n9 T/ N4 u, H6 R' @ - ],5 C% k( s3 N# K- E {8 R( Y
- "runToEntryPoint": "false",; ?) I2 K" ?. b% w! Q( O+ E& O) |
- //"runToMain": false,
, L, T/ X3 n- ^) d6 t$ v0 e+ E - "preLaunchTask": "Build", // 在调试前预先执行的任务,此处是tasks.json中的
1 E6 Q' r+ K, ~8 _ - //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin" // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径+ o9 w& R" Z. o7 T
- }' S I) d! P% F; L" u
/ c) m2 H3 G& ~5 `$ b- }
复制代码
5 X1 y7 G- T* X U3 a8 t3.4 调试
' p# T8 Y% W# {* `' l4 Y: W. @! ^* z0 `% T# f
# I& L7 m9 r" B) E5 o4 r. o
7 B0 F& g8 Y, ~- d11使用VSCode串口工具) E) [9 u! I( \. c6 H& S( F% e% f
1、安装serial monitor: x# d5 B: e. Q7 ~4 S# \) ^3 u8 l# C
5 Y M* U5 a! N, Q5 K0 e: y, C
+ X- q h- G, D5 v1 M5 s5 d( v
4 R$ {* _( P3 f" q2、查看连接的usb* R* ]0 N& V* ]! D, |. v' J
- chen@ubuntu:~$ lsusb4 p; h9 V2 f' h T
- Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub5 M" f! q ^$ S
- Bus 002 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
* c( e/ F' U y( B% H - Bus 002 Device 006: ID 0483:3748 STMicroelectronics ST-LINK/V20 |" ^- k0 G4 Y
- Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. VMware Virtual USB Mouse2 X0 b/ B* c" S K( m
- Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
: }. @/ o0 i- R% e! v2 a# Y - Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse. u" |4 w1 t$ ]& H
- Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub8 N3 ~' }2 P+ Y. Q4 d" L# e
- chen@ubuntu:~$
复制代码
( l: D5 b7 |5 D8 P( ~4 A" q. d U2、加权限- chen@ubuntu:~$ sudo chmod 777 /dev/ttyUSB0
复制代码 , T* o+ b: z- k- |$ G* d0 v2 h% l/ Q
12使用git
) Y/ U# H0 F1 U8 \( [$ U1、检查状态6 f4 A9 r5 ~! {5 {+ }
- //在执行 git add 和 git commit 之前,先执行以下命令查看当前仓库的状态:
' H' A, t2 {: Y7 T* z1 @: Z; B - git status
9 I6 `- K9 j5 | F9 |+ B! K - //这将显示工作目录和暂存区的状态。确保没有未追踪的文件,也确保已将需要提交的文件添加到暂存区。
复制代码
! p3 N7 M9 d, ^4 ^1 j+ j2、确认 Git 配置:
0 [ c) h- C5 ?2 u7 G' i! q }- git config user.name
; }$ B7 L; F- }% X - git config user.email
4 w& A& d* A" h& O! G) C' x - . n2 }- C. l0 ^8 B
, r& H. \5 z( f2 P- 如果没有设置,请使用以下命令设置:+ ^3 `; Q1 e6 V
- git config --global user.name "Your Name"' ]4 H# j$ ^1 ]0 r2 _" i! ]! O6 R9 t
- git config --global user.email "your.email@example.com"
复制代码 ' _; l! J& \; e( g* x4 B9 d i1 V V) q
3、检查文件权限; v8 P" v2 e4 o; u( Q2 `
确保你有权限在新文件夹中进行写操作。使用 ls -l 命令检查文件和目录的权限:
Z3 T& `& |3 o7 e% ?/ }! E9 o% gls -l6 R T$ f. T. R% J
7 b* j+ o8 E7 |/ f- w% S& }* Z/ @
4、查看错误信息:
# T: s+ S( g& R& U) A如果 git commit 操作没有反应,尝试使用 -v 参数查看详细的错误信息:7 n K& Q6 @6 l. S8 y
git commit -v) K3 z1 |- x' K( K' d( n u0 P3 O
, J; D9 _/ _: K3 b7 c" u7 ?, R5、清理缓存:
) P. ?) {' L1 m有时 Git 的内部缓存可能导致问题。尝试清理 Git 缓存并重新尝试:
: |/ ]' u+ y' ygit rm -r --cached .0 \, G) W: X7 E) X
git add .
; k- n1 }5 y7 y) S& Wgit commit -m "Your commit message", Z! j, y+ r' w' { t
这将清理缓存并重新添加和提交所有更改。. ~1 X- U8 @8 L* K9 y% w
+ ]% G6 r9 Z: ^0 M8 P7 G$ L7 P' E. f5 f
转载自:kevin `7 B: K( s" ?4 D% y# z2 v
% ^$ T5 R& e' a
如有侵权请联系删除% T) t0 P* y) R3 w' }. @
6 v8 K8 x- I0 Y/ y9 l6 c! F+ _
) [+ {' M7 C; m5 H& s( p( q
% t2 s( W. ~' c/ `' @) B* L |