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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
& ^. M# n, w5 Y9 G  X
$ K! b, s% I) j3 ]
微信图片_20240615160241.png   O" O6 P, y& S

. d9 @; H$ [* n, o9 l/ T1.VSCode安装与配置1 R+ {2 |2 w) O1 F3 s; J
a.卸载1 M5 v, T( x9 U4 x
b.安装
# q3 K' M! z1 K0 p: \c.git安装与配置
- J- o5 H, l. T8 \) Pd.安装插件$ m% y+ }2 y- F3 T" u- U* u

6 L' T: B: a5 C( Y4 }( H8 k# r

$ G& H/ s0 j( f  l+ q2.Embedded IDE配置; H8 P$ P' y# ^2 {- d6 z% R9 m9 s
a.安装EIDE插件
3 r, `4 w/ ~9 d) v! [9 V
b.安装实用工具到EIDE
1 Z, ^7 U& T. ]+ g! {0 @) f
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools
    / i5 S- H! g7 @: ]; A; [
3.Embedded IDE项目建立-stm32标准库) e! C9 ]& e# d# I$ T0 }
a.工程项目建立
& r. j6 ~: j: H/ n5 G9 Y0 db.在EIDE中使用标准库时的设置(无Makefile)
& C* }9 J$ A3 `. g+ |3 {c.编译工程2 E2 ~9 L4 ~2 n- g7 _

1 n7 I. b9 C  z& f& d$ w
4.一些问题的处理:
7 `1 ~3 b' ~  K; c5.调试工程1 {! v" F; s4 Z8 y* |" U4 u2 R

' Z% A/ W+ Z, q' m& c01VSCode安装与配置$ e; k8 |$ L- E' N
1.完全卸载之前安装过的VSCode1 M$ r  u; r3 S- N- |& S8 S! M9 l
a.卸载软件1 S5 ^& ?4 z% a
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
* T8 l# h- `* Q. [1 @2 k) {' Ac.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。4 d' R  ]# ^2 z; [
  C. y5 A+ r) l- j' r
2.下载安装vscode
0 J, o# q8 f: R3 L! {
! k; s3 `- w% e& b
3.git安装与配置" i2 [) l/ ?4 W  F" o
安装git
& \1 B- k( Q" i7 S3 }& z/ G- _3 k. k. N' k
微信图片_20240615160248.png
( B7 y  e. ?6 A& n' z' k, V$ N  ^( ]6 W0 q
安装完成后,在开始菜单中找到并打开Git Bash' o$ S9 v, h* q" ~

7 r! l# Z/ }& F
微信图片_20240615160250.png 1 Q' t. T' o3 x
3 p0 u- c" B) l. I1 ?
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git- g# E1 g* d1 z8 |& \9 I$ G# D8 O
  W2 H. E: k! s; N7 A/ A& o0 E8 j
微信图片_20240615160253.png , `$ N3 h" |$ ~' i; ?9 i8 t

2 c" n( n+ W" y3 K在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    7 I5 d: ^" E1 e* R3 ^
  2. git config --global user.email 'ct15762287606@outlook.com') a  v  U4 R9 |/ N
  3. //检查当前仓库状态
    ) o/ [8 ?* v2 V2 V' Z
  4. git status
    * S" `! D( \% T$ y9 T9 i
  5. //确认git配置
    , Q6 b/ ?1 T  Q; `; `, ^) s
  6. git config user.name4 Q" ]0 \7 a/ v, _/ |* S4 p2 c
  7. git config user.email  b+ h+ G4 D6 G' z3 R
  8. //查看错误信息
    1 v6 q- G6 A. \# l4 d
  9. git commit -v
    ' P9 C+ J, I# e1 f$ x; v9 ?
  10. //清理缓存8 ]" w4 N6 b  e. t+ v0 \, K
  11. git rm -r --cached .2 R- y0 q8 T9 ~
  12. git add ." m& y* [8 E4 {  w8 `
  13. git commit -m "Your commit message"
