你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM3的开发环境搭建经验分享

[复制链接]
攻城狮Melo 发布时间:2024-6-15 14:45
“ 从ubuntu20.04入门到完成stm32程序的调试。”& l/ b3 B5 G  Z9 z7 }, w

5 c: W0 T* G7 R6 q2 m) h$ {0 {
微信图片_20240615144535.png ) 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# R
4、安装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 Q
10、调试
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 ~
  1. chen@ubuntu:/etc/apt$ sudo gedit sources.list
复制代码
  1. #阿里源(Ubuntu20.04)
    / k( q5 E/ \8 q* e+ i! N4 S  A
  2. deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse: k- A8 W% Q6 b7 z+ z3 N
  3. deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse3 L8 B7 |3 }! A
  4. deb https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
    " y9 r4 F# ]8 z* A
  5. deb-src https://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
    6 b6 W( G' y3 t! [* v0 `1 V
  6. deb https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
    : e+ o) q# N* f% j
  7. deb-src https://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
    5 I: X) f3 D2 |' R
  8. # deb https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
    ) Q1 g) L" N( G' [
  9. # deb-src https://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse/ M4 d* o1 ~  `' F( t; @, i
  10. deb https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
    - V& c! a/ D3 c4 N- j
  11. deb-src https://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
复制代码
  1. #清华源(Ubuntu20.04)& I' p! O/ t) n7 Y9 |0 P( I( A' L4 p
  2. # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
    : g, e# L' H2 n/ H! c. A3 Z
  3. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse' {, A! n8 `/ X& I1 t; W; ~5 K
  4. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse, q3 a6 R7 N- r
  5. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse; Q! z: H3 i. G. Z
  6. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse* s. g: w& {9 A+ X+ F& N
  7. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    9 i0 i! @5 r9 j% Y! r) y2 z
  8. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse  R4 l9 g9 C5 G" w" r
  9. deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    ; F) G, M2 m0 U  g/ ]1 ?1 H
  10. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    ; `( _3 f7 @9 X) d& H1 s6 l( ]

  11. ; D5 B; E  _( D4 `
  12. ; D0 I0 D' s" p) A9 n5 ~
  13. # 预发布软件源,不建议启用
    % \) N2 U$ e& J9 j5 _. z* D8 c7 c
  14. # deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
    + w5 ]5 {) n; K3 N! O
  15. # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
