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