复制代码
* S: f7 j, K9 p
微信图片_20240615160255.png & E& p' r& e5 q$ D" f8 A
0 e" z" [; p+ u0 X3 w3 l
4.安装插件,如下图:/ ]0 z' U- y5 l  t1 x
* ]% }. H; X/ I+ q' D
微信图片_20240615160258.jpg , T' X6 o, `8 I0 x+ N
: v9 w! I6 j6 T& ~% I" z1 R% M
微信图片_20240615160301.png 0 k% m: i4 O, j& [

- ?; U3 D1 G; _- `& k( _
微信图片_20240615160303.png
, Q$ ^( H8 B9 G# `& k: j- K! z: O1 M
微信图片_20240615160306.png 5 y0 n6 U( Q' \, b" ]

+ w5 |, P6 Y' ~ 微信图片_20240615160309.png ) z& x4 p; `% R" ^, Q( Q

( v  L! h: V% r- c  K" c 微信图片_20240615160312.png ( q, }# i0 F/ g0 J. H

) H- s- i& m9 U2 x 微信图片_20240615160317.png , ?- M6 B) w. D, @
: D: t6 X* i: e$ m# Z
微信图片_20240615160320.png
9 ^/ h$ v: a- o0 t" I9 l9 C+ O
+ ]* Y, t6 K* ~ 微信图片_20240615160322.png
: u+ y# r* o9 P( L& H3 H5 H/ |' H6 |2 |; @
微信图片_20240615160325.png 0 Z/ g/ N; T3 G: A7 X8 T
; G* @! a# @5 w3 T# z
微信图片_20240615160328.png
: [2 X1 n6 A7 _& a
( M" z' U1 ]7 l1 X# S* H' N/ N 微信图片_20240615160331.png
3 z  o- l" Y6 E5 F* t7 A
# T1 C2 I, l- ?- b' J 微信图片_20240615160334.png
* B% V, ?% Q4 {/ G- P9 A; C( u* d- p+ @. {9 a. H
微信图片_20240615160337.png % ]" P6 S9 T% t4 k

9 ]5 x- P0 ]8 ?, r% v- y 微信图片_20240615160341.png 9 p% g9 W% a! b* S* ]& L3 v

$ _: `: i  Y5 K" _9 J) u; \ 微信图片_20240615160344.png # S1 U' @/ _$ v2 `0 j
% @$ F5 l% a" T# n' v
微信图片_20240615160347.png
& ^% e4 |+ ~% P3 G: F# |% k! O2 ~
; u0 A5 Q/ G0 } 微信图片_20240615160349.png
' k) b7 V3 u2 I& ?- L1 Q  K% Z5 A3 d8 m5 q
微信图片_20240615160404.png " U; x% M8 @) ?' {* u6 n
! P( N2 }  H- O6 P& e/ r0 l; {
02Embedded IDE配置, }2 e" d' l+ E/ w
1.安装EIDE插件到VS Code" R9 B2 s+ `7 E3 T8 D( O/ ~
2.安装实用工具到EIDE环境
* ~& C# A! y7 V  b( K" La.安装arm-none-embed-gcc工具链' z, N# x6 q" V# k. o9 V) }4 r& e
; d3 r+ v+ D0 O
微信图片_20240615160533.png . w0 ~+ r  `  ]- e$ O

- U. I* _1 O6 h6 _- Hb.添加其bin文件夹到环境变量
$ ]: k2 j3 g/ ?+ @+ c8 b
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址* ~) ?! M+ D# c

9 N* y) Y0 k; n1 c
微信图片_20240615160536.png
2 j! F0 y1 v8 q2 |/ A$ t
9 @/ C/ I) C- x) t+ N# a% J# c 微信图片_20240615160540.png % `' g+ a1 N  T' t3 x$ ?4 ]

  i7 V  ~9 Z8 v! O0 N! R8 f/ {在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
5 ~1 Q0 O" ^. c) T# x8 |9 p. f# X7 i; S+ `
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

5 C' c+ X& b6 F/ E& G; lc.安装OpenOCD; \6 ~. C0 U+ B- b4 {

% M" x' T# L  x+ V
: o! I1 z/ Y4 @/ }
, Y6 |4 T' W' A6 M  I( i0 @6 ^
d.在vscode中安装Makefile Tools+ b3 j" ~$ }9 G$ n8 d0 E, n, ]
) o6 l$ d0 Q- h! V1 O% c
微信图片_20240615160554.png
3 F+ ^" ?6 z) O% g

7 S- ^5 J5 g5 C7 a; j8 R
  • 找到该工具的安装目录
    : @% I) x- x* ]5 U& |' a7 o