复制代码
  1. #中科大源(Ubuntu20.04)
    * v  E) y- J5 E
  2. deb https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse
    % E2 O$ o/ M) [- U) x; A
  3. deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal main restricted universe multiverse& w& t+ ^7 f5 a8 ?2 g' `3 \
  4. deb https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse5 {9 }: j0 x4 z0 ?; i0 _2 I
  5. deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-updates main restricted universe multiverse. c- m8 K! @: w) {  ^' u, Q5 d
  6. deb https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse! J! o( l/ T- {* [' O
  7. deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-backports main restricted universe multiverse/ Q' x/ ^3 C0 F2 u1 h/ @
  8. deb https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    * ^- w2 [6 ?" P
  9. deb-src https://mirrors.ustc.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    " G+ S$ E6 g  x6 }8 ~8 D3 U
  10. deb https://mirrors.ustc.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
    ) J; K, A4 w6 {: e! I) c
  11. 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/ }
  1. sudo apt-get update
复制代码
: 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
微信图片_20240615144532.png   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
  1. chen@ubuntu:~$ sudo apt-get install ibus-pinyin8 T6 M6 d: }. |  r% N
  2. chen@ubuntu:~$ ibus restart
    " V2 v) F! J. K' {  `
  3. chen@ubuntu:~$ ibus-setup
复制代码
" Q6 c: B8 G3 Q
微信图片_20240615144527.png 0 T, Q- A8 _! {+ |2 o
7 H, q- B( X! E" R# Z
微信图片_20240615144524.png * z+ `% W. t6 x3 S4 F

; S- n& S6 F8 N% d" G 微信图片_20240615144520.png ! 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
  1. chen@ubuntu:~/Downloads$ sudo dpkg -i code_1.89.1-1715060508_amd64.deb
    & j( ^5 h! z- g: V
  2. 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
微信图片_20240615144516.png 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
微信图片_20240615144512.png * }4 }  ^+ F2 _

; t7 b" ^" _/ w- ? 微信图片_20240615144509.png
) H8 X2 }* r+ w/ V

& q2 r2 G1 I& g8 {; v/ U命令行直接安装(Ctrl+Alt+T呼出Terminal)" \$ D! [8 ]: w9 w
  1. chen@ubuntu:~$ sudo apt-get install git2 Y  A$ S% R+ {
  2. 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
微信图片_20240615144504.png
  K, ?* F% ~) N: O. j: H  _- N8 h( r3 h7 i7 ^  Y5 r7 E
  1. git clone https://gitee.com/kevinkerry/linux-stm32.git, U8 s4 D, Q* V' W8 o
  2. git config --global user.name 'kevin.kerry': V' t* L* e/ i3 d
  3. git config --global user.email 'ct15762287606@outlook.com'
    6 C# G+ }  v) ]- {' X6 s

  4. ( R5 I6 E7 N& L. p& ?
  5. - |# o5 b+ y: u! r* E8 |
  6. #示例5 {# h( D' [2 Q6 h; A
  7. chen@ubuntu:~/prj_vscode$ git clone https://gitee.com/kevinkerry/linux-stm32.git9 B* b, R2 e5 y% f
  8. Cloning into 'linux-stm32'...
    1 Q4 q# P1 W( Q, Q' K$ r
  9. Username for 'https://gitee.com': ct15762287606@outlook.com- T- y7 {' L: T) {% S
  10. Password for 'https://ct15762287606@outlook.com@gitee.com':
    # y# W0 ~. c" Q% A) H6 S8 O
  11. remote: Enumerating objects: 4, done.$ v! j2 X: P/ E/ N" Y8 y! P6 c
  12. remote: Counting objects: 100% (4/4), done.
    # y4 X9 T0 {& k5 m
  13. remote: Compressing objects: 100% (4/4), done.5 z5 A7 i6 d: J. k0 s) J1 }8 P! W; T
  14. remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0# F7 {4 v$ b2 w) _, ]" M
  15. Unpacking objects: 100% (4/4), 1.79 KiB | 1.79 MiB/s, done.
    - [6 P0 Z$ ?1 V7 o/ W  ?1 j
  16. chen@ubuntu:~/prj_vscode$ ls9 Z- r! s9 q* r- J- g
  17. linux-stm32
复制代码

; w, |8 C5 @8 GGitLens — Git supercharged插件安装
5 V. [. v" h/ D' ~' j" [
9 g( o. C2 _/ H7 K
微信图片_20240615144459.png
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
微信图片_20240615144456.png
, 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
微信图片_20240615144454.png ; [- \( 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
微信图片_20240615144451.png
  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
微信图片_20240615144447.png
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
微信图片_20240615144437.png
* 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
  1. chen@ubuntu:~$ apt-cache depends build-essential
    8 q. I3 ?5 G: w* E
  2. build-essential4 @0 L; A  ]! l# i
  3. |Depends: libc6-dev
    ! z1 Y8 {" d' p( ~
  4.   Depends: <libc-dev>4 [# |7 o5 x% `1 a% @6 H& j* |1 T
  5.     libc6-dev* r" @: W& x: c( x% |. c, U
  6.   Depends: gcc
    7 Q/ U# r8 q4 e8 X4 b7 w% }
  7.   Depends: g++$ G6 y8 r3 n! S7 g
  8.   Depends: make
    * @2 _# f$ ~, R( D* ~
  9.     make-guile
    : f$ P/ e* S6 K3 F
  10.   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
  1. 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
  1. chen@ubuntu:~$ mkdir linux_c% d; e( L$ Q- h2 y. M3 Y# I
  2. chen@ubuntu:~$ cd linux_c
    " c9 z# C- e; m: k& w3 X
  3. chen@ubuntu:~$ touch hello.c
    ! I+ b$ S2 n3 k" F6 [  t$ h
  4. chen@ubuntu:~$ sudo vi hello.c
    ) T& M' d1 T% I, N$ @
  5. chen@ubuntu:~$ cat hello.c
    ( q/ |& K- q8 y7 l' N: V
  6. #include <stdio.h>
    : m3 C/ E) T" q4 k& d
  7. int main(int argc,char *argv[])( N+ `3 T: f' u
  8. {
    / u: {4 l2 f6 R! Z+ _6 f+ F: k' x
  9.   printf("hello world\n");3 n5 H+ Z" h# a/ \8 `6 S: I) ^5 [
  10. }
    4 `9 R  b- y0 S# {" f, X  R
  11. chen@ubuntu:~$ gcc hello.c# E  A5 J( i. B# N( Q% j; {
  12. chen@ubuntu:~$ gcc hello.c -o hello( [7 N9 W2 u% b# E2 P7 Z, l1 H
  13. chen@ubuntu:~$ ls -al2 t. s0 J* K, ?( L7 O" E0 f9 C
  14. total 52: C  l, e2 k2 O% H! c
  15. drwxrwxr-x 2 chen chen  4096 May 16 18:32 .) Z" U4 t. f2 o0 F5 V
  16. drwxrwxr-x 4 chen chen  4096 May 16 17:37 ..8 k" |- g, F* M! w
  17. -rwxrwxr-x 1 chen chen 16696 May 16 18:29 a.out7 A) V" \4 _0 }# ?5 {1 d' V4 z
  18. -rwxrwxr-x 1 chen chen 16696 May 16 18:32 hello8 G& u; p1 z  ], D2 ?: x
  19. -rw-rw-r-- 1 chen chen    82 May 16 18:29 hello.c
    - v, P% z- G5 N* b; e( n0 D
  20. chen@ubuntu:~$ ./a.out
    * F% b3 }: t  B1 f3 g
  21. chen@ubuntu:~$ ./hello
复制代码
" q5 s' I& a/ A, S5 q. j: n
3.2 有makefile
  ]' _! R8 {# d' j# e! I1 C; M3.2.1 创建程序文件
  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
  1. #include <stdio.h>
    # V! y" i8 a# W8 N7 H; W4 N, P
  2. #include "input.h"8 @3 e: S& x# |- p, r5 b/ d$ z4 ]
  3. #include "calcu.h"
    , ^/ I8 W- ?7 y/ Y1 B

  4. # B, _/ K6 T9 X7 J6 N

  5. 5 ]! d) z! U; ]) u! M
  6. int main(int argc, char *argv[])
    $ ^* i$ E+ n  C3 Y
  7. {
    ( Q' D$ Q$ E1 ]8 `: Y5 m

  8. & G0 T, R9 i7 \2 l0 K
  9. 8 M  l( x; k: s
  10.   int a, b, num;2 }. @) Z! I$ q+ l4 o* x* h
  11. + K/ `) @9 u) F) F! q0 M& H8 y

  12. , M( Q4 ~3 V; S" [1 Y* O# h
  13.    input_int(&a, &b);7 Z! Z% M- D! {- V
  14.    num = calcu(a, b);
    * Z6 M, c9 b! J/ x- v; \) v
  15.    printf("%d + %d = %d\r\n", a, b, num);
    6 H( V! g, V8 ]" e/ R; w' ^5 ?
  16.    4 _& r. R0 y7 R' p! ?
  17. }
复制代码

% q2 k' H+ A8 {6 A' ainput.h
  1. #ifndef _INPUT_H& }' Q! H1 x- g& z% I
  2. #define _INPUT_H* X( C+ s' P# l, c

  3. & E3 d' }/ V) ]
  4. void input_int(int *a, int *b);
    8 Q. j, A- o7 f0 s- \

  5. 3 `  ?& b  ]7 X7 V; e
  6. #endif
复制代码

5 j( O) H- [# ~/ S* c; Y! W+ Binput.c8 E6 |3 w5 n! n3 N9 g+ J
  1. #include <stdio.h>8 Z, Y( j, o# W3 l
  2. #include "input.h"
    3 c6 B/ H0 ~6 p- z' n, Z

  3. 8 A, f$ I/ q" [% e+ H" s

  4. ' b  O" I8 }" z* [, b+ M$ D3 J
  5. void input_int(int *a, int *b): d9 p2 `8 a: y1 m; e
  6. {& {- p. n/ M  p7 _! l- i
  7. printf("input two num:");
    % e3 E( B4 Z2 N1 I
  8. scanf("%d %d", a, b);
    - M& T9 K+ c: _- _5 Y
  9. printf("\r\n");  d& h& c3 ]# P5 T1 I$ x! L$ ^
  10. }
复制代码
1 |" l1 [2 d  c, ^$ O  ]" @  s
calcu.h
  1. #ifndef _CALCU_H2 V# m, V1 A9 d0 u! b: [6 k. p
  2. #define _CALCU_H
    0 }- p. D  [$ h9 z" c

  3. * B: u$ E! Q" F# z9 q4 }

  4. ! \% M$ |2 u4 h1 o
  5. int calcu(int a, int b);
    ; h+ A% u2 O; v" l9 n" o
  6. #endif
复制代码
9 ^6 K8 z9 y. o/ @9 w0 i* @
calcu.c
; o# d& n. W' C
  1. #include "calcu.h"% G) Q4 ]2 Z: @: k

  2. * ]! k# I+ A. {3 Y

  3. $ ~/ G, K' G( C% V1 _2 K. D4 @
  4. int calcu(int a,int b): G0 X& X& b' J. Y
  5. {
    # _/ `3 j: J! b2 z; [. r# V" S; ?) A" }
  6.   return (a+b);
    : g! J+ x4 Y1 q$ ~' |/ ~$ I$ L9 t; d- M
  7. }
复制代码
; z6 J: p) F& u+ z' l& d7 ?( T
3.2.2 编译测试一下
4 T2 T- Q; B" D2 F4 n
  1. chen@ubuntu:~/prj_vscode/linux-c$ gcc main.c input.c calcu.c -o main! ~& J: F+ r5 M7 e# B0 g, |7 P
  2. chen@ubuntu:~/prj_vscode/linux-c$ ./main
    5 [- V9 I, F3 y; p& E
  3. input two num:23 56  A/ `; Y3 G/ I4 k
  4. - e  o& ]% D4 i% L  I0 D) b2 J

  5. * `& Z. r+ n0 ~7 R, J1 N
  6. 23 + 56 = 79- R3 D7 F+ ]- M/ X5 u' ?
  7. chen@ubuntu:~/prj_vscode/linux-c$
复制代码
  1. chen@ubuntu:~/prj_vscode/linux-c$ touch Makefile: f: n) ^/ H2 b# j1 F$ b
  2. chen@ubuntu:~/prj_vscode/linux-c$ cat Makefile
    ) B- t8 c5 ~6 w% |4 o5 V3 Q- v9 X- r1 x+ I
  3. main: main.o input.o calcu.o" `6 n- H- F, S$ @2 k7 K8 H
  4.   gcc -o main main.o input.o calcu.o
    , B( F3 T9 p" G0 \. v4 E" S# Y8 _
  5. main.o: main.c
    2 X/ Q1 J( m, B) Y. \) A
  6.   gcc -c main.c2 F. \0 _/ e( X
  7. input.o: input.c$ ]# |4 E" w; _3 o
  8.   gcc -c input.c6 S" K. i( Z( g% |
  9. calcu.o: calcu.c
    $ I" }, u9 ^; v( u
  10.   gcc -c calcu.c5 `" |/ [0 v+ R. c6 U. W

  11. 4 W! I( F) \( x
  12. . A& F' ~3 f; X: p# Z
  13. clean:
    / N: W9 |9 X# H8 g
  14.   rm *.o1 t5 A! `4 E1 K8 J/ b( H
  15.   rm main
    / q# }6 i# H1 u) L
  16. chen@ubuntu:~/prj_vscode/linux-c$ make clean9 T. V$ n( I* y! _6 d1 p& \& M$ b
  17. 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
微信图片_20240615144428.png , 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! `* |$ ^
微信图片_20240615144424.png
# X( j: d# F' b0 E: m
, L: I1 D% e. o- M修改生成的task.json文件如下
' r/ @- d9 F0 B8 e( o+ A. n
  1. {3 U+ b- I( `6 C4 r, w- U3 h1 c0 G! a
  2.     "tasks": [
    4 m8 R! k) }# [3 `# b$ Q
  3.         {
    6 e( [' j) A0 J$ @& `
  4.             "type": "cppbuild",2 B2 P$ j# o& U: b; L- {2 Y
  5.             "label": "C/C++: gcc build active file",2 d: ~& f& J( N1 i, l
  6.             "command": "/usr/bin/gcc",' {7 y4 V: b7 H' m
  7.             "args": [
      q, F- i+ D, Z2 b7 v7 h
  8.                 "-fdiagnostics-color=always",9 P0 b2 H8 t  M3 u  N' O$ L
  9.                 "-g",  r4 ~* Q' w* m! x$ w; ~7 h- l. A
  10.                 "${file}",
    3 T& g0 D1 T& {( L
  11.                 "-o",
    / m- r1 w9 F/ N2 P& V, P5 f% v1 T
  12.                 "${fileDirname}/${fileBasenameNoExtension}"
      a8 T; E1 p" D+ |0 Z, M# ~2 T  Q" I
  13.             ],
    ) u) \" l2 a! K% j2 e2 q% l6 J7 D5 a
  14.             "options": {& S9 ]) y0 [$ d& X' N5 y
  15.                 "cwd": "${fileDirname}"* @4 v: O9 a* R' ^/ @8 Q
  16.             },
    ) l9 ~' r9 [. Y
  17.             "problemMatcher": [$ Q7 f& Y  H5 e+ R7 J8 q9 V% G1 }, a
  18.                 "$gcc"8 {5 |, `( a0 a# S# f4 A+ L/ X, e
  19.             ],$ b$ p) `) F+ {# j, F
  20.             "group": {
    : @+ F/ i. c; M  [
  21.                 "kind": "build",  \( v; a: i8 E
  22.                 "isDefault": true
    : G- q3 [+ E! b: h3 Q
  23.             },
    : u" e- Y9 z1 n- B
  24.             "detail": "Task generated by Debugger."
    : e6 U" I3 v7 R% e
  25.         }
    ; V+ E: {4 q$ j
  26.     ],
    ( t7 h* j, R! X! O( s3 G' W% ^
  27.     "version": "2.0.0"
    $ `1 H! h  b* }+ U; O8 P+ h  Y3 K
  28. }
复制代码
' ^$ m7 H, S5 ~% m
修改如下
  1. {
    9 m. O( ?, n7 G- B
  2.   "version": "2.0.0",
    9 x+ C6 J/ b  h5 v6 z' m0 @
  3.   "tasks": [3 z% b% K' r8 p' w$ T
  4.     {
    * O+ ^' K: n4 b- f: n6 T0 {
  5.       "type": "shell",* |, R0 B& N) J+ Z8 c  g
  6.       "label": "C/C++: g++ build active file",4 a  l; i4 q* |% L
  7.       "command": "/usr/bin/g++",
    5 V' ^1 S  `0 ^1 }; Q# x" M& b
  8.       "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
    ( Z2 r( ^# Z9 S8 w  J
  9.       "options": {( ?% S! D6 D1 u# ?
  10.         "cwd": "/usr/bin"
    6 Y- x" O' D1 x
  11.       },
    ) `5 a/ o: A3 w. D+ F# V2 S: J
  12.       "problemMatcher": ["$gcc"],; L1 Y& V& X* h1 u" j; P
  13.       "group": {
    2 @0 q+ [# e- |# O
  14.         "kind": "build",
    + @- V" @2 P4 [! v- `  h
  15.         "isDefault": true3 h' W. _2 U# d5 _) ?. l, A
  16.       },( J' S  M3 P/ t. O4 c
  17.       "detail": "Task generated by Debugger."
    9 S6 Q5 j* h5 g# z. [; c
  18.     }" A, I, J- p& c& @7 v
  19.   ]
    6 X5 H% K! i4 `* M
  20. }
复制代码

$ 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
  1. {
    " l3 q0 m; ^9 C: h/ D& E
  2.   "version": "2.0.0",  _$ V, l% l9 H9 U1 ]0 E+ v
  3.   "tasks": [) g, w/ g% P) M. L! f$ }4 @& r
  4.     {: F9 o4 K3 g! r  R
  5.       "type": "shell",
    & ]! h. `% a7 {# `
  6.       "label": "Build",8 _) J6 D+ |  x" E0 f6 ^
  7.       "command": "make",
    8 ?, Q" W: u6 [
  8.       "args": ["NTHREADS=1", "TAG=dbg"],
    # ~  t0 o! H% e

  9. $ w  p# P3 Q0 ~, Z6 d
  10. 4 e8 E# ^6 y! H* L6 `3 t( n- P/ ^
  11.       "group": {
    - W8 z; Y6 Y# c. S$ F
  12.         "kind": "build",6 ]( W7 l, ]4 v. c
  13.         "isDefault": true% G8 p+ b: l0 x$ V. I& _
  14.       },
    3 q& s6 o: `- N$ q
  15.       // "detail": "compiler: /usr/bin/g++": \( m6 q5 G  r! ~" N; A
  16.     }% a: k! E5 `$ [9 V$ }% a

  17. 0 G/ U- }" r, q. Z. E& k
  18. }
复制代码
8 y+ e& q" s5 ?( @) N$ c
一种可行的Makefile文件内容(gcc后添加-g命令)( ^8 j6 U& n7 T9 X$ @" {1 m; W0 y5 x
  1. main: main.o input.o calcu.o
    . G  T7 F$ Y/ q" {  L3 V
  2.   gcc -o main1 main.o input.o calcu.o: x  e& u' f% n: O; h2 x4 C# S9 f5 D
  3. main.o: main.c9 J+ N3 G7 m& \
  4.   gcc -c -g main.c
      ]- @4 g2 Y: b. m' @
  5. input.o: input.c
      }$ T! }' \! |+ t0 l# z
  6.   gcc -c -g input.c
    1 v0 ^; b! K* m
  7. calcu.o: calcu.c
    2 ]! S0 m1 {- u* Y' j
  8.   gcc -c -g calcu.c
    . j5 C" r/ X: Z# j, f

  9. ; `. h& Z1 v4 p2 {- E1 o

  10. ' ]# K. M/ z; c3 N2 b, @9 l
  11. clean:
    + A0 a9 l& {3 p6 ], ?- a
  12.   rm *.o
    : D# H* L7 ?- ~5 ]. q  ~
  13.   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
微信图片_20240615144421.png
) p4 e! U/ `0 ]* H4 \. ]
) v( [: W! a0 K) J2 v 微信图片_20240615144417.png 2 s3 X. [# z  ~3 j5 i
图4.2.1 添加调试配置文件; r6 R  L, k  D, ]( U
  1. {5 r2 v" A) l; e! s, f
  2.     "configurations": [1 {3 ?. B3 j) N* [. v
  3.         {
    3 ?6 ?8 Y' I" T* C" a7 i: |2 O- y& Y
  4.             "name": "C/C++: gcc build and debug active file",! F& D$ J% B8 M1 n( s+ r' k
  5.             "type": "cppdbg",6 y3 ]6 y1 J# d; V! s% _' |6 G
  6.             "request": "launch",3 Y2 L+ B/ q7 R2 J' M
  7.             "program": "${fileDirname}/${fileBasenameNoExtension}",6 u5 |3 q8 q4 D( q6 E
  8.             "args": [],. p' F2 i6 F2 l' D. ]+ n8 M# W
  9.             "stopAtEntry": false,
    - B) l! F7 ?2 L6 B( W) V9 v' n
  10.             "cwd": "${fileDirname}",( A+ U& R4 c  d  t
  11.             "environment": [],
    9 Z9 @7 G9 A2 Q
  12.             "externalConsole": false," G5 R+ N$ q6 w/ \
  13.             "MIMode": "gdb",
    ' [) j, o, F/ a: X0 y- Y- [, E
  14.             "setupCommands": [/ B. p4 C0 _  C4 S! k, i3 }! B4 l
  15.                 {
    % e9 w  p( _, ?& N# S) k; F. C% h
  16.                     "description": "Enable pretty-printing for gdb",& U  U- i1 l0 ]2 J% k9 f" {' ?
  17.                     "text": "-enable-pretty-printing",: j9 Z. h, q9 ~! i0 f
  18.                     "ignoreFailures": true  Y0 J, R* k0 q" j0 r% X
  19.                 },' x; i- ^5 ?8 z4 P! a5 n
  20.                 {
    ( n0 d) a9 i4 Y' [' ~; @; B
  21.                     "description": "Set Disassembly Flavor to Intel",. H5 U& q8 l/ D/ `7 N
  22.                     "text": "-gdb-set disassembly-flavor intel",9 a. c$ ~7 j+ A% M& o2 [- P. ?
  23.                     "ignoreFailures": true
    7 l, W3 p8 X7 N( ]' A% d" [3 w
  24.                 }
      {9 P0 k/ a' [4 e( S# `
  25.             ],
    ; D7 o2 Z) D; u" f2 N& ^
  26.             "preLaunchTask": "C/C++: gcc build active file"," L$ g9 v5 n. H% n; y1 K
  27.             "miDebuggerPath": "/usr/bin/gdb"
    ; I4 y, ]  S4 f' J8 d
  28.         }- D$ [( o) c( B5 d# b% U( Q
  29.     ],, g/ k8 v2 O3 h% F% k: O) x
  30.     "version": "2.0.0"( o6 j; l: |/ R- o1 ~
  31. }
复制代码

. v# |$ l( t5 M1 a3 h修改生成的launch.json文件如下
# n0 s, s/ T' k  D( F5 n+ q
  1. {. h5 }! g1 `1 |$ W! X7 t1 E
  2.     "configurations": [
    1 @5 }8 `- z7 Y
  3.         {# z4 p- A& T1 D2 G# V
  4.             "name": "C/C++: g++ build and debug active file",0 b6 w& C( f/ D* k
  5.             "type": "cppdbg",
    , `4 b5 G; K  {( E- ^
  6.             "request": "launch",
    / i$ F! R' ^9 e9 B7 H8 {# t. ?
  7.             "program": "${workspaceRoot}/a.out",5 f% a3 [6 @, J
  8.             "args": [ "1232"],* W; ?/ A& I" f/ p& [
  9.             "stopAtEntry": false,
    % |* J" y- q0 y- o; F4 ^
  10.             "cwd": "${workspaceRoot}",
    , B: r& d. Q0 ~. P+ [7 N
  11.             "environment": [],
    1 N0 l8 b, Z$ `* x7 k! ^
  12.             "externalConsole": false,
    & Y7 e' G0 U+ k, t8 Y/ J1 g
  13.             "MIMode": "gdb",
    " h- c! [4 ^9 A$ T+ `5 e
  14.             "setupCommands": [
    2 ?6 D" ]! r2 V
  15.                 {1 ?" X2 C2 h, ?3 n2 T
  16.                     "description": "Enable pretty-printing for gdb",# U+ B$ D/ p& I, I4 V
  17.                     "text": "-enable-pretty-printing",
    : f9 H4 T2 H- q" U3 E
  18.                     "ignoreFailures": true
    3 j* P' ?2 |2 m8 ~9 v
  19.                 },
    ; }: Y2 i) @# N' {, T. v7 ~
  20.                 {% t4 S+ u$ b6 r- r+ {. P
  21.                     "description": "Set Disassembly Flavor to Intel",
    + b% a/ p5 N9 P* F+ L, b
  22.                     "text": "-gdb-set disassembly-flavor intel",9 A$ o% B# i& `: n
  23.                     "ignoreFailures": true
      h* x# Y0 ?7 n3 z
  24.                 }
    4 j( f: t( N. a: x
  25.             ],# {, A) A7 Q* G5 \) U
  26.             "preLaunchTask": "Build",  m) E+ ]4 K, A
  27.             "miDebuggerPath": "/usr/bin/gdb". T$ b! P$ L- _" Q7 Y% G
  28.         }
    * k% I5 X- S+ j3 J$ H
  29.     ],
    4 ]4 ~) h) a+ q- A
  30.     "version": "2.0.0"& P% ~. n/ v: V" G/ E& i
  31. }
