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