3 ~/ ]' z6 ?  b. @& o
微信图片_20240615160557.png
4 h& z( f' H9 ~5 J  f
* ]7 I& ?' P: p8 ]9 I0 F
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常
      u% Y: T* I- ~7 i& a7 s, ^
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v4 _- I: A/ L. u1 G1 ~$ o  g
  2. GNU Make 3.81! a3 u4 k0 A# f2 _$ n* _$ K
  3. Copyright (C) 2006  Free Software Foundation, Inc.1 {7 W3 ]+ c" F. `- b- e& F, ~
  4. This is free software; see the source for copying conditions.- s; n$ H! }2 G- y8 T
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A! V5 V" u/ O6 M, g+ h" c! Q
  6. PARTICULAR PURPOSE.  f4 P5 {& i7 a! t( H6 n/ b2 ]
  7. + n7 j/ L: y4 B# x' e) M1 m

  8. + S1 K& I0 M6 l, n2 j/ E' T  F
  9. This program built for i686-pc-msys
复制代码
% h0 V4 d4 Y% R; i+ J+ s  E* m
03Embedded IDE项目建立-stm32标准库( u- }/ Y- f% S1 o8 O! s& J
1.工程项目建立- P6 N# N6 y1 K4 U, k) S% r
a.切换到EIDE环境,点击操作-新建项目-空项目图片$ b; w4 j8 G# T+ R$ s# d
* \2 k! n% q# G$ K) R. y0 }7 k" a: j
微信图片_20240615160602.png 3 ]+ n$ T5 i( R5 U( T
$ B# F* Y# w" A
b.选择一个合适的MCU项目类型,如Cortex-M项目
4 A& d! S! @& ^, e% O7 H) w& z; d9 S
微信图片_20240615160605.png & ~! z9 I, x9 s  n
+ \& v+ D: V, `, U: c& T- |  ]) n
c.点击右下角继续,跳转到工作区7 y% R4 A2 ?* ?
( H$ n$ J$ Z& E" K4 |4 J' z7 R" Z
微信图片_20240615160608.png
7 [! S7 z* C0 v) e$ x% N6 l

, j' b$ {0 b  ]1 {$ c0 L# i! h1 Dd.添加工程文件到工作区路径下。——标准库9 a; d3 A% C. a% ^" V' |) q2 [
! H% \; g' u& p. S. |) C

# N; p6 H/ R) n3 P
微信图片_20240615160612.png
5 h2 S1 |/ E7 m/ C8 j/ F4 s9 b/ }: ?) \6 @  k! K; d4 f: \
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    # L7 S- g- x0 p& r' s( N: ]! C
7 N- U# ?/ t' k8 o2 J! P
  • 新建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文件。" n0 N$ v" h5 f9 T- F8 u3 Q

4 {  F1 I- a" L/ t1 ^" U8 e
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    7 K$ k. t: V) V
4 d% n# @% E& z5 _+ t6 p
7 p) {8 v' [. `. ?  r  |. w
5 c# n  i* H+ I2 c# b8 p, e  t
微信图片_20240615160615.png 5 K, d7 Z- H; T: Q

0 x5 z9 _: F, I8 d6 ?. ystm32_flash.ld) y! T( S: J1 Z8 g
  1. /*7 l; G8 d/ y* U! x( m
  2. *****************************************************************************9 ^' @0 s' ]3 e" t  B4 S
  3. **( X) m* p8 @2 j) C* R
  4. **  File        : stm32_flash.ld( k3 J9 N7 ~, q5 y/ m9 Y1 V
  5. **0 }' f& {: C2 a: i+ h, {+ O0 H7 G
  6. **  Abstract    : Linker script for STM32F107VC Device with8 d# _$ D' _3 N* j1 I/ x
  7. **                256KByte FLASH, 64KByte RAM
    % m0 R5 u; A" z$ {1 q2 _
  8. **
    2 F7 J$ {, @: a* s% Q5 Y
  9. **                Set heap size, stack size and stack location according
    5 W' G  R+ Y9 J8 c
  10. **                to application requirements.; f0 i0 _1 }$ L/ W& q! m
  11. **
    0 a, S8 ~5 D, P  U# M0 b1 b
  12. **                Set memory bank area and size if external memory is used.# Z: ?/ O# D' S% Z$ v& N
  13. **. m6 ^) U) h! e' z5 A9 h
  14. **  Target      : STMicroelectronics STM32- q- s6 G4 c1 w  D# C4 m
  15. **
    ! B2 e% J6 v1 }. `; R3 i, \1 A
  16. **  Environment : Atollic TrueSTUDIO(R)
    / z7 t/ A% D2 q
  17. **9 H, H) r3 A4 k$ ~, X! r
  18. **  Distribution: The file is distributed �as is,� without any warranty
    $ h/ \0 C& T7 _' z) g# i0 g0 }3 c4 E
  19. **                of any kind.: A, b3 g; n$ Q+ S5 A7 E$ V
  20. **
    , x: h* D; d7 D
  21. **  (c)Copyright Atollic AB.
    * z) x; ~( l! E  J( a
  22. **  You may use this file as-is or modify it according to the needs of your
    9 `) ^( S  X& h8 t0 C- S3 f
  23. **  project. Distribution of this file (unmodified or modified) is not8 b' ]3 h/ b9 J; F7 q
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the9 v; h9 ?8 s9 _7 Q
  25. **  rights to distribute the assembled, compiled & linked contents of this& d  h+ [3 e5 c( M: l2 S2 T% J
  26. **  file as part of an application binary file, provided that it is built
      ~5 S6 F" f1 n* H1 p/ ]
  27. **  using the Atollic TrueSTUDIO(R) toolchain." _4 d% W3 c8 [( q( b* [
  28. **
    0 E- c" \8 R8 ^3 F! z$ L7 P
  29. *****************************************************************************
    % [2 n2 o- A$ B9 Z
  30. */# n( ]& g7 P" c+ h  c0 k

  31.   V3 [/ ^4 U- j0 `
  32. 1 w) y/ f- p( J( m1 K: k
  33. /* Entry Point */
    ) d3 [1 i# m5 B6 b8 Q$ y3 b& U* ?# m$ _
  34. ENTRY(Reset_Handler)
    6 c  v9 _: c) m+ o# m7 k2 C1 u

  35. * A; U7 s, a, \$ i1 J
  36. 5 S* X) a9 a9 u: m
  37. /* Highest address of the user mode stack */) a% L% ]" Y3 K- c6 |8 }
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    % F  e, I7 C" g1 X8 R. M

  39. , r; ~# l1 p& |% G
  40. % b# U0 O) ?6 u' ]# U) I* S
  41. /* Generate a link error if heap and stack don't fit into RAM */
    - u; J  [8 g* T3 ~1 a& E: g- s' G6 Q
  42. _Min_Heap_Size = 0;      /* required amount of heap  */1 C2 b2 J$ b! V" D% m, y, K* {" h
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    0 q# G. H+ D% a; z* h% G
  44. & h" k) a7 g1 _% E8 m0 @

  45. 6 ~8 S) L+ D7 i' N
  46. /* Specify the memory areas */" ~6 r+ ^$ H. J% q; a  G
  47. MEMORY8 Y" K1 ^8 S5 [1 v8 N, F
  48. {
    ) a' W5 m" _5 q" L$ o
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K5 j. Q2 S6 g( S7 Z, ~3 {) f
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K9 z. q8 Q6 `% N. b3 B. X0 u; [
  51. }, ?7 ]: J* K! w9 \& h# b. |
  52. ' e6 N  a0 ~3 T9 X( e" z! F) \$ t! Q/ E/ j
  53. " O. M8 d: T& o$ k, `1 N
  54. /* Define output sections */
    6 i' H7 m- N4 {  |
  55. SECTIONS# }+ O. v9 i* N) y& B
  56. {
    ; c" }1 d+ @' _' o. |+ x
  57.   /* The startup code goes first into FLASH */3 [' P) c! i' J& X+ G' a1 J9 K
  58.   .isr_vector :
    4 ]$ T6 T' O' w7 }  {8 ^6 N6 s' `1 }
  59.   {6 \& B* y9 h1 s1 V0 @
  60.     . = ALIGN(4);5 i. _/ T$ k! d; K6 x& r
  61.     KEEP(*(.isr_vector)) /* Startup code */; `. t9 E& A; r6 K6 Q+ }; g; u
  62.     . = ALIGN(4);
    . g/ S# |. H" v5 l
  63.   } >FLASH
    8 Z: ?- F1 [, L2 u

  64. 4 Q( F5 ?$ }' N# ^5 i4 u
  65. 3 m5 Z+ e& s4 V  ^8 K( ^3 Q  i
  66.   /* The program code and other data goes into FLASH */% W! i6 W$ i4 B, F; @, |
  67.   .text :
    3 Q* l6 k) |7 \- ^1 }
  68.   {/ g+ g, n0 o. t+ O' y5 L9 s! y
  69.     . = ALIGN(4);- j, r1 ]8 u0 o) Z7 V" t8 f  F- o
  70.     *(.text)           /* .text sections (code) */  l4 I% x5 R! c+ ?
  71.     *(.text*)          /* .text* sections (code) */
    , m2 Q( D8 j+ `
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    6 m+ [. B! ?# F  F* F2 f5 G' C
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */% n6 g$ L' h* T$ `5 i
  74.     *(.glue_7)         /* glue arm to thumb code */  _' R( W& y6 n9 I% G  L
  75.     *(.glue_7t)        /* glue thumb to arm code */
    ; k  [( D) r) ?
  76. & m2 w: \9 I6 x
  77. ' x! r. ^8 j" S4 }4 r
  78.     KEEP (*(.init))3 P, s, h! E# q+ k4 h
  79.     KEEP (*(.fini))
    + i0 L! n1 k+ d, m+ ^
  80. ' s; ^& v6 p* }* F& c

  81. 7 T9 i, s2 O5 Q
  82.     . = ALIGN(4);
    8 z  T2 p  S+ I# L
  83.     _etext = .;        /* define a global symbols at end of code */
    & V# K! j! K' Z7 ^& l
  84.   } >FLASH0 \: e- `+ O& j1 J* m

  85. ' k+ R: c; n- B( u

  86. * U( D/ S' z8 E2 D) m
  87. / f; _0 M; P# Z% q8 m

  88. ! ^& ?/ B! g! H& ^# ^( j8 J
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH* X, @' e- U6 v% G* o% g  w
  90.     .ARM : {
    8 ~# r" P) p% N" L8 T! U' ^
  91.     __exidx_start = .;
    " d0 y: F1 K. Q
  92.       *(.ARM.exidx*)
    & w" d/ ^, v9 a% d" z
  93.       __exidx_end = .;2 k; i3 u, J) o) U2 R% N
  94.     } >FLASH
    - ]5 j3 N" d5 c- b2 |+ K& R
  95. 1 A$ N" y5 ]/ \! N3 J8 J7 w

  96. : N8 f/ k( I4 C) y3 N- q
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH+ a+ M6 c/ i5 p8 Y

  98. 7 y1 x8 f0 D$ ?! k& y. d! ~

  99. - j, g. I' C3 d8 w
  100.   .preinit_array     :" _1 X% ^, g) A" U/ x5 O, `
  101.   {! A: }3 O- D6 g4 ^7 ^
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    ! C2 H* w9 w- b2 k5 l
  103.     KEEP (*(.preinit_array*))
    ' J& t2 J4 R& v5 i+ m' o8 O) R& I
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    3 c; n& {2 |, W- x5 K9 c* q! v% I
  105.   } >FLASH
    9 v/ ?* ~( E% m% G1 _$ d
  106.   .init_array :5 H. w4 d' ]3 C$ h1 \  Z9 ^
  107.   {  ~. i& l0 N' h
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    # v  J- ?. l5 |! }: _3 N$ N3 l
  109.     KEEP (*(SORT(.init_array.*)))# u! p+ ^$ ?5 T8 L+ B" ~0 z* }
  110.     KEEP (*(.init_array*))
      u- P6 K4 `' C7 B% }
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    - ?# Y: ?7 B0 g: h& _8 B
  112.   } >FLASH" ?& }6 l1 _' W! n7 y5 a6 s
  113.   .fini_array :
    / x& ?) Y; e9 x" A
  114.   {) C7 y: V2 z1 j1 s/ _& `# x8 B
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    / J/ x! \8 ?1 }5 o( ^' L- R0 N2 p0 L
  116.     KEEP (*(.fini_array*))' W1 E% v# y6 k9 M8 [9 r, Y; s, t
  117.     KEEP (*(SORT(.fini_array.*)))
    $ R2 r2 B/ c5 r- f1 g) e; D7 W5 r+ {' k
  118.     PROVIDE_HIDDEN (__fini_array_end = .);/ S% q. ^4 r/ }% _) M/ B
  119.   } >FLASH
    ( D. ]: ~2 F- x' g
  120. ; s- v/ B- i; `* k+ E

  121. 7 R! s& \: o" m0 u1 @9 v
  122.   /* used by the startup to initialize data */
    7 }( ^1 f) D: x. J
  123.   _sidata = .;# k6 W) x6 c" H/ M: _) ~

  124.   k3 K1 a6 T$ }5 b3 I. N% F

  125. / M: q) d! \& J: V, T
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */
    " N, z: Q+ p3 c; m
  127.   .data : AT ( _sidata )1 h6 ]- I( b1 z) I+ e2 }3 g
  128.   {
    / |+ L+ O/ l5 u" ]3 `) K) r
  129.     . = ALIGN(4);1 }0 ]2 G3 d* j
  130.     _sdata = .;        /* create a global symbol at data start */
    * o# }! h% }" g8 q% E! [. ^
  131.     *(.data)           /* .data sections */  ]& Y& z8 t. g5 u# p
  132.     *(.data*)          /* .data* sections */7 {$ u4 A( C' [- F2 s3 V8 z
  133. / W) M' b7 Z2 N+ ~7 b  I. F

  134. 7 L, l( l' X/ U$ m
  135.     . = ALIGN(4);
    1 {7 Q* S4 ^2 U, N$ \
  136.     _edata = .;        /* define a global symbol at data end */; ^0 b5 c1 N9 c& o: {
  137.   } >RAM3 m2 A2 X- e1 n* m% Z$ Y
  138. 9 J& f/ ~8 F8 ]# o: D
  139. 5 B4 a6 o' L$ u5 G6 j
  140.   /* Uninitialized data section */' S9 i  G* w; S5 X
  141.   . = ALIGN(4);
    6 E* @) r* B6 ]8 M" ^: b
  142.   .bss :/ t; v  X2 i& N7 |" D$ \2 E
  143.   {' @2 x# |  U+ B; e1 [  |  }
  144.     /* This is used by the startup in order to initialize the .bss secion */4 O5 e( I8 t9 m* c- @' l
  145.     _sbss = .;         /* define a global symbol at bss start */
    ' _; q6 B- e1 z' i) L+ m+ p
  146.     __bss_start__ = _sbss;
    6 o3 G5 G7 P- O1 @& w. H- r) i* W
  147.     *(.bss)
    + u" X. M* f& |
  148.     *(.bss*)# R2 ~  M, G8 S2 K! M" T- L
  149.     *(COMMON)
    9 K/ O/ a7 y! X( {- O8 B- c! O1 U, [
  150. 2 I3 w7 \8 T9 h4 p
  151. 1 K! X1 C. I( x6 F5 \0 E# H
  152.     . = ALIGN(4);' ~/ Y8 h) i, O+ ~. I! D" F- _# g
  153.     _ebss = .;         /* define a global symbol at bss end */  w( l/ i* x* O0 I0 j% o
  154.     __bss_end__ = _ebss;) h( m1 B. W3 }0 T- U4 g( R
  155.   } >RAM
    1 O! E1 V2 l  D- x

  156. 7 |( {3 \" _4 e5 a0 w

  157. ; f7 b8 `; N6 M6 P, p4 }- P$ \
  158.   PROVIDE ( end = _ebss );2 Q/ O! o( V: J( G+ `4 W( ^* w( p  T
  159.   PROVIDE ( _end = _ebss );
      x5 q) R: {1 U" k! b$ S
  160. + c; @: n) ~3 }+ G+ }) d

  161. & ~# l$ R8 D/ ?; B
  162.   /* User_heap_stack section, used to check that there is enough RAM left */# b2 D4 l! \7 M+ J
  163.   ._user_heap_stack :( [7 G, }. S. n* [+ m/ |
  164.   {
    5 u/ {% u+ f3 t! `
  165.     . = ALIGN(4);4 T/ e/ P1 C, |2 Q7 \0 d2 L& B( a
  166.     . = . + _Min_Heap_Size;
    ; N& q9 Z! K2 x+ I  u$ G
  167.     . = . + _Min_Stack_Size;
    - J/ R/ q5 e6 g9 \7 N) W
  168.     . = ALIGN(4);0 E% V8 _1 R2 l. b9 h
  169.   } >RAM
    1 j- g7 ~4 B. n1 ?' I$ Y. L( E0 Q, G
  170. ; ?8 E+ q/ P9 }8 |5 i
  171.   z: Z, O/ B# p; ^$ P9 I; b
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    ; @" u3 D+ E6 s2 E3 \
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */! ]  x1 Q; P+ R) ~& h
  174.   .memory_b1_text :
    + O- R+ `* j+ y$ [
  175.   {6 z( S0 c* I8 q2 z4 z5 ~* B8 ^
  176.     *(.mb1text)        /* .mb1text sections (code) */7 }9 u( q, y6 e- I/ K* o! c" n
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */5 G! K  B2 [' T$ o) [* s; y
  178.     *(.mb1rodata)      /* read-only data (constants) */) k: k1 _0 b" m
  179.     *(.mb1rodata*). q! X* I: C) @$ {7 P8 I! G6 R
  180.   } >MEMORY_B1  F1 H1 i& @7 ]* E

  181. : s$ s) {; j. q5 j/ P

  182. . p2 q5 R# R+ D6 C! }
  183.   /* Remove information from the standard libraries */
    # O( a4 X+ T( Y' u% y9 S
  184.   /DISCARD/ :) Z) g  H8 c2 O9 j- ~* X+ z
  185.   {2 j8 y  @8 R  w( z9 M& p
  186.     libc.a ( * )' M' E8 T' L6 l5 y3 E8 J1 g
  187.     libm.a ( * )5 c( K' @, \) h9 }
  188.     libgcc.a ( * )
    . K0 x. l& [; K; }! C
  189.   }4 D- m) `( A, J# `; I4 e, y
  190. }
复制代码
2 V$ P" \- l+ ~( q/ ?( `. m$ [2 k7 a7 A
  • 最终目录文件如下
    2 U% ^" g( d9 E$ o) v: \! z

; ?5 @3 z" J; n: U$ r5 G8 \2 J' b1 M4 S% f
微信图片_20240615160620.png
7 O: @3 i7 q0 b
) g3 e) M9 b1 x5 Q3 {: Z! J
2.在EIDE中使用标准库时的设置(无Makefile)# Q: G2 g) i+ w
a.切换到EIDE环境下5 b8 B9 ^. U* q7 ?$ X( h0 X0 O
. V5 e# C  w9 R4 a( u! l2 u
微信图片_20240615160623.png
  e$ H6 @1 X/ c: @: _* O. H2 w" Y, E; {  i9 f- L6 O
微信图片_20240615160627.png
- G; [& h2 W9 r% a- ?2 t: _0 t
% v' V' `( n! K6 E6 x& x4 G
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹# e- {+ j- F! O/ K1 r8 e4 h  z# ^

$ E  p2 M$ K* L0 M8 G  C( P5 o/ `
微信图片_20240615160629.png , w) n. ~. c& r; k
. R. k$ Q& @6 Z' Y5 W6 U
微信图片_20240615160632.png
: T5 f0 M5 z  c% ]' ^
* f! _5 {( Q7 M% U5 N 微信图片_20240615160635.png ' \0 a! d; B) m* h1 v9 b" |

' B; Y) m$ Y) G7 u7 V文件目录如下:
( B+ W! `* X9 d: S; c$ i# V, c2 d$ ?2 h, q) f3 \5 J7 Y
微信图片_20240615160638.png
; N6 B  [, o/ B0 u0 a5 z% Y& v' c4 A4 O3 G. z+ Z/ v( }: B
c.点击+号安装CMSIS芯片支持包
: h, s1 a& B6 P, N  B" R: e3 j& {( m+ ?' b2 x) z2 ]! ]: q8 e, r
微信图片_20240615160641.png * x9 ?# k- g- n& W) T6 B9 _

/ m; B) ], u0 ~# U2 P0 _5 ], x0 r 微信图片_20240615160652.png
2 Z; r0 O% K4 S. M* L( u( w( s, q" h- K  w  Q% ^
微信图片_20240615160656.png 2 T, g& X2 c- M' Q- j& {3 B2 F$ a
( @! x; X8 m; h2 R8 |  Y. U
d.修改构建配置为gcc
! X& X# R' @  |8 X- ~5 e. W) S; }& K! c$ S& _
微信图片_20240615160659.png
) h0 D. l5 n6 A- H2 ]4 j$ j- U, D9 Z
e.烧录配置为STLink/OpenOCD  L( q( Y: b2 A/ \8 u. O
2 b' j: `! ~9 [5 C; s6 }% q
微信图片_20240615160704.png $ D2 J4 T- L& `: k, z: e1 }

. I- I$ ]/ f$ D, ~6 P# nf.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
3 e* [: s- Q# i8 M. n7 M* q& @6 s0 s5 j! g3 v3 O
微信图片_20240615160707.png
0 |+ P3 H9 x- n; [: [7 r
; ^) e- V3 F' S$ D8 Og.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义6 W; s4 [+ [9 ~' o. z" x# O- I
4 t# }8 X$ j1 _' k
微信图片_20240615160710.png
7 c4 b/ O& B+ s% T! L$ S
/ g7 H0 U, h& W$ qh.此时编译可能会有下述报错& K, n0 U5 P8 t# T) l; O( ]# d
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    % g1 J9 D  x) N" _: @6 |
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

/ ?) J- }' I% B% h. m' }
& U3 g  k9 X& q
, p; Q! @6 t1 \/ H( I( A6 E) k
打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)) \$ T% }7 o: _8 i2 f  J
  2. {
    / _& ]+ r* a$ b+ P2 s6 V; j
  3.    uint32_t result=0;
    + r: s+ ?( T$ X& C
  4. 1 ~2 A- {3 P8 C
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    ) n2 V& z$ _: x8 u( G
  6.    return(result);
    3 Y$ t0 D5 l& L! j9 g
  7. }. g6 c: A3 E% |9 O/ ]+ q

  8. * q+ e  i0 r' Y8 m6 v+ M0 w: n
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)
    5 \  Q% r8 W7 S7 f# k# q& m- {9 A  ?
  10. {
    3 `* _4 B. ]% l- G
  11.    uint32_t result=0;
    ' W6 e; }5 \, Q0 c- w; n
  12. 1 @6 ~7 \. d$ m7 }0 G2 S$ j- C
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    # L$ V3 V" w% f3 c* O6 G
  14.    return(result);: w7 \9 J* j6 M$ H( p9 e7 c
  15. }
复制代码
$ o4 N) c8 ^* Q. R
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    # N7 X- B' k6 G& I

: R; I6 g/ L4 Q  v3 F$ ~* @5 _, X
微信图片_20240615160713.png
! y  T  Y: |1 [; {' j7 c( ~
  1. {" |5 q! p9 L" `" k
  2.     "configurations": [, V1 E& T* d4 B; e; ^1 E
  3.         {
    - _; H3 B2 `4 r" N" b
  4.             "name": "Win32",3 q; N2 Z, t/ Q4 `
  5.             "includePath": [+ o* q$ w( h0 C* M  b
  6.                 "${workspaceFolder}/**"," q+ _, O" Y0 ]. t( Y; J/ r
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    : W* h  g5 Z4 P0 |$ T" H" S- X
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",) C9 Y$ D* B, C5 _3 J* _
  9.                 "${workspaceFolder}/CORE"' y' V/ ~( ?( j3 v' K; O
  10.             ],
    $ ~! Z3 v$ S+ D0 o! J
  11.             "defines": [& v: g' J9 W1 f. j8 P$ Z; r
  12.                 "_DEBUG",; R+ M+ \- h+ A
  13.                 "UNICODE",
    / W; o, J' a5 l2 K- H
  14.                 "_UNICODE",. @0 a9 [. P/ H- |' [+ v% N- i
  15.                 "STM32F10X_MD",& s' s. k3 G6 B) d' E* y
  16.                 "USE_STDPERIPH_DRIVER",
    / n9 \/ Y) J! p7 O+ t
  17.                 "__CC_ARM"
    , V1 w& u" w) K# o- J0 E' d
  18.             ],
    ( d% z$ u. w9 M0 D* x$ U
  19.             "cStandard": "c99"# ?+ z' }. f/ m* G. |
  20.         }$ C2 s% p# e2 {  _/ j+ ~( L
  21.     ],  D5 o5 ]# k; ~1 o4 I" ?- t
  22.     "version": 4
    6 a# A2 v# ^) e" y0 Z
  23. " C* S, P8 K, ~5 z! X: h
复制代码

3 t) S5 m# a  ^9 m( D/ u3.编译工程7 A+ }5 E- z8 ^) u6 l6 O! m; F

2 {' h3 u( @6 G* ?: K. G: {5 k4.一些问题的处理:
! e. |7 o$ m7 q$ ]% r0 @" ^8 d, k& Ya.编译成功,但下载后没有任何反应。
  X1 x( j+ H4 V8 l2 w$ k注意检查stm32_flash.ld文件内容* }7 x5 }* c1 d5 K: l  r
  1. /* Highest address of the user mode stack */3 Q  s( ~, H9 U7 D
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

% o" g, w7 n) @% i; O5 D+ U2 L注意对应芯片型号
. x+ K6 ]( F) }3 l& l: r% T
  1. /* Specify the memory areas */2 n3 @8 r% ]3 [  k. x
  2. MEMORY
    ) R. J5 G! H  c$ s! j3 a2 Q
  3. {' i! D6 `0 Q6 x) d5 Y" Z3 H
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K( N: O9 l, z% h$ P& a2 F& J! M
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    3 s7 q) k  Y# S: R% @
  6. }
复制代码

7 b/ `# V1 z$ h; O0 z' m1 `% z8 sb.vscode提交(commit)代码时卡住
5 f6 j/ {( W+ \3 g" }( I- M9 L  n' w: t/ Y5 w
微信图片_20240615160715.png " J0 a! s$ T. s( S  m. n- e3 L

. p" ?% Z4 y' D, f0 b 微信图片_20240615160718.png
8 w3 K$ c5 P0 k( e! |
2 N& V. k0 g& ~& y$ N- ~, [% v 微信图片_20240615160722.png
6 K: F1 x3 e* e+ h& E, R2 c* q* h
2 O/ x+ V+ g4 E$ M3 R# G设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。
3 C7 r& ^, p  [0 x
, a2 w: @  x, Ec.结束
; P2 g( N' K$ Y5 j* b4 Y
' U: i  H2 E/ {2 }6 y2 _- S/ K
5.调试工程+ ]* t3 N  d/ u6 U( x
a.添加launch.json
/ H  k' U" N3 n: j6 h% l3 W进入一个C文件,点击右上角按钮生成launch.json& X8 }' t% J+ U0 u# \

0 D. v3 a% x% r  i/ |  f
微信图片_20240615160726.png + L9 {9 H7 q. q( P, Z/ s3 B! h$ J/ D

5 _6 X& d4 @# a  Q" s: [b.修改launch.json为下述内容
- F+ L+ D! u; `% Z1 n
  1. {
    / f. I7 y) b, T6 f) r6 j8 n; g: ^6 x
  2.     // 使用 IntelliSense 了解相关属性。
    / p$ b- a9 X0 \, Z. |
  3.     // 悬停以查看现有属性的描述。
    3 p' m. y' C# h6 H* \7 |5 _' j( G- Q3 w! H
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=8303872 q) W8 ~5 ?! i$ f! g0 x) J3 ^
  5.     "version": "0.2.0",
    $ {, O+ a; H; k9 \3 w& e
  6.     "configurations": [- @5 a- ?1 l8 h7 _
  7.         {
    + P2 p/ [( c& K
  8.             "name": "Cortex Debug",
    . z" _9 C* G( _) o' w
  9.             "cwd": "${workspaceRoot}",  // 输出路径. O" w! A  x1 G6 i2 Y
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序9 B( C! {  a( L# A
  11.             "request": "launch",
    * j! y- u  b" Z: @0 ]
  12.             "type": "cortex-debug",
    ; z, m+ U2 p" X1 E8 L; o  w7 U" `
  13.             "servertype": "openocd",    // 调试器选择
    ! a5 v* {  b6 d* @7 m7 A
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php$ d& `( y# g2 ^0 G
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    1 d0 u# n8 X# d' z7 K& ]
  16.             "interface": "swd",
    . O0 F) q6 f) v6 w0 b0 A
  17.             "configFiles": [
    * L& r6 c9 W: ~: f( ?: i, H
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    ; u6 u6 L& k" N' d
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",$ d% a% ~3 b, a0 {) |9 ]) ^
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"
    # s. A0 Z+ C! K$ G, u
  21.             ],
    , @8 ?4 {6 u) W" |7 J8 E9 J+ I
  22.             "runToEntryPoint": "false",
    % @, s: ~+ F' n) q; s
  23.             //"runToMain": false,, t* q2 m  e2 t4 w& K+ [- b* Y" ^
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    . H) z8 a7 H3 D3 \
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径$ j3 |( q7 y0 `
  26.         }
    " o: E* H; E' }3 Y4 B) ]2 ~

  27. 4 H- d. B# {* N' `
  28. }
复制代码
9 }4 x; b3 s0 u- D6 _; b% a
上述最重要的是引入openocd的路径。$ \3 D/ A) p4 a  o% ^
# j8 \/ j5 C) L& A) Q4 [* k, Q) t

, O5 O1 E5 g$ I3 `! m( Fc.点击播放按钮进行调试2 y" w# Q1 ^6 z9 b7 G, M# _

  ]$ r& \" N. f4 e8 C
微信图片_20240615160729.png
2 C. l3 E. v+ R  g0 n7 _8 ~- p
4 _6 Z- X* Z9 r0 W* r3 Y2 u4 E
6.结束
# u7 q$ N4 u4 }1 Y# e
& t& Z# e1 k# Q+ M& c
# U8 g+ T2 f9 Q, ]9 g' r8 p
5 x, O7 s' i/ ]转载自: kevin
9 w1 w) T/ F8 X' b6 {6 a0 i6 R如有侵权请联系删除- {, A# a/ L* |$ E5 B

  S# R9 Q/ f* D, M
' Z; B( y2 T- W+ y! k2 V
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版