复制代码
# R' Y/ A; K. p/ u" Q
"program"选项代表,需要进行调试的程序,所以这里需要修改为对应的文件。"PreLaunchTask" 代表debug流程的前序任务,这里的内容需要和tasks.json中的label相同。"args"可以添加执行程序的过程中,需要添加的参数。在下面的代码中,我们就添加了cacti程序,以及参数。
5 }& S; O) J! B* x
5 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
  1. {
    & a* Y, f, @0 {3 r9 ?6 U
  2.   "configurations": [4 J. F2 @) ], ]& e$ `% s9 O9 s8 W
  3.     {
    ( N( D& [% z  c. S/ I" @5 h
  4.       "name": "Linux",
    $ j7 s" n! x( d3 Q$ X
  5.       "includePath": ["${workspaceFolder}/**"],3 }0 k, `& s) v- w5 v! s
  6.       "defines": [],
    + A$ W9 M2 ?7 _# u" L8 q5 q; B
  7.       "compilerPath": "/usr/bin/gcc",% Y) l5 z+ ?9 t; Y+ I  e2 t
  8.       "cStandard": "c11",- G" ]; K0 M# k
  9.       "cppStandard": "c++17",
    . t# N! d( f% a# U) T* L: ~( B
  10.       "intelliSenseMode": "clang-x64"1 z4 |' L% ~9 X
  11.     }
    $ H0 B& U7 t2 H) O# C
  12.   ]," u& Z9 z# k! k9 \9 o
  13.   "version": 4
    ; I6 K# c/ B. ?- w0 C, `" V
  14. }
