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