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

Windows+VS Code+EIDE+STM32+gcc编程环境搭建

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
0 w: j. }$ K' w) r$ c! f; M0 R& |: s/ |1 X8 I  v
微信图片_20240615160241.png ) ~0 n- w7 B0 a  S7 Z0 I3 y
2 P+ _* d) m' n3 W$ T
1.VSCode安装与配置7 ?# w. J  y. [# R9 P% z3 Q  U6 ?
a.卸载
2 ]! r1 X# [3 ~" gb.安装
6 b) M( S4 A) I9 c6 g6 [c.git安装与配置
1 j! H" j1 S3 J3 R  W- [d.安装插件+ j) H0 N: Y, B% X* b* V/ ]  N

5 Z+ Z3 g6 l) b- {* h/ b
5 c/ `; R; h9 q9 X* B0 b, F
2.Embedded IDE配置0 O0 _. m% y! m4 G
a.安装EIDE插件
7 ]$ ]9 d2 {7 Y0 ^/ k$ Y9 Q
b.安装实用工具到EIDE
1 Q) b8 z; e, \/ k
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools
    : y) V% l. R( }5 B4 B5 r8 x3 H( V
3.Embedded IDE项目建立-stm32标准库
) M2 Z/ q+ I( \: J8 K, ^a.工程项目建立. O* G! R: P: t/ r/ `
b.在EIDE中使用标准库时的设置(无Makefile)
1 w+ L& p& U& X( l- Uc.编译工程
9 e0 L1 N- ~$ g" P4 q$ M8 p, J. L( p+ B: G6 w( f1 Z4 C  J$ Z
4.一些问题的处理:' `3 w+ L" O, U) p. ?4 K" q
5.调试工程
( y9 F0 p4 S! Y- Z4 g7 K! t2 G0 m0 t7 Z4 @9 \4 T1 q1 j
01VSCode安装与配置
0 @8 D& i5 ~0 f% G4 t1.完全卸载之前安装过的VSCode. Z: H9 L" r- L' o  |, {3 x+ F+ X
a.卸载软件
/ y( H1 A1 m- E1 g! ?6 bb.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。& p5 r* O, X6 Q  M: v8 K0 `* t$ s+ S9 ]
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。5 Q$ O( Y4 X5 v
" a1 ?( u0 D! P4 P# X7 h
2.下载安装vscode
& K5 G& L% y" A( W$ P' p- X3 d$ R* P) [$ a7 G( s
3.git安装与配置
4 E' I8 s$ E5 B, j- Z$ {6 t! }" v安装git) ^) E8 {6 y5 ?" R+ ~$ V  O
9 i2 ~- P$ h+ W; _
微信图片_20240615160248.png
1 _, P% p1 L, y6 y8 Q! H. D
& k7 l+ T2 k$ ]1 y1 R安装完成后,在开始菜单中找到并打开Git Bash! `( D/ Q# f% g( W- d
/ S) q, R6 J  ~1 x5 Y
微信图片_20240615160250.png
9 i1 V/ x$ N0 J
! Y% I  }6 {& c3 t
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git  T& d4 I" a' U- O8 o1 z8 J5 X

2 _4 N1 M1 o) Y- V
微信图片_20240615160253.png
; `6 z0 ~# ]! O/ j  _6 X
! S& y; d, v% l; i3 ?1 p! o/ n
在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    " M, _: W0 {; {7 L; h8 G& u( e
  2. git config --global user.email 'ct15762287606@outlook.com'
    / }4 m0 B: {; Z. Y, P/ b
  3. //检查当前仓库状态
    ! o; Q" `2 N' z. Y& @
  4. git status
    , W" D% P' e9 i5 {. k' K: [: E4 X
  5. //确认git配置  F8 J( y) K5 q1 o+ `* p
  6. git config user.name$ P5 Y* o6 }7 v
  7. git config user.email2 }0 f+ m$ k0 \0 K6 o8 j
  8. //查看错误信息
    + j0 G, c% S& O3 j( Q2 J. B& d; c; N
  9. git commit -v
    5 R5 N" q- E4 @% k
  10. //清理缓存
    - q, h% w2 H9 K
  11. git rm -r --cached ./ [$ I8 u8 i* u8 g4 I
  12. git add .
    5 ^' ?+ Q8 Z! h& K$ s: k
  13. git commit -m "Your commit message"
复制代码

% J5 W. W5 W7 `3 I/ ]
微信图片_20240615160255.png
1 B" a/ A) Q% Z$ H' ]0 C
' p: T, Z4 [& \& c4.安装插件,如下图:
6 q' k$ @8 [, A# p4 U0 z+ k$ l* S! u. |
微信图片_20240615160258.jpg . v2 @( U8 F# s+ X0 }$ V  d7 P
; A2 x6 p& C5 d$ @
微信图片_20240615160301.png
$ K% s& \# z6 X9 {; M: e8 A- E6 G. P0 L: F  E
微信图片_20240615160303.png 1 @7 `8 w. k7 e" X

) ]: W% j6 N$ r" [. r1 J, t) s; B 微信图片_20240615160306.png " V0 z5 `6 C. U2 w& _. [

! G5 j& X+ q# Y 微信图片_20240615160309.png + u7 H$ i8 J# E3 f# x; m7 P$ I

3 a# _8 u. Z- q" w 微信图片_20240615160312.png 9 G: `% p& V. ]9 p
9 [. D4 R. M( z* @2 F# A6 Z
微信图片_20240615160317.png # [) m- i1 R1 g* X+ f* A

- Z; b' h, y& L 微信图片_20240615160320.png
& I! E1 {: i/ \; @# N' M* u- S4 q2 S4 L$ @3 j
微信图片_20240615160322.png , c6 ]$ u. b# O: x
9 V" Y$ I  q% ?$ n/ P' x6 h1 ]7 E6 H
微信图片_20240615160325.png
/ ]2 A* ^0 d" j# w+ ~* G
" a" c6 [; `- k% i$ c1 Z# _% p 微信图片_20240615160328.png
8 v9 v9 @8 S' v1 X( @. W
, d3 ^1 A0 m. F8 r0 G3 c 微信图片_20240615160331.png
% V- {$ z) M' e/ p2 `) l/ ~+ c6 R, O( _. a
微信图片_20240615160334.png
$ B% ^* ?- z2 t. V" c2 M# q2 y  L& \) o! J" n8 p, q6 g
微信图片_20240615160337.png
0 @8 v0 s0 c9 {! A2 `  [9 r
4 q1 g  b4 t% @# f. ~5 h- @' \6 R 微信图片_20240615160341.png
" Z  _( @$ m  w0 |8 B' c" |! @1 E3 o$ D( n3 M
微信图片_20240615160344.png / V/ r4 z. d9 T0 S* \2 {  G
+ d7 K/ z  Q' M- E, i# c
微信图片_20240615160347.png / X" u! X, L. f  b4 q

  K2 t2 r7 v5 h 微信图片_20240615160349.png
2 }" W' ^: u, |; p. t3 n
/ x2 M( o( W* P: N, Y7 N8 i 微信图片_20240615160404.png
$ C1 t8 G; V5 w# O9 C) w: o& p8 z3 K5 v. L: H* X
02Embedded IDE配置6 H/ N, L9 G0 F8 H* u' p& v
1.安装EIDE插件到VS Code
7 G9 X8 ]8 N  i. g2.安装实用工具到EIDE环境
- e# e7 _' E/ S% Wa.安装arm-none-embed-gcc工具链  n9 v8 s$ H6 w7 _4 a" f) ~  S1 D* n
1 e) P3 w" T8 E7 G
微信图片_20240615160533.png % m7 f0 k* x* L0 B  ]# b
7 V5 y2 F  ?! |
b.添加其bin文件夹到环境变量6 \6 z) K! X3 P/ }3 r
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址
    4 i7 A7 Q/ K7 k$ X7 {. L4 Y6 O- J
2 M/ G6 R' _# I3 H9 Y8 e9 ~
微信图片_20240615160536.png * V; g! P- v9 l
2 a. Q% Z6 l. @4 j) j  j8 w: y4 R
微信图片_20240615160540.png % b) z- Q; B. a. f' ~, w
1 t) v7 ^% Y' G0 k+ t) r
在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
% }# y( F# I) |1 N1 \
/ M0 W8 W+ p& E1 ~
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

- P  ^. ?* q9 A' E% f/ Lc.安装OpenOCD
' j4 x% z) ?9 M8 {( O) M' `: L4 u. \6 V2 y9 \

( u' c( ^* `. B& C1 D& x( ~& S
8 P8 ~( z( X. V) P1 }) b% W* Td.在vscode中安装Makefile Tools- R8 q9 }% b$ x: G

9 F3 f$ I( ]; e: i
微信图片_20240615160554.png % Z! N. [3 H" P% y; g! \& \. @

! B  P- M, t$ n  J3 ^
  • 找到该工具的安装目录6 k) a' t( \- Q6 M  i
& O6 ]5 _+ o! I. k. Z
微信图片_20240615160557.png
4 [$ x  K9 @2 [( b+ s6 y3 c
% F0 C: q  L/ Q' O( i
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常  w! X0 _6 z8 p
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v
      E" N% K5 [$ J2 o$ e1 I: w5 z6 M
  2. GNU Make 3.81
    & t2 I1 P4 t- k9 G$ M
  3. Copyright (C) 2006  Free Software Foundation, Inc.
    $ M0 H( v; I' S/ d
  4. This is free software; see the source for copying conditions.# a3 k- K8 H  U  G/ s( A+ `) F
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
      q: Z: Y0 a0 i, [* g- K
  6. PARTICULAR PURPOSE.6 [+ A4 Z8 U& `* e
  7. " G& E  ^9 a$ T9 i1 M' D
  8. * n9 @; O" K. h; N) o# M5 ^
  9. This program built for i686-pc-msys
复制代码
' ^! n+ d+ y8 _5 M
03Embedded IDE项目建立-stm32标准库, x5 N) ]! I) Z
1.工程项目建立+ R( q0 N; D5 i/ A2 w
a.切换到EIDE环境,点击操作-新建项目-空项目图片8 S3 a  Y- C" f1 s+ `: R  I* }
% I$ d  R* S3 \* b6 y4 m1 U6 a, _; n1 u
微信图片_20240615160602.png ' K- c7 d2 ]& N% p& ]2 x
: L; m% M$ E; M3 A9 h
b.选择一个合适的MCU项目类型,如Cortex-M项目
2 f* U  n4 Y/ a
& R" p  E8 q! y" [5 U- T  l) q
微信图片_20240615160605.png ) r( B* f9 I2 K. t* }

' z6 E3 X  D4 q$ M; Sc.点击右下角继续,跳转到工作区( ]8 ]3 m5 y( J( A2 R( h

4 N" d: s" ?! B* a2 a5 `5 N 微信图片_20240615160608.png ( _7 q+ O: g9 T
) r3 p/ t/ W7 A1 T4 Q4 Y
d.添加工程文件到工作区路径下。——标准库
  T9 S0 L) W# E# v+ k- L' E3 F  x; C( d' ]
- C2 r! Y2 M/ Z
微信图片_20240615160612.png 5 h" q: F1 G( v* W
4 B7 q. R5 X& x
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。% n# N( }1 J3 M% s8 D. P( z; F. `# V5 u
% B$ f3 E- V; X+ A
  • 新建User目录,将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c复制到User目录,并新建main.c文件。
    * p3 O: e6 R* e" T& i

9 o# \& W( n7 S  o( f$ L/ }: B" R
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    2 L" a) f) Q3 q8 P6 |
& M  q; [. }; I* ^" i4 R/ Y

. m, _8 H5 ~# e4 t+ W* t
& H4 J! ]* P) K& |
微信图片_20240615160615.png 1 h9 O7 a0 F. h  l

9 t1 d7 V8 Y$ ~" W+ [: {' n5 hstm32_flash.ld
6 U$ ?+ N" E% [+ w9 a  G
  1. /*
    1 [$ A5 \5 i; K2 {  H+ p# N
  2. *****************************************************************************+ c$ o- _: E& c2 f) B
  3. **/ k: G" H+ G# ]+ c% Y( t: ~
  4. **  File        : stm32_flash.ld( k9 J  w5 e% I' Z  m
  5. **
    % O* K6 A/ y$ U. R& P
  6. **  Abstract    : Linker script for STM32F107VC Device with) w; e. A, b5 l( d6 s2 u# O1 x# B# E
  7. **                256KByte FLASH, 64KByte RAM
    + B$ h0 W3 c) t' ]
  8. **
    ' }' \3 I6 k* ?" F3 Q
  9. **                Set heap size, stack size and stack location according
    8 W4 N! O, `$ R4 _9 g
  10. **                to application requirements.
    7 M$ V) L- Z5 v) }4 s9 H# v9 O
  11. **8 B; t' g4 t( @
  12. **                Set memory bank area and size if external memory is used.7 p: m' U1 C  t6 W; d2 ?9 w5 z
  13. **" H- T: I7 S6 E+ i! ]
  14. **  Target      : STMicroelectronics STM32
    * a$ b5 B1 W- l7 g0 S
  15. **
    * t7 S. J, d* k" A" w
  16. **  Environment : Atollic TrueSTUDIO(R)
    , J) Z: u" w3 W, b0 x
  17. **
    $ O( f) y' }3 M( e* G+ v
  18. **  Distribution: The file is distributed �as is,� without any warranty
    : C) c3 R2 f1 N6 v" `( }. J- D
  19. **                of any kind.
    ( c) W. F6 i( F- Q1 U" d5 e
  20. **( h$ z: a% Y9 B/ S3 Z; V; d
  21. **  (c)Copyright Atollic AB.2 h' M4 M& s9 m# d/ p% Y
  22. **  You may use this file as-is or modify it according to the needs of your
    5 v' p+ Z1 M# i: y4 b- F1 ^) \/ c
  23. **  project. Distribution of this file (unmodified or modified) is not
    / O# h' F! u( @
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    % d/ C( c4 ^- u
  25. **  rights to distribute the assembled, compiled & linked contents of this4 \' V; C& o% F  T# c0 D. b
  26. **  file as part of an application binary file, provided that it is built
    ; T( c; _. h7 C# B+ M1 B
  27. **  using the Atollic TrueSTUDIO(R) toolchain.& h  S; Y+ B. w! A6 B$ J5 o
  28. **
    ) i$ r% E' i. Q7 {; n* a% a/ Q
  29. *****************************************************************************
    ( Q5 O/ W  ]7 y' x+ D
  30. */+ i6 y: h/ O- t! N+ |, N

  31. 3 m' H% ~+ T; \' i$ C

  32. / H! |2 N% F" P
  33. /* Entry Point */9 j; @. W: C0 L7 e
  34. ENTRY(Reset_Handler)3 y6 Z( h- J% j0 m4 l& {
  35. : ~2 R4 Z; u  S: X

  36. . n: v1 _6 t* o7 r: `8 ^
  37. /* Highest address of the user mode stack */! j' f) j6 v% g( W# Z) X
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */. ~. y9 |6 w! Y, d$ I, q0 J" D' H; F

  39. " b1 q/ r: _5 F" X4 q
  40. & H1 R( U1 d# U9 b/ B- C% v
  41. /* Generate a link error if heap and stack don't fit into RAM */
    ! `  q; _( K: T* t4 r. W9 q6 U
  42. _Min_Heap_Size = 0;      /* required amount of heap  */" H% p* ]) }, a9 k- k& i
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    : v8 W4 {0 u7 t

  44. 2 l, ~0 v% }# G, Y  g4 u8 L
  45. 0 Y: c; |: Q/ S$ q
  46. /* Specify the memory areas */
    * k5 V+ F5 z5 d# ~" O# P& ~
  47. MEMORY
    1 w2 }- f* I4 ]% l- V  x6 w  d
  48. {
    ( W; f/ e* @  ]# g+ ]0 _
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K& Z: Z- _" E+ Y% m* E4 q) Q
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    4 \2 h+ y: z- h" Q, S2 Z
  51. }+ ]5 z0 O8 h# l. o- i

  52. # j" x* v6 O! v; ]* |$ i
  53. - @  m1 G0 o0 E* I" P
  54. /* Define output sections */
    ! f/ a5 T" Y2 y4 l* m" ~$ R8 r
  55. SECTIONS
    1 z0 l% M1 s5 W% C# J
  56. {
    " g5 p" n- ^0 t. S
  57.   /* The startup code goes first into FLASH */) {/ r5 m* J- v2 T% F9 V5 j6 t( w6 ?& F
  58.   .isr_vector :: X! f! p: h: V: a5 p
  59.   {1 R" u* I5 ^& O7 v" D4 f% {; Q
  60.     . = ALIGN(4);5 E3 [( g1 C. f* q5 q. ]9 w' t0 \
  61.     KEEP(*(.isr_vector)) /* Startup code */
    / Q* T7 @/ x4 R" `; ]# J8 J1 s5 P# R
  62.     . = ALIGN(4);
      p* A: c% N: ^! `  f1 _( z2 O
  63.   } >FLASH
    + L  G4 F5 B! v! K- _9 ]5 H
  64. 9 S, Z: H; x3 y% O3 y: i* N
  65.   t& g7 ^) E5 d# E2 s2 u! q" Z
  66.   /* The program code and other data goes into FLASH */
    ' E, K& ?6 A, U, y
  67.   .text :  m( [4 ]. n; b
  68.   {- U* e- H6 c  C1 G/ t
  69.     . = ALIGN(4);/ y- n( G5 q* d
  70.     *(.text)           /* .text sections (code) */3 f3 V1 x8 d. X4 X: o# E
  71.     *(.text*)          /* .text* sections (code) */
    ( e  n' L- N: B/ u7 T2 ~' U4 J
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    * K5 D/ Y5 t5 w8 I# Z
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */+ b% b5 C( z3 o/ q2 P
  74.     *(.glue_7)         /* glue arm to thumb code */: P% U$ `5 u+ F4 p- h8 W$ i9 M
  75.     *(.glue_7t)        /* glue thumb to arm code */
    5 B& v. c; U. M* o4 @
  76. ( I: w  B: P& z3 `0 y

  77. 0 E  i% k: R* R9 s+ I6 z! d' F' H
  78.     KEEP (*(.init))' H1 U! j# t- [1 p$ X8 [) O
  79.     KEEP (*(.fini))
    7 s9 a% M! m+ G1 S

  80. ) y) E) q6 _; Q. b4 R+ c
  81. - B  H9 C+ P% b0 f
  82.     . = ALIGN(4);
    $ U5 J, _4 E$ K" W4 F
  83.     _etext = .;        /* define a global symbols at end of code */
      ]7 n$ |+ l; y
  84.   } >FLASH! S9 h% x/ W2 V2 v' q
  85. 3 ?2 {7 h1 Y) A: {

  86. / T& {/ Z$ v3 _! L! g% T! L

  87. ' B( H( ^- o; g, S2 X2 N
  88. 8 B# ]: e( c7 @; Z" Z
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH+ W. h6 A  |$ T/ `% Y
  90.     .ARM : {
    ' `) ]2 O" h( S$ }2 d- N5 Q' e
  91.     __exidx_start = .;
    + J8 x+ A$ i7 f) c  U4 ~
  92.       *(.ARM.exidx*)
    ' m: K1 ]6 h5 Y* @5 G8 p- ]
  93.       __exidx_end = .;
    & o- J6 ~" z2 D3 z1 a+ ?
  94.     } >FLASH1 c+ ]* Q6 t+ w) b

  95. , u8 g; D; `; E4 u5 i. h# \

  96. . H0 H8 {' ], g+ z+ T; v0 i! n6 y
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH* I+ \+ Q# N" H* n4 B: s6 j

  98. * X7 Y( r3 j7 Y/ F, r

  99. 9 O: y3 M! T5 T/ x8 d
  100.   .preinit_array     :
    * C4 K  j+ I0 i( Y
  101.   {
    " F& ]- M! R& H% e3 i
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    * y. f" P+ h( ?( l% S5 s
  103.     KEEP (*(.preinit_array*))
    9 ?- M9 S* ~! p! ~2 F- q7 M
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    1 T% L* V' r# i- j  |' z
  105.   } >FLASH* V( L$ s3 L4 q+ \( w
  106.   .init_array :! Y6 a. ]1 u8 J! Q: d1 m3 B
  107.   {) K" \) P' X3 }, p' a: v
  108.     PROVIDE_HIDDEN (__init_array_start = .);+ [- @; {  M" X5 q+ N% ?* Z
  109.     KEEP (*(SORT(.init_array.*)))8 z# K0 k% X4 r, o$ r. O
  110.     KEEP (*(.init_array*))
    4 V: [. F% s8 Y$ {  q6 _
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    # M# H0 j+ E1 }; @
  112.   } >FLASH% E% L% |, ]1 I( v8 p9 ^. G9 e
  113.   .fini_array :
    0 C" @' e4 P; v0 d* e0 }
  114.   {
    * l7 s' F8 o/ j7 W  l. Z! v
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    / o! i$ }1 b" D3 R: V
  116.     KEEP (*(.fini_array*))! }! `' [' A) v8 @' P" u, [. V
  117.     KEEP (*(SORT(.fini_array.*)))
    2 p& X* c4 l5 \: H
  118.     PROVIDE_HIDDEN (__fini_array_end = .);/ N6 G, D* d% m' C" m" ^
  119.   } >FLASH& b" r: O4 ]6 a" x4 ~; M8 w0 }
  120. * Y- I/ D  ]! U
  121. ) K7 g  H% J/ e/ x. X" D1 q
  122.   /* used by the startup to initialize data */& B# ?5 f( ~. G: c7 \& Y7 o
  123.   _sidata = .;2 s1 C- T8 X& g; t' U
  124.   z& O2 ^$ {, I: U! F% x' }
  125. % D8 K6 I  g5 G8 I0 w
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */% J5 M* Q" {3 [* r+ u% P- N% x
  127.   .data : AT ( _sidata )
    / c1 W/ Q2 u' [9 ~
  128.   {
    3 T3 V' ?! i6 g& L* x& R
  129.     . = ALIGN(4);2 H, C2 e& [) R3 O( ]3 K5 R- j% [
  130.     _sdata = .;        /* create a global symbol at data start */$ T% l) {# _* }! c( y) K3 v& U
  131.     *(.data)           /* .data sections */
    ; A4 |9 d0 G& y; K. Q& @# U  N2 n7 C! [
  132.     *(.data*)          /* .data* sections */
    . c$ A+ n9 Y! g( q4 h+ K! Q8 a
  133. 1 F8 M" P3 v$ ?4 u
  134. 6 m3 \# D+ A5 q; e% X
  135.     . = ALIGN(4);
    + A, m3 ^) ?2 P( w3 M7 s
  136.     _edata = .;        /* define a global symbol at data end */
    ' s6 F1 t$ T$ S# E9 o0 r0 W# u
  137.   } >RAM, s7 g  l0 s* S: L$ B+ h

  138. 7 v& g8 u2 j1 B; K

  139. 0 |* j1 K$ G$ R. v1 _% ^# q+ C5 k) S
  140.   /* Uninitialized data section */
    % q6 o( d" _) p
  141.   . = ALIGN(4);$ }! }1 R6 d6 z; d
  142.   .bss :
    - D4 i' M$ ?" i" G
  143.   {. Q0 c# E6 m1 M6 n
  144.     /* This is used by the startup in order to initialize the .bss secion */
    & @- c5 c7 Z: y0 J$ j
  145.     _sbss = .;         /* define a global symbol at bss start */
    / E3 _" H  F! v' O
  146.     __bss_start__ = _sbss;
    " E# b* G0 v( ~1 k3 c! {
  147.     *(.bss)+ j& r+ J( F* j0 ~
  148.     *(.bss*)
    9 s: t: c! L8 J4 p1 J9 m
  149.     *(COMMON)
    / b0 d6 f5 }+ C0 Z* f

  150. 5 L( r8 r0 c5 M5 q
  151. , b0 y# S! y5 s$ `9 s/ o
  152.     . = ALIGN(4);
    . D- x+ d1 P: w' ~2 v
  153.     _ebss = .;         /* define a global symbol at bss end */
    ; @$ p5 `8 ^" x
  154.     __bss_end__ = _ebss;9 o# {+ V5 o+ d/ ]. s6 P* e1 l
  155.   } >RAM
    ( ^. X( X, M! }& K" o
  156. * A. w: f; B$ F# A2 P
  157. ) H8 U2 S/ d; a
  158.   PROVIDE ( end = _ebss );3 t$ ]1 j. R7 z. O  h' b3 Z) ^
  159.   PROVIDE ( _end = _ebss );
    * J! s& Z0 V3 d; e$ {2 {- c  R4 F9 H

  160. ) o5 N3 h# A. w1 z7 p
  161. ) p# t+ ]+ [+ I5 D/ X
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    . Y& g" P6 O* }/ b. o
  163.   ._user_heap_stack :  f, g% W) X1 g4 O: r9 Z8 @
  164.   {
    7 y/ [" D9 i! ]' Y3 S
  165.     . = ALIGN(4);" y" Y% |: F! E: L4 L
  166.     . = . + _Min_Heap_Size;: g$ b; M) j$ y4 v: a2 s" G! V
  167.     . = . + _Min_Stack_Size;
    6 \, o, y" Z9 A
  168.     . = ALIGN(4);, L/ O" o7 }/ e' H+ Z- ^
  169.   } >RAM
    7 t$ ]# q' E' C% ]% e, q# P- Z
  170. - R- H0 T& j- _% D9 o

  171. . C- a* z5 \# S) z
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    0 d. ?6 i8 ^* m5 D4 ~: I; s0 X( W
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
    0 f1 \$ N' H$ ?/ l
  174.   .memory_b1_text :
    # q3 R' A$ |6 t$ o8 v7 `
  175.   {
    . e+ K. _- u$ o) r
  176.     *(.mb1text)        /* .mb1text sections (code) */# g$ D; D4 e% z+ h
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */
    5 X1 G* t1 i7 Y7 a
  178.     *(.mb1rodata)      /* read-only data (constants) */; b9 v# D* S! s  v7 _% M7 N9 U
  179.     *(.mb1rodata*)# s8 y& W+ D6 z  d4 c, Y8 S& z7 o4 }; }7 A
  180.   } >MEMORY_B18 D- c9 L4 |! R: E+ S

  181. 8 l0 I$ k7 _/ n3 m

  182. 6 e1 d! V9 z) {
  183.   /* Remove information from the standard libraries */
    & w8 A1 j/ r) p4 i5 q% l9 `/ i
  184.   /DISCARD/ :7 ~/ A6 y2 A% [. i. ^2 T0 H
  185.   {
    * [# Q. s! Q$ m7 _5 q# A
  186.     libc.a ( * )2 R" T5 \' p/ a: {* w+ m8 j; Q3 |$ W
  187.     libm.a ( * )3 e7 {0 Q& _& p' [1 v9 D* n1 x
  188.     libgcc.a ( * )  h3 S  f) Q, B& f8 U, M* f6 Q
  189.   }% m, d; z7 D9 I) o: C5 r
  190. }
复制代码

4 s, e' `2 s+ q" ]; Y
  • 最终目录文件如下
    ) A8 e) S: T/ y! o: O, j6 ^0 @

6 ?9 L" S2 T6 _; [3 d* {
微信图片_20240615160620.png
- |/ a* `4 u4 f
0 V8 p3 t1 O' r. g/ C
2.在EIDE中使用标准库时的设置(无Makefile)0 Q* c1 \/ G$ W& G* P/ y
a.切换到EIDE环境下
3 f( g0 C. c3 R; P0 n- `6 g* q
" ^: H- R7 g8 Z% K
微信图片_20240615160623.png
5 v/ [. \. {, v- l6 n  H* w" ~9 Z% g6 o% I$ b
微信图片_20240615160627.png # J, B3 z! b& {

- w; V' f5 D5 q/ ~7 [8 Cb.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹+ T$ D- \6 ]' x! M" B  ]  ~$ Q% G
7 q. J! U" ~9 Z% o( z- g) K
微信图片_20240615160629.png ! V, ]# y" G8 P. k  G# ?$ p% S$ J. m

/ Q9 p6 w0 M3 r' i  U! ^1 o- l 微信图片_20240615160632.png
/ O/ V' e0 J6 R( H1 u/ n' i; `7 g/ E4 c3 I4 ?$ d
微信图片_20240615160635.png % n% k( v: ?, {" Y; _# o, s  n
/ E* A3 I' g* b. d+ J: w' ]
文件目录如下:% }8 I' K- m% c& d

% }9 }* ]9 h5 Z) m. X
微信图片_20240615160638.png 0 {, D/ B4 r) E+ M
: C$ |) }0 Q# g9 k
c.点击+号安装CMSIS芯片支持包
$ J* I; J: m6 H6 P, U
5 X! e4 d9 j9 n* u% E  ?6 A9 C) O/ Z
微信图片_20240615160641.png
5 w+ N( a5 b$ n9 s9 B9 d
/ ?" }* i: S& c# `& I 微信图片_20240615160652.png
" Q% p- z- R& S% [3 q: i, J
' p: u5 U9 U+ [: D1 w 微信图片_20240615160656.png 8 K3 f) I. k1 z* f. V) c2 i- g
: w7 r& f4 k7 q5 f& G2 Q8 Y/ }
d.修改构建配置为gcc( G" G' D4 z6 [- y+ h
4 `8 k9 z+ [  q" S% C2 q
微信图片_20240615160659.png 1 ?+ k) I9 A4 J4 z0 M9 @

' N1 ]3 j/ V( n9 r  Ye.烧录配置为STLink/OpenOCD
4 B. u9 S# v" B
, [1 `! ^9 s" ?8 f( g# _
微信图片_20240615160704.png
8 A9 P8 s  S% g; N* W( o7 E' P0 L
/ e# @1 N* z: C6 y" F" If.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。* F" V4 e  F( V! w
: [4 O3 ^' R- Z6 ]/ f' N
微信图片_20240615160707.png
  j" g7 u/ I8 R4 g) Z8 Z9 I3 v% V+ M- _4 H' r
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义, X9 T4 B5 l$ t! X

4 a* F& V8 }) k2 [
微信图片_20240615160710.png 5 b% J3 F0 j" Y  `' Y
; H% o" `& T, B
h.此时编译可能会有下述报错, r2 v9 `" y! r+ u6 J- @# z
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    3 d5 y# T' s' R, r- C' ]
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

2 K. K- K0 \4 K5 L7 y0 d
! g( g5 Y- U/ K7 \' [2 X& L; w

( A: I6 ~8 }+ A4 d1 p打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)# S# Y8 t# ^7 M, m6 @/ G6 _
  2. {
    4 {' }8 b5 ^$ e7 K6 m6 P# v
  3.    uint32_t result=0;5 X1 E3 B7 f9 a$ g+ P6 C  y

  4. . `; q/ [, U4 Y- O- w1 Y
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
      A! a4 ~/ N1 w
  6.    return(result);
    , A7 ?- |& [1 c1 x0 |! J* r
  7. }
    $ o1 _  ^* X; l" |. Y  B' C  p
  8. % y) G& f! r" T: x* I* s; Z- i0 D
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)
    & P8 `) u8 [7 ~) t' j
  10. {1 {7 T7 ~0 \1 f4 K
  11.    uint32_t result=0;
    7 a9 [  H3 C! {  x0 [+ t
  12. 4 `; s+ x% w9 a. P+ K4 i+ q
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    # m+ f+ r* G+ v9 ?6 t- C  j5 G
  14.    return(result);3 Q3 Z" }, L/ h( ]
  15. }
复制代码

/ e! J1 h4 ]1 G8 e' ~
  • ctrl+shift+p,配置c_cpp_properties.json文件图片4 m: z, {5 S) ^: x, i7 p2 ^

  K/ L3 X5 ^9 S: k: m& L% Y3 `6 W+ P
微信图片_20240615160713.png 4 h. G& Y8 ^* O
  1. {
    2 g# Z6 Z3 q4 R, e1 V8 U
  2.     "configurations": [8 u4 [( H' Y( o4 ?8 ]
  3.         {
    4 T2 O4 j5 e8 g7 |
  4.             "name": "Win32",& V1 T, P4 ^! d! i$ v
  5.             "includePath": [
    ( W- k3 f* b& u  X, n
  6.                 "${workspaceFolder}/**",# D  u: B; N2 D& u& Q4 I/ |
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
      V& @' f) `$ Z* A9 }% S
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",- V0 G9 A7 l7 U5 \8 @; _/ K8 M
  9.                 "${workspaceFolder}/CORE"
    3 z1 T- C0 ^! i0 _; A5 B4 x& L
  10.             ],
    8 P: V- ?! x9 z) L9 B
  11.             "defines": [+ B3 M5 V5 h4 D* [& N- C
  12.                 "_DEBUG",
    6 \/ C' J2 o! a5 W3 p& [  e6 J0 a
  13.                 "UNICODE",
    - ]: `5 Y1 k' j4 a* f& B3 N* z' S
  14.                 "_UNICODE",
    ) R8 X3 Q& l' j
  15.                 "STM32F10X_MD",3 c7 L8 R/ K* {& v6 U' s( @
  16.                 "USE_STDPERIPH_DRIVER",
    8 N5 B9 [. ~' N
  17.                 "__CC_ARM"
    ( Y! \% m' D( x. h. m% f
  18.             ],, k$ O# ]9 D# y# u8 N: ?
  19.             "cStandard": "c99"5 {# A0 [- s* ?- p
  20.         }
    9 a- k& j2 T2 x1 @% p
  21.     ],
    ) F- ?* |2 [$ \* ?) i6 n
  22.     "version": 4# W- x8 P% y- C) g
  23. 7 P' N; \( H+ G5 z
复制代码

, j# }0 s1 S7 ^1 |1 z3.编译工程- }. M  ~0 q' \" B6 {5 @! H
% H. ]4 D0 S: i# u3 x4 m& w
4.一些问题的处理:
7 P7 P" o( p; S6 t; c0 E2 Ua.编译成功,但下载后没有任何反应。0 W) ], L: U. F/ X" E! u5 }
注意检查stm32_flash.ld文件内容1 W5 F" ?5 C" @* w
  1. /* Highest address of the user mode stack */
    * L+ ?) A5 b! X# B3 h6 L8 l
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

# c& G8 z* Q9 ]8 z# P/ j注意对应芯片型号
; N( w) q% j: D6 K' b' t$ V
  1. /* Specify the memory areas */" ]. x& \# ^  K4 d: ?, G
  2. MEMORY
    : u$ Z) @. G9 }' a- b* T
  3. {. d4 a+ t+ ]+ x  {6 P. U# w8 N
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K" `3 Z0 Q$ Q1 b- {# _; `+ p
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
      v! w+ ^% E# c3 Q, K: B0 V7 x
  6. }
复制代码

% T! f: w' `  s" e$ f: C& w* Rb.vscode提交(commit)代码时卡住
$ Y+ A, |! o5 \* C( o0 G7 r/ p' D' g* v1 a5 \* b
微信图片_20240615160715.png . `& w  J! ~9 v1 E
, U1 Y' Y8 }: c
微信图片_20240615160718.png $ h3 @2 q8 |' F

* U4 H, B7 g, T, x+ m; j 微信图片_20240615160722.png 8 J" z+ L5 b" B6 g
+ u& @! \: Y) l) Y- O) C, K
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。" Y' s& {$ x& a0 K

+ a5 t' m3 E" t/ u0 ~: i$ vc.结束
+ s3 T  `$ |, e% c% S
6 f6 L5 f# [0 F  D$ j! }1 @
5.调试工程# \, F, P  a4 J3 Y; E. P
a.添加launch.json# l) l' @, C0 U
进入一个C文件,点击右上角按钮生成launch.json
( r% i( j! W7 j, B; H# F/ p1 F# k1 I$ i8 u. j7 M2 E2 O
微信图片_20240615160726.png
/ C( Q) V8 X/ a; }! {

# P6 m+ G6 X- Rb.修改launch.json为下述内容& h! d, E; [# h# T
  1. {( q1 H5 L- ~1 J. j" ?( d
  2.     // 使用 IntelliSense 了解相关属性。# I8 v3 O: l2 |" \- S2 s
  3.     // 悬停以查看现有属性的描述。
    ) }2 G5 X5 W6 M0 `
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387! _1 V. [/ E% J$ V, C
  5.     "version": "0.2.0",) b. c: d& v4 @
  6.     "configurations": [
    : o: a, A" h- {5 f
  7.         {
    7 W" w' M  W" |2 k
  8.             "name": "Cortex Debug",/ k. E' r9 y4 B6 D: Q5 v% X/ {# l
  9.             "cwd": "${workspaceRoot}",  // 输出路径1 R5 s( d: L9 @' L6 n6 D4 J+ P8 K
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序* p9 u0 ?, g5 u2 V# D; q
  11.             "request": "launch",) L0 D8 s6 p- q; ~9 Q( o
  12.             "type": "cortex-debug",
    * a" @) T) X9 u+ K$ ]) n$ w& N+ H
  13.             "servertype": "openocd",    // 调试器选择
    1 W% l1 H' D( c/ P  u; r
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    $ z) k( A9 x$ K1 j! q: ?2 ?
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载7 S8 H4 n7 V6 q7 W
  16.             "interface": "swd",
    7 L% J+ C* |! m
  17.             "configFiles": [
    " T1 O) C: O9 Q
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    ( S% U( f3 h# d& n
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg"," t  g) V5 r. n6 v
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"" h9 m2 u% q: s$ F
  21.             ],% ]) {' D; x7 Y
  22.             "runToEntryPoint": "false"," F0 s4 _+ y1 V1 r  N
  23.             //"runToMain": false,
    : `7 {9 Y$ h1 n0 N1 F
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    # D9 @7 k6 |5 E0 B% N  k& P& f
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径& l; c& U/ x$ r1 H4 v  w
  26.         }
    ( q1 D: k8 M7 `9 D  J

  27. 4 u$ C2 d0 J2 b
  28. }
复制代码
4 n- {* V1 ?3 x! |8 b& M0 R
上述最重要的是引入openocd的路径。* M- D; o# a, i- F
' M, E7 n9 u2 [5 L6 u' k. m

6 m9 H+ {8 e& J) @) W5 Y( y' w  Fc.点击播放按钮进行调试
8 A: k* e+ |( E: \0 G, A  c) s; c+ r' y9 P
微信图片_20240615160729.png
" n8 c! J. Z7 O7 A4 \# ?' e7 E! l

0 d* }2 b! F" P8 k. ^7 {6.结束
4 ^$ n+ _; O  M) X% r5 l4 o: K; U1 i# V/ Y6 G- U1 W6 N: z* ]

. x4 t7 b' \8 {! T6 }4 ?( w8 {  G1 T9 c
转载自: kevin8 o. \& ~9 ~' t. U
如有侵权请联系删除8 I) F2 y' ?( a% T" J
, e; t+ G9 q% `

* R5 a2 I% \" ^; D+ I0 |. N/ z
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版