复制代码

6 i7 Y3 \( M3 y. w2 P05安装Vim
2 N: [' i4 x: R  [1、命令行安装( O3 ]- |, ~' K& Z) b- q& J6 E% G
  1. chen@ubuntu:~$ sudo apt-get install vim- Z' b6 a7 z" z1 Q5 z, l0 S
  2. chen@ubuntu:~$ touch a.txt
    - P2 F7 q1 e  ?6 t  p- A
  3. 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
微信图片_20240615144414.png : 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 `
  1. 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
  2. #对于bz2、gz文件解压& o" \; x. a1 w' z& D9 w: l
  3. tar -vxjf test1.tar.bz2" u' s5 s6 ^( Y7 H5 q7 P
  4. tar -vxzf test2.tar.gz
    : ?6 ~" t7 c+ ]4 ~6 i
  5. #对于bz2、gz文件压缩
    & Y+ G1 L( r" \. g" R3 k: ~
  6. tar -vxjf test1.tar.bz2
    # ~9 h# d! d( D2 t# R0 F) N
  7. 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
  1. chen@ubuntu:~$ sudo gedit .bashrc" a- |5 k0 R) `3 x* ?4 f
  2. #在文末添加下面一行  _, D, }% Z# n  a: l& L, l
  3. export PATH=$PATH:~/gcc-arm-none-eabi-10.3-2021.10/bin
    " o( c1 d, W6 r9 }) K
  4. #添加上述行
    5 J9 o* `& Q9 H8 \& `/ T
  5. chen@ubuntu:~$ source ~/.bashrc
    # y: n; Y; `3 H0 m; n1 _
  6. chen@ubuntu:~$ arm-none-eabi-gcc --help* a4 l5 y$ e) I2 F+ B
  7. 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
微信图片_20240615144411.png
1 c& G( f  ~$ s9 v( ?/ n
* `- A0 D$ J& F8 c1 Q2、安装
  1. chen@ubuntu:~/Downloads$ unzip en.stm32cubemx-lin-v6-11-1.zip
    $ g. g6 s) u( Y7 M! s
  2. chen@ubuntu:~/Downloads$ sudo chmod 777 SetupSTM32CubeMX-6.11.1
    6 \: G( d1 F* s
  3. chen@ubuntu:~/Downloads$ ls -l
    8 G7 ]- e* b8 f/ d- h% U* B
  4. -rwxrwxrwx 1 chen chen 539136342 Apr 11 09:41 SetupSTM32CubeMX-6.11.1
    8 X. ^: ?, n, h: F, b
  5. chen@ubuntu:~/Downloads$
    % N) x9 q% o/ t6 }* b" s2 c
  6. chen@ubuntu:~/Downloads$ sudo ./SetupSTM32CubeMX-6.11.1
    ; m2 E& T4 L4 o2 F
  7. chen@ubuntu:~/Downloads$ find /usr -name STM32CubeMX: H  V0 K3 ^( p
  8. chen@ubuntu:/usr/local/STMicroelectronics/STM32Cube/STM32CubeMX$ ./STM32CubeMX
复制代码
% e: e! D  h5 X" r
3、增加图标到菜单
% R( \! F" o5 i2 `$ w) P
  1. chen@ubuntu:~$ /usr/share/applications/8 E1 N' u& b4 r' V# b
  2. chen@ubuntu:/usr/share/applications$ sudo touch stm32cubemx.desktop+ h/ e9 w/ u7 D( g
  3. chen@ubuntu:/usr/share/applications$ sudo gedit stm32cubemx.desktop
    " ]$ U" ]6 d  l% F% s4 F
  4. chen@ubuntu:/usr/share/applications$ cat stm32cubemx.desktop; A) A% C2 e6 C3 ]/ h0 J) O2 n- v1 Z
  5. [Desktop Entry]
    ) [! \: E+ T1 x* W, O3 K4 g: C7 q( k6 {
  6. Type=Application) ]$ _6 x. ^8 q% i1 u- ^) Z
  7. Name=STM32CubeMX
    . k% P3 Q# D# f1 _2 A# h! o# k
  8. Comment=STM32 Development Environment" K) u3 K; d5 F/ [
  9. Encoding=UTF-8
    * U( N' m0 I2 K( y; B
  10. StartupNotify=true7 P& o" o- v  C7 S. N$ i
  11. Terminal=false
    + |, l9 P6 x$ z! G* d2 N( a* \3 S
  12. Categories=Development;java;c;c++;; W7 s. |0 j1 v- D: [' B$ @1 X
  13. #icon= ##########图标的路径,自己找一个就行+ S" @# E0 J) {$ Q/ l. B
  14. Exec= /usr/local/STMicroelectronics/STM32Cube/STM32CubeMX/STM32CubeMX& i- p7 M+ J- z$ n+ H2 R: c
  15. 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
微信图片_20240615144405.png 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
微信图片_20240615144355.png . 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
微信图片_20240615144351.png 6 j8 J8 H( m5 R3 G, m9 ^4 {
  1. {
    7 J% {: A1 d4 k  G2 S( n! H& X
  2.     "configurations": [
    ! {5 h, \" r$ b* `- B
  3.         {- G6 \6 u2 @/ w; y- p5 f
  4.             "name": "Linux",, E& @: _9 D1 s: f
  5.             "includePath": [8 e. }% s- x% P& e; E- p
  6.                 "${workspaceFolder}/**"+ w; Y- I2 Q* _  Q2 o% E5 r
  7.             ],
    ) K& `8 _; J7 f8 D
  8.             "defines": [
    % L" R1 e: C( v' n  A, o. D
  9.                 "USE_HAL_DRIVER",- g3 P. d9 V" a# |3 K# i
  10.                 "STM32F103xB"
    ) p3 @4 e( b) G' U; ]
  11.             ],
    + F, U* F; ^' }" }# Z: z( ^$ l. @
  12.             "compilerPath": "/home/chen/gcc-arm-none-eabi-10.3-2021.10/bin/arm-none-eabi-gcc",  P( n, W/ Y# q7 R9 B0 J
  13.             "cStandard": "c99",  _+ A1 d6 w; u0 `
  14.             "cppStandard": "gnu++14",
    . P# W9 `' ?. b* T
  15.             "intelliSenseMode": "gcc-arm"
    : z5 |0 C* N$ c3 c5 ^" E# w. \
  16.         }
    3 W4 R" ~7 X& A9 T& X
  17.     ],
    3 l0 |& ?3 d- H. j) z- T
  18.     "version": 4
    # t8 t4 G. X1 z; O0 D/ k' P
  19. }
复制代码

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 @& ]
微信图片_20240615144348.png
/ U' m2 F! U& F1 w2 i. x1 u- z: Y6 X) a3 Q6 o) p
) B* O! q8 F* @; L$ ?; h5 B
微信图片_20240615144344.png % I- U2 b/ B: L8 w6 D+ u9 }
5 k, W, u- x/ M9 R/ Y( p4 b: E
/ ]; E2 q2 Z, `8 c
微信图片_20240615144341.png * \% 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' ~
  1. {
    4 l5 t. u3 \" T% ]0 _# s$ c: A/ D
  2.     // See https://go.microsoft.com/fwlink/?LinkId=733558
    ' L/ e& S8 g3 a7 |# V0 X
  3.     // for the documentation about the tasks.json format
    $ l. A# r5 `% M0 Y7 o
  4.     "version": "2.0.0",
    7 F0 c) f9 j1 u& _( J
  5.     "tasks": [
    / q9 C1 S- c- x, p" L* x4 ~
  6.         {. A/ u( v0 e$ e* D/ l
  7.           "label": "Build",      // 标签名
    . l$ \( B: c, u
  8.           "type": "shell",      // 终端(shell)型的任务+ x( I/ {' ]! Z, m! |% c& ]; y  K; ^
  9.           "command": "make",    // *执行的命令
    1 u2 w( J* B. c* E9 I2 O5 n
  10.           "args": [          // 命令的参数
    ' H+ d9 A' m6 G  u. k
  11.             "-j6"          // 表示六线程同时编译4 H9 q8 b( H2 T! m6 ]2 K1 H- J
  12.           ],7 [8 h) ]$ F2 |  k
  13.           "problemMatcher": ["$gcc"],  // 表示如果出现了编译报错,问题面板会显示 gcc类型的错误( k& P' T1 U6 m% K# ?% Z5 i
  14.           "group": {8 I  p" a+ p0 I, E/ c' s/ B
  15.             "kind": "build",# {) L# y" S5 W7 N3 {$ ]9 F, m
  16.             "isDefault": true1 Q1 q1 P% O  {
  17.           }
    # V7 I6 w: p  f1 l, A4 |
  18.         }
    & W9 l4 z- h& |, z4 M* q

  19. , ]; O+ w# n) C3 d
  20. }
复制代码

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
微信图片_20240615144337.png
  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
  1. chen@ubuntu:~/prj_vscode/linux-stm32/test$ make clean
    ! c0 q1 S) r+ Y3 m
  2. chen@ubuntu:~/prj_vscode/linux-stm32/test$ make
复制代码
. o$ E& x' \% V7 @
10调试/ N: @( \. e) P" P, O; r
1、安装openocd
  1. chen@ubuntu:~$ sudo apt-get install openocd
    . i( x9 T0 b1 Y4 J3 N
  2. chen@ubuntu:~$ whereis openocd# c' n% Z0 e$ u9 B+ t
  3. openocd: : m* B3 W7 {9 {9 u: u9 _
  4. /usr/bin/openocd 3 W" R' Y/ P8 l1 R4 P9 Q/ A
  5. /usr/share/openocd
    $ z3 M) \" T1 s+ o+ x0 N+ J8 ^
  6. /usr/share/man/man1/openocd.1.gz
    % l7 ~( Q4 P4 m, N' Y0 l6 A
  7. /usr/share/info/openocd.info-2.gz 9 o" |8 |. G; e3 {. @6 p
  8. /usr/share/info/openocd.info.gz + U1 N! _6 a7 {* \( n" X7 ]0 |
  9. /usr/share/info/openocd.info-1.gz
    : w$ [& h$ ], v0 x4 U3 p
  10. chen@ubuntu:~$
    3 o3 ]7 {( B! x8 ^
  11. //连接好stlinkv2-1到电脑和pcb板,输入以下命令。完成连接
    % j8 }- a9 W' u7 y
  12. 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
  1. {
      Z7 y; N1 F- s5 m
  2.     // See https://go.microsoft.com/fwlink/?LinkId=733558
    7 m+ g' O4 E/ ?( ^
  3.     // for the documentation about the tasks.json format
    5 k6 Q7 d+ z8 c* I
  4.     "version": "2.0.0",3 i& z  B8 K1 \  B/ X9 p
  5.     "tasks": [# A0 |1 E9 K/ B
  6.         {' F7 R0 r2 y% j! v' C5 n9 m
  7.           "label": "Build",      // 标签名5 b7 T6 u  k# T' a; r( B
  8.           "type": "shell",      // 终端(shell)型的任务6 t5 G' D+ d1 V. s
  9.           "command": "make",    // *执行的命令2 S; y( I9 y& A; i, r4 O+ b
  10.           "args": [          // 命令的参数: V& B; M1 V. N' n6 }* W3 D' B
  11.                           // "-j6"表示六线程同时编译
    / M5 y9 X5 ?: V5 r' p
  12.           ],
    , |" \4 T, l0 w
  13.           //"problemMatcher": ["$gcc"],  // 表示如果出现了编译报错,问题面板会显示 gcc类型的错误9 Y( T$ @; Z& V& z* D" Z
  14.           "group": {2 I2 _$ x/ ?: K3 V  l& L# m0 {
  15.             "kind": "build",; v' B4 P5 f$ |0 ~" w
  16.             "isDefault": true
    1 d1 x; p7 E, f" X( Z3 d/ w! @
  17.           }1 C6 X$ T5 `0 s! Y# x2 N' _
  18.         },6 q/ b1 L7 T) P8 [
  19.         {
      d. P6 d5 ]: U/ `8 L
  20.             "dependsOn":"Build",          // 任务依赖+ j! K  p5 r% E" s- }
  21.             "label": "Build and Download",
    ' p  s4 F  O0 s1 Q
  22.             "type": "shell",
    " v$ e  O2 G6 r( P6 L
  23.             "command": "openocd",
    4 B: r) t! q7 r
  24.             "args": [+ k! A: B4 P, V, `6 f$ z
  25.             "-f",
    ) |* i( t/ d5 W1 e% O0 ^
  26.             "/usr/share/openocd/scripts/interface/stlink-v2.cfg",
    % y+ x6 }, i# I
  27.             "-f",$ s6 T- k6 Y6 s8 _4 F' Y" N8 z) {5 K, ?: }5 H
  28.             "/usr/share/openocd/scripts/target/stm32f1x_stlink.cfg",) _: Y6 x+ ?, t& P
  29.             "-c",* ?, G; v. t( s! p  I
  30.             "program ./build/${workspaceFolderBasename}.elf verify reset exit"
    1 m+ n' O% n3 F3 d
  31.             ],
    # o) D) r; J8 k) `- S# W" d
  32.             "problemMatcher": []3 ~# G& d5 q( c# |$ j/ N! w
  33.         }
    5 S( C, L: O, t! i
  34.           H6 [" Q) |0 W% N( ?3 \4 l
  35. , @; p% U. d/ r9 i, F) F3 k
  36. }
复制代码

/ 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
微信图片_20240615144333.png ( R3 M, v" \* g% Q+ q# p. V
) [: g% v( A; R. F' Y
微信图片_20240615144330.png
! 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
微信图片_20240615144327.png
) n5 {% V9 M" l8 k3 B+ L& w, ]. O+ T. C* p+ I+ D
微信图片_20240615144324.png
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
微信图片_20240615144321.png 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
微信图片_20240615144318.png
9 L! ?5 Y3 g2 w1 E/ e$ S8 Z9 {8 w4 n9 F4 X2 m" f7 B  q
  1. {: y; ?1 c8 ?- J/ f$ p2 m
  2.     // 使用 IntelliSense 了解相关属性。
      \: U: E) b3 S9 R3 g
  3.     // 悬停以查看现有属性的描述。
    * R4 [# h' ?6 Y
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387, I, x) m( X7 v9 X* X5 H! `- d8 ^/ A" }
  5.     "version": "0.2.0",$ ^* H7 l5 P. s& \- \
  6.     "configurations": [
    % j# W5 t' P: P7 o# o
  7.         {
    ; G( _+ Z" W& Z4 Z( K. H: u
  8.             "name": "Cortex Debug",
    7 w0 A/ k, q1 O* B8 j; R8 Y
  9.             "cwd": "${workspaceRoot}",  // 输出路径( Q% {; Q6 P3 a0 @3 H' W9 A( i! y
  10.             "executable": "./build/${workspaceRootFolderName}.elf",    // 要调试的程序) N6 C6 g7 Z3 y2 w
  11.             "request": "launch",
    # M3 v3 l) H' ^3 |
  12.             "type": "cortex-debug",3 K$ N$ L% H+ f) ~: C
  13.             "servertype": "openocd",    // 调试器选择/ _+ j. e- r4 Q0 ]
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    * V+ ?) Q5 H: m7 x
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    ) o4 i: t9 ~4 v& G
  16.             "interface": "swd",% B8 Z6 j, ^+ f- O  V
  17.             "configFiles": [7 M9 H0 {% X4 A3 w9 G
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    * p8 b8 I8 @& u+ A2 q  ?% {
  19.                 "/usr/share/openocd/scripts/interface/stlink-v2.cfg",7 D% Y9 D% K8 S/ W
  20.                 "/usr/share/openocd/scripts/target/stm32f1x.cfg"
    % j1 J$ F0 c# Z
  21.             ],
    : S4 h3 b3 C/ H9 C7 M) l5 W
  22.             "runToEntryPoint": "false",
    / p0 a7 q' k6 y# F) [2 V, B1 B
  23.             //"runToMain": false,$ V. {9 X  w1 i* P
  24.             "preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    ( d$ z5 ?& c, m: R4 V. W. I& W' M* t
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径3 t1 a9 F6 Q+ J7 B5 e$ n
  26.         }
    8 p" V/ p5 E) G

  27. / ?) q1 m+ z* ]3 d* l) }* |# j
  28. }
复制代码
) D* Y  E) M- B5 b
3.4 调试
9 @/ h# p9 m: E& w" O  d  g& y0 s' |: p2 w  u) U
微信图片_20240615144314.png
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
微信图片_20240615144304.png
' ~0 S+ A6 E4 J$ o6 }& o  S8 V5 d2 [( U* a
2、查看连接的usb
; w! _- \& I8 U* J
  1. chen@ubuntu:~$ lsusb/ H' ^! n6 K' @; I. `* n9 _0 N
  2. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
    2 a& N; K( u: S
  3. Bus 002 Device 007: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter4 ]6 P4 \4 l+ {. Y& d; N: g# [
  4. Bus 002 Device 006: ID 0483:3748 STMicroelectronics ST-LINK/V2
    5 V+ Z5 U* m! N# R# J9 i
  5. Bus 002 Device 004: ID 0e0f:0008 VMware, Inc. VMware Virtual USB Mouse
    & w6 t  \) `, M$ Q0 C; F2 s8 j0 k' |
  6. Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
    ! t0 L+ Q& A$ R0 w5 w
  7. Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse. [: z  u( F5 P
  8. 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
  9. chen@ubuntu:~$
复制代码

/ v3 ?" H& r4 k" j$ {0 o) z2、加权限
  1. 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
  1. //在执行 git add 和 git commit 之前,先执行以下命令查看当前仓库的状态:
    * I& X4 f+ E: T( Q/ K* S6 w
  2. git status! \; L* v, k6 U5 h' k7 E
  3. //这将显示工作目录和暂存区的状态。确保没有未追踪的文件,也确保已将需要提交的文件添加到暂存区。
复制代码
& S: `) ?# p0 z  }- S# o: U! I
2、确认 Git 配置:
+ c" A0 F# |4 O$ Y3 q) O  i8 V, M
  1. git config user.name
    & [7 c0 Y" v: y5 w  [0 j
  2. git config user.email
    ) _9 W" O# P. A

  3. 1 k* W, X- ^& `( D& g
  4. ; I6 m+ q1 m. t: n3 `
  5. 如果没有设置,请使用以下命令设置:
    ) o# [; Z3 k6 N6 ^7 N! w) D( ?: i
  6. git config --global user.name "Your Name"
    ( A  a' p0 }& `( x7 t5 |
  7. 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: g
3 {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) @
1.png
收藏 评论0 发布时间:2024-6-15 14:45

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版