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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
) x& V$ x0 w1 n% B7 z- z
6 g% R8 c8 r0 ~; |: [2 _) o* O, R, I
微信图片_20240615160241.png
- G- B, G5 Z  Y+ c7 O5 x6 {
* i/ c# v  O" E( N6 }% n1.VSCode安装与配置, c/ M4 y* D" a6 C7 B5 z7 Q
a.卸载
* Y+ I* F9 \! v% R/ Ab.安装
! V( ~! k' x" B: Y( {  ^& C+ ~c.git安装与配置
, ?& e- Z! i/ M" W2 }d.安装插件
* b9 v6 Q" L& t. v1 ?, |5 \1 @' t: j) M  b8 P2 ]! p# ^$ i, F

# z% [, Q! A9 r) X: Y2.Embedded IDE配置7 p$ x* Z% I1 v
a.安装EIDE插件- L7 {3 r' q& E4 H5 i
b.安装实用工具到EIDE1 \/ M: v# L) O( B; _6 ^
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools
    , `7 c6 i" M7 U
3.Embedded IDE项目建立-stm32标准库6 \0 d7 b6 g$ H5 b$ J/ r
a.工程项目建立% q# \! J- n8 K  N
b.在EIDE中使用标准库时的设置(无Makefile)  L- ]; Z- u- Y. V, O$ o& M& j
c.编译工程2 o$ G! Y6 v+ f" {% T
$ `, F* O* G2 B' e- |
4.一些问题的处理:
+ Q8 t, M' A3 }9 ^5.调试工程
7 q9 f5 x) ]% x- Y) k( K
/ _$ b: \  e5 F/ A01VSCode安装与配置
0 z3 b) b& @! C4 q: [1.完全卸载之前安装过的VSCode& X) ]9 G: a9 e) L' Q
a.卸载软件9 }' A6 \" K* q  v& y
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。$ y- R, X- N% u9 C; x
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。- s8 ^6 X- Q' D
7 m: i$ B# z) \9 Y+ U+ [
2.下载安装vscode, k" h- e: T: p3 O8 W" c7 [0 s9 v
0 ^' R+ t9 h5 U, x2 a: x, `
3.git安装与配置& B1 I2 r8 [" b6 @
安装git0 ^1 }5 J9 f6 f) Z& f
8 b: j3 ^% O, B! F
微信图片_20240615160248.png ; o  q4 Y9 l  h5 {9 T
) {; V$ V% H( m/ x
安装完成后,在开始菜单中找到并打开Git Bash
1 \1 L# E! Q8 p5 ~& B7 |: X
4 D0 N+ o; S( m' v+ @2 c
微信图片_20240615160250.png
( h( s4 k" a/ a- s# C( h
$ B4 j) @7 V" x
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git( X2 ?; N% Q6 ?  k
/ j6 q! m: P" S- M4 t
微信图片_20240615160253.png
$ Y) I% X1 |5 e! a

! m/ c1 u. a# B在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' * x  ^" D5 b9 Z
  2. git config --global user.email 'ct15762287606@outlook.com'
    , c( D1 m+ R% ^1 F4 e: ~" \
  3. //检查当前仓库状态; @( g0 ?& I) R3 I. W6 P
  4. git status2 g  B$ j. B( {. Z
  5. //确认git配置
    . l1 c; b; i+ R; K7 B& u4 F
  6. git config user.name
    2 P6 O; K* [0 H3 l
  7. git config user.email8 }; q7 e& x0 Z9 s
  8. //查看错误信息1 X* t7 V( e; F
  9. git commit -v
    ! Y$ M% y: u% n+ p6 X8 ~7 q
  10. //清理缓存
    4 J+ [" g8 d; H6 j
  11. git rm -r --cached .7 U- x, a, S: `0 J* x7 @0 @4 V( o
  12. git add .) L4 r* i$ \; m8 N6 i
  13. git commit -m "Your commit message"
复制代码
0 q: Z7 R& D' @; t/ J
微信图片_20240615160255.png % U% J; q6 p; Y7 C3 r+ A3 U
7 x) {; i$ ^2 v( w8 {6 X$ j
4.安装插件,如下图:
$ V) K& s8 H/ X/ I& R5 N
/ v3 l, k# H& }
微信图片_20240615160258.jpg
+ _6 K7 w9 ]  U1 h4 @+ B
/ t+ q: E/ D! m/ E) }
微信图片_20240615160301.png
% I# r2 [6 H/ H2 [( i4 n1 k7 O8 B8 I5 V3 ^: c( o
微信图片_20240615160303.png 8 h  ?$ m) I: n- ]/ d; f& ?

0 @, O5 P8 H) i  N" A( [) m 微信图片_20240615160306.png 7 |& @+ q4 v# E; i3 p

7 }- j' F5 I  K" D" v 微信图片_20240615160309.png
9 B3 g- S8 R3 X/ V+ g4 w3 T8 \
. ]; I0 T* k) B' C$ y 微信图片_20240615160312.png - G! B$ J4 L* r# A

% }; S4 N% Q+ o% b 微信图片_20240615160317.png
1 t0 m5 L% T& @% I$ @- c: W
. [+ U4 A; w0 W/ b9 ` 微信图片_20240615160320.png
8 G+ q# N% Q/ Q
3 s5 Y3 Y" ]- H. j# R8 \' V. u7 y 微信图片_20240615160322.png 8 ^/ i/ _5 @. P4 |  P
- M9 O5 Y/ @/ a' H+ \+ P7 C
微信图片_20240615160325.png
% J" [) D: |+ L8 d1 H9 V" \/ H8 u% x. L
微信图片_20240615160328.png ' ]$ N* K$ q3 W
7 }( R4 [! |$ L
微信图片_20240615160331.png
# p% ?- y; [( s/ Y( {9 J2 h! U! a$ L! P% k7 Y
微信图片_20240615160334.png & @, M# U3 r/ [
. `- u; t& Z: s" r
微信图片_20240615160337.png
( _5 I2 P+ F! }& E4 X7 e7 b- z: s  z5 t, }% u- m# p- k
微信图片_20240615160341.png / H: L" X2 A5 }4 r; H  ]
! V$ o9 k( Q  x
微信图片_20240615160344.png ( i* X  Q  D; a2 l( R! x1 h
- I5 R& W' R$ i' ?
微信图片_20240615160347.png
* Z2 d; X/ _8 w1 K  f3 y" \0 ~9 l$ `7 p1 B& R
微信图片_20240615160349.png " [+ j9 S1 C1 j9 ~, j% C4 p, a
* q( y3 Y4 u/ y1 r1 r4 M
微信图片_20240615160404.png * H  j9 p& `  M8 m% D
) I' @3 N3 P. F# a, D) d6 k5 ?# V9 G, [
02Embedded IDE配置
- C9 _7 d' |* l! ~- `/ i4 {* }2 A1.安装EIDE插件到VS Code
; n' Z% x- S5 K5 V( |2.安装实用工具到EIDE环境8 l1 E! v! O0 X, y# l4 U( Q
a.安装arm-none-embed-gcc工具链
* l$ f9 r, V. O: y# u9 n
# e& v5 L4 Q9 t* o' `8 _
微信图片_20240615160533.png ! z& S# Y" y2 t$ y! D- A5 i8 Y
' k4 X3 b' `( J! w! M4 N/ P+ Q% g$ [
b.添加其bin文件夹到环境变量
: {% W! d) c- ~0 K4 E( N
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址4 `0 O6 j. y0 ?

1 p" r6 q) [% X
微信图片_20240615160536.png
4 N) T4 G9 t: t' w# T0 s1 y0 b9 p1 {; ?- p
微信图片_20240615160540.png
2 D' t6 B, g" n5 b/ Q$ A# n
0 q. U* ~( q' r  h+ q
在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
8 V- j! r6 @, I* B- x/ Y
8 v2 C( h. H3 G) ?+ T  s
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

+ m3 K8 q9 j7 C! \% C4 Qc.安装OpenOCD
( X$ S6 |# @1 i! B
/ n2 {( s: G  e
2 H' Q1 z& S1 O8 ^) `/ p! W. U0 P, g
3 G& W6 X: ~. f/ ]9 u) h
d.在vscode中安装Makefile Tools  {( A: @# B' o1 T) O
( v+ N6 H* M& F( ?  p8 G
微信图片_20240615160554.png
/ o3 k1 L7 B+ c3 W7 Q4 s. i( @
' ?6 [! G! Y) t
  • 找到该工具的安装目录+ f$ Y+ x3 [0 t3 Q  z
9 c3 o5 B6 @( b7 O, `+ U  [) \
微信图片_20240615160557.png $ T; o$ j% a* ^
: p8 L4 e8 v/ W8 }- F8 g
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常9 W$ M( _3 f8 a. p1 N7 N6 w) y
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v! [7 V* E$ n$ R7 \
  2. GNU Make 3.81
    5 T- p# ?& ~/ d5 _: a. A2 u
  3. Copyright (C) 2006  Free Software Foundation, Inc.; G9 k+ K) _, w% d
  4. This is free software; see the source for copying conditions.
    7 G& \" n& d" G3 O3 ]
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    5 r9 o0 e- M, ~: U; q5 o% U2 v
  6. PARTICULAR PURPOSE.5 C9 H0 Q) u9 ^% _' p3 p, T
  7. 6 P& G/ ^5 w; I& k- L. k( ]! V, C
  8. + O- l3 W- p% T7 d+ _* W. h2 R
  9. This program built for i686-pc-msys
复制代码

0 U7 z* _- a% w! ]% w  d) q03Embedded IDE项目建立-stm32标准库: h' q+ T) u! |& y4 i1 T
1.工程项目建立3 J# I9 O' x7 x. ?
a.切换到EIDE环境,点击操作-新建项目-空项目图片9 K. A9 a, c5 P8 h  Z9 U
9 L+ l" i* Z3 Y* _" ?& L
微信图片_20240615160602.png
/ i( u- a3 w/ ]. ]6 k7 ?- u; F% L% A
b.选择一个合适的MCU项目类型,如Cortex-M项目# ], x% v+ l' \
. v# ^  d* D+ B' s# y& t' x- r, z: [
微信图片_20240615160605.png $ }: S* ^' m7 z+ R
- y) w( F, x& u! p$ G% q
c.点击右下角继续,跳转到工作区7 R7 h$ _/ g$ }4 F  B9 M; |+ k6 V) J1 u

! b. E& Z5 z% v( K 微信图片_20240615160608.png
4 H" Q1 O$ i0 @2 e# W1 g9 H  C
; N* Q' O1 S; z* k* F3 g
d.添加工程文件到工作区路径下。——标准库8 m" a& Z- }/ `0 y: }: U& y/ J
' z* D# W) O% i! C' ?

1 E3 |/ P2 I# J7 i0 j
微信图片_20240615160612.png
' O! H* C+ }% X4 Y4 y. r
& h& P3 G. z9 X! N2 W4 e& y" b
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    : x7 m" m0 J9 Y
3 g8 ^& E6 R/ s7 m- U! Q
  • 新建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文件。
    3 \- P1 R# d" w/ ~( {/ y% a. \, m1 m
% `5 O- F: s: ^4 n+ O+ u
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件5 u" t2 ^7 z( B1 Z
1 Q* M0 h$ f  m6 c/ d, Y: M0 k5 C. m

0 j3 m  y4 g( x, h' m. e; X6 p- K
" S0 x! S9 G0 d
微信图片_20240615160615.png " H7 A) _: Z( N1 j6 c( f3 f9 C
% W6 ^* V. q# I* ?/ D
stm32_flash.ld
! @9 n  _% O9 W; p9 l3 @
  1. /*5 \6 T( u" X. C  [
  2. *****************************************************************************
    6 b9 P' O1 e% t8 v4 h
  3. **
    1 ^2 l4 q8 g# ?- k! U, ?
  4. **  File        : stm32_flash.ld
    % F. B* r" ~! d) C' e/ J% C. r& V
  5. **) G* [1 F& G2 Y1 u3 @* x
  6. **  Abstract    : Linker script for STM32F107VC Device with
    ' R6 F. }, Y* I7 n# G- W
  7. **                256KByte FLASH, 64KByte RAM1 d/ ]: e5 U* T
  8. **
    + v4 M8 i+ J% @3 ]% u
  9. **                Set heap size, stack size and stack location according9 n( F: Z( v2 B6 `, |
  10. **                to application requirements.: k) t; u' [, n& B" Q8 d* C
  11. **! f0 [# i; E2 h: l6 J3 U# m: X
  12. **                Set memory bank area and size if external memory is used.9 @: e/ C7 K# E8 L1 P: Y! G
  13. **
    6 }! ?4 Z  E; A$ ^
  14. **  Target      : STMicroelectronics STM32
    ; \, i1 ~, J2 ?  U2 \
  15. **
    , U+ e6 t# f. b9 O  m
  16. **  Environment : Atollic TrueSTUDIO(R)
      b" o  p/ |3 n, ~
  17. **
    2 b! l, t3 [. H
  18. **  Distribution: The file is distributed �as is,� without any warranty& v) I8 U/ u) u
  19. **                of any kind.& {, M) N" Q3 K9 Z& J6 @0 B; k* c
  20. **
    * k5 D$ p+ [- }0 t/ ?  x
  21. **  (c)Copyright Atollic AB.
    9 U/ X$ ]6 X: r5 d2 ~
  22. **  You may use this file as-is or modify it according to the needs of your
    # J) \( G% g1 A2 d% q: J4 E  o
  23. **  project. Distribution of this file (unmodified or modified) is not) v4 q! u+ o  J# ^2 s9 F8 @
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    * s) m, J- a6 r5 z4 u6 b. F
  25. **  rights to distribute the assembled, compiled & linked contents of this! w' z7 x0 |7 ^8 i& K
  26. **  file as part of an application binary file, provided that it is built
    5 z) r. f# U; y# P4 Z$ x& e
  27. **  using the Atollic TrueSTUDIO(R) toolchain.% e" w3 C/ P+ h3 N
  28. **! U6 [9 [! v& K- ]
  29. *****************************************************************************
    / \( u0 E2 k6 b, H1 \
  30. */
    8 ?6 B3 m- F) e) e
  31. 2 o5 O. y% [6 |9 r

  32. 9 y, R. c7 K+ c) Y' G/ h
  33. /* Entry Point */" s5 s+ `1 N9 K+ x& r5 C
  34. ENTRY(Reset_Handler)% O2 q( I3 s3 F. c% G2 Y6 E
  35. ! x/ S% W; ~4 }
  36. - `! n: r9 L. Z6 C
  37. /* Highest address of the user mode stack */
    8 K, C6 b7 F" G% _
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    % M& ~+ i1 h- l8 y
  39. ! {# ]7 b5 Z, A! o8 x. W

  40. $ w4 s8 o  B, s
  41. /* Generate a link error if heap and stack don't fit into RAM */2 b; U; l0 Q4 h  X
  42. _Min_Heap_Size = 0;      /* required amount of heap  */5 f# g/ M( U' `6 T2 d2 ^* m
  43. _Min_Stack_Size = 0x200; /* required amount of stack */6 `1 {  l# d5 Q2 G" R6 L
  44. 9 F' ?/ |$ r3 W. I
  45. ; F, J. D/ C# {2 h4 Z' v
  46. /* Specify the memory areas */% l% D9 f& T* m
  47. MEMORY
    , H( L4 ^' ]* l# \: ^
  48. {9 s2 X! y4 a7 Z
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    - n1 e( {* V4 m, N
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K7 z7 i( w0 V, |* |! R
  51. }
    7 _6 v9 m6 i1 ~0 C; o# O
  52. 9 k' n) R# [1 c! l* L  K/ X
  53. & B6 P( Z/ o4 Z/ l+ ~: r, N3 c
  54. /* Define output sections */% N1 [* H, h$ K! H  o  i
  55. SECTIONS
    % D  v3 N$ [: N, @
  56. {
    8 T% G2 s$ T5 K8 y* l9 h
  57.   /* The startup code goes first into FLASH */
    % {0 w1 a+ _6 V: Q
  58.   .isr_vector :
    # o# p+ ?5 z& ]3 [5 {8 z
  59.   {
    + Q3 q$ W( z! ]$ i1 V6 |
  60.     . = ALIGN(4);  H3 G9 \- @  ^5 J* w7 I& B
  61.     KEEP(*(.isr_vector)) /* Startup code */
    5 [2 V8 s" U! [. ^& }! o
  62.     . = ALIGN(4);
    ( ]; R& B) B0 ]. g7 M
  63.   } >FLASH
    / \" `7 e; p9 B6 Q  t9 P: _
  64. 3 \% F) s+ ]9 D& e/ `
  65. & X. {. j" g* ~6 T) P6 y
  66.   /* The program code and other data goes into FLASH */! a2 w/ E! H- Q$ C/ i9 D3 Z
  67.   .text :
    9 {1 ~+ M8 q; Q0 r' V9 b2 k
  68.   {1 v% L; m9 n; d6 o  W4 ]1 p
  69.     . = ALIGN(4);
    4 X6 w% ]+ _0 |2 {2 U" l
  70.     *(.text)           /* .text sections (code) */
    1 Z* K& T% y: N3 w
  71.     *(.text*)          /* .text* sections (code) */
    8 c0 y4 n9 w* \( X6 C, x* B! J0 R
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    / o4 h, _7 O) l- V$ v
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */) x- _/ _" ~4 m- G+ a$ U
  74.     *(.glue_7)         /* glue arm to thumb code */$ q0 ~% f6 D! @6 V1 A' V
  75.     *(.glue_7t)        /* glue thumb to arm code */! g, ?7 q9 C4 r  h
  76. - f- @" g- b. C5 v1 K" A

  77. / B( M6 c0 m8 l; X  O. K% o$ ?9 D
  78.     KEEP (*(.init))/ N  D* f, D4 V% z2 e0 d9 n* h
  79.     KEEP (*(.fini))
    7 S0 k+ P* v9 k/ Y' ~2 r+ x) g
  80. ; C6 @/ W& q% [' u% q2 ?
  81. 8 u9 r0 \" H4 m$ H
  82.     . = ALIGN(4);
    , x4 a; a3 V/ ]% u0 Z) ?
  83.     _etext = .;        /* define a global symbols at end of code */
    + t$ n( M  C4 `/ N  f  x$ ?
  84.   } >FLASH
    - ?9 `9 @/ D5 e) P4 L

  85. 6 }! t: X: y- c. ]- D- I

  86. - C8 [1 g& f) c5 \
  87. * j# s* B, V, d. ]+ K1 C

  88. ; |# o$ ~6 w, c" m9 L' p
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    ' z+ M  H4 \9 B4 H5 M: x
  90.     .ARM : {
    5 ]8 ~0 Q3 `/ m  I7 w( v6 K! G
  91.     __exidx_start = .;: S8 T" |, A' F" ?% k) F! a
  92.       *(.ARM.exidx*)$ {- q9 y8 E: W) f& X
  93.       __exidx_end = .;
    9 e2 V8 P$ I- s/ x+ v# l1 U
  94.     } >FLASH
    ; G* O0 ~" J" Z2 r
  95.   F# B3 ?* B" S: j5 W& S/ x  D% w
  96. : K+ S- A/ `; j/ ^  b2 z
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    " {% l0 a( f: Y+ L( c
  98. 3 L4 n; l+ ^' U

  99.   a* d  }  y3 T* ?# Q# ~- Z# O
  100.   .preinit_array     :
    0 {% ~/ k* v' ~: f8 |! [; d7 s
  101.   {5 e6 p% o5 O% k+ V: A
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);9 g# k' ^( ?: _: Z8 _
  103.     KEEP (*(.preinit_array*))
      B/ C9 v# [/ o& D
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);. _0 w0 M$ n  A. l
  105.   } >FLASH6 |# v9 p6 M- L3 o5 k: p( d
  106.   .init_array :
    ; @( ~3 S7 |' z. L4 M1 s" x7 d
  107.   {8 R" S( j9 b( p8 L2 k: Z6 B$ O3 N
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    ( E# b! f/ }" @" S
  109.     KEEP (*(SORT(.init_array.*)))
      x7 ]- n3 q+ M0 C
  110.     KEEP (*(.init_array*))7 @% r+ Z, j, }8 K- X7 }% A
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    - `2 ~; b0 l, v) z3 z1 G+ V
  112.   } >FLASH
    6 z" g- \+ x: E; m+ _) [  i: j
  113.   .fini_array :
    8 K' L* h- f' z3 O% _1 ]
  114.   {2 ]: |- S! r6 c3 J0 d0 z7 ]* ?. [
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    8 S' X$ ~" a2 S+ b8 F. |
  116.     KEEP (*(.fini_array*))$ P3 j- a# @; A- {4 C
  117.     KEEP (*(SORT(.fini_array.*)))* l! Q- a& p. d0 j$ {
  118.     PROVIDE_HIDDEN (__fini_array_end = .);% e" k+ }5 B! j6 j) m
  119.   } >FLASH
    4 d6 Z' n) I/ t5 H/ U' ?% y( D9 ]

  120. ) R6 o4 i; u; B! q0 O
  121. : d% }8 F1 k& ~
  122.   /* used by the startup to initialize data */1 p) T  E/ r% {2 z5 h% k. ^/ m
  123.   _sidata = .;) z4 J" p' J! W" n# ?! I
  124. ' K) a/ C# ~: T. \3 F3 a0 ]* q
  125. 6 J# [( _/ C. a
  126.   /* Initialized data sections goes into RAM, load LMA copy after code *// @  Q# R3 ~9 T% |  |
  127.   .data : AT ( _sidata )
    % `2 s' b5 I5 Z+ f. f+ p! u; i5 _, X
  128.   {- j* o4 K& R/ I
  129.     . = ALIGN(4);% i; V+ E, ~7 J- {
  130.     _sdata = .;        /* create a global symbol at data start */, W0 A" m- R, p3 c( K9 }( j
  131.     *(.data)           /* .data sections *// |/ Z: O3 }9 N: ]9 j1 K
  132.     *(.data*)          /* .data* sections */9 m, w9 \5 I/ B) m4 G* v
  133. - w: W! _8 ~) Q. ]+ n
  134. ' G! G5 |, s8 W; L. t3 }4 m% A
  135.     . = ALIGN(4);; d  m& l) c: I9 u% {% [: l
  136.     _edata = .;        /* define a global symbol at data end */
    ! F1 H8 O, v1 |
  137.   } >RAM
    9 S. O/ E6 g$ ^# X3 E
  138. & x: t6 v+ d3 U  J( b3 u+ X& l9 ~

  139. 6 |7 ]$ S5 X% L; N
  140.   /* Uninitialized data section */
    + M* a: b0 G+ s( \
  141.   . = ALIGN(4);
    - M( f1 Y8 _4 {+ g
  142.   .bss :
    , X9 x! e* C- {
  143.   {
    ; k7 \, h2 ~# o6 Q2 C
  144.     /* This is used by the startup in order to initialize the .bss secion */
    : |/ \: P  x, G! Z" u4 b& Y
  145.     _sbss = .;         /* define a global symbol at bss start */1 E: r$ O/ F3 i1 s! B' Q8 Z
  146.     __bss_start__ = _sbss;
    % r) o; y) _- U% v" M2 \
  147.     *(.bss): r+ l5 X: m5 K8 P# Q: U
  148.     *(.bss*)1 M& q* I8 I6 ~: Y0 L- d* S
  149.     *(COMMON)& M4 _! ]) j% U+ T1 e
  150. 9 u5 ~; Y( X# j& H& M3 g
  151. 4 c" n4 k/ Q+ ^8 Z7 w3 o7 y  @6 W
  152.     . = ALIGN(4);- D# l1 B7 S, X5 ~1 \" w
  153.     _ebss = .;         /* define a global symbol at bss end */; O4 l. [+ d0 w3 {- e
  154.     __bss_end__ = _ebss;' Z+ ]1 ?4 q% J4 k# d
  155.   } >RAM- C# e) j/ g- G2 }$ H( o
  156. ( ^3 v3 l, K' F, J6 a- B
  157. . {0 R# e) G$ |0 s( [$ @8 e
  158.   PROVIDE ( end = _ebss );
    4 o! K9 J0 O8 O4 @: M
  159.   PROVIDE ( _end = _ebss );
    * t! Q2 D9 w' T
  160. 1 B# e& Z* D6 L6 r* i
  161. : e6 ?+ v2 |- T, ~& O% d" M$ R
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    % K" L  x% J0 u0 v( C. }
  163.   ._user_heap_stack :
    5 Y; z& i, q+ ~$ E, y; Q+ A* w
  164.   {
    ( K& e3 w7 Q5 i3 @6 O/ X! I! \
  165.     . = ALIGN(4);
    * `; \8 [9 O; u! s0 o' i
  166.     . = . + _Min_Heap_Size;
    ( M( \! F$ B. Q% D
  167.     . = . + _Min_Stack_Size;
    1 j; M% }4 B* [( `
  168.     . = ALIGN(4);
    9 m) A$ q6 V5 e* [
  169.   } >RAM7 E1 w1 u6 L: q$ {$ G% C1 O, o

  170. 6 y2 r2 z6 F+ n! n- w  U' i5 l  x: G
  171. & v* D) F" }) u+ \' `* T
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */# e& C' G7 B4 c! ~2 m
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */8 O# V# m( ^5 a" ]" \( ]( G0 |
  174.   .memory_b1_text :
    ( p/ V! p2 f3 M0 {( L8 g# @7 g
  175.   {" \  Z  Z) q; V4 R5 n$ T7 N* u
  176.     *(.mb1text)        /* .mb1text sections (code) */
    ) t9 a, F' }/ T. Q
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */; K9 k+ }& \6 Z1 D3 M' B
  178.     *(.mb1rodata)      /* read-only data (constants) */. R- ~+ q$ x8 a$ w* v  y; n: f
  179.     *(.mb1rodata*)
    5 R3 B5 Y" l8 \9 s! P
  180.   } >MEMORY_B1
    ! m: T8 @) Z9 m8 F6 B- ?
  181. 0 v, V; z  E% q) R' I

  182. - `! u  |1 }2 y2 X; u# _" x/ X
  183.   /* Remove information from the standard libraries */
    ( n  S; E  C5 g0 T" W2 f
  184.   /DISCARD/ :
    6 r1 ]% n' ^" Q' P
  185.   {9 q& T7 [, Y7 F8 L$ k; w6 h0 x/ c
  186.     libc.a ( * )
      {" {( e3 w1 A/ l# ]" {) B2 r- m
  187.     libm.a ( * )6 J; C( i) s' ?
  188.     libgcc.a ( * ). {/ T' j. p. C, {  ]: P
  189.   }: \. F& R  D5 v( o, J
  190. }
复制代码
* d! N/ d( _0 t. q: B& v
  • 最终目录文件如下5 i  W2 D+ a" q- B' H/ `
/ j+ P7 C% [9 T3 ^
微信图片_20240615160620.png
$ c' I! T, A3 a( w2 i

  M8 V$ T$ f; U; f( s1 _+ W2.在EIDE中使用标准库时的设置(无Makefile)" Q5 O: |0 ]! u* W4 H, ]
a.切换到EIDE环境下1 L. [8 c, c0 I7 F" ?5 A
; X& u( e$ L8 C4 h8 k" d+ F. y: @
微信图片_20240615160623.png * J8 R2 x' l, H' ^- U% H; G

! b5 a) T9 N+ k, U% E6 @' _8 c5 z* Q 微信图片_20240615160627.png . l- c# {1 n, s0 r6 a2 u/ L, ?

: b4 F6 B) k. L+ h. u; ?% b. Gb.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
* P4 E3 F4 b! ~
2 q% g; r; ~9 z2 U; F
微信图片_20240615160629.png ( L. p6 x- E/ D5 K8 @' |

  x9 L% z, t* s0 Q/ M, _8 F 微信图片_20240615160632.png 9 T, Q& o. a( N( C( M
: v2 V/ O# f9 s" D& M
微信图片_20240615160635.png
  K; T3 s- I6 ~' D
; N+ b* R# |$ ^2 A文件目录如下:
+ f7 x* i  L( N+ ]$ ^/ C& S  Z0 V+ k! F+ B
微信图片_20240615160638.png # K3 J; o* e) w+ y- S) W9 e

9 u, @3 C4 W' K" H9 i6 vc.点击+号安装CMSIS芯片支持包& }2 {) j1 ?: d6 M( q% r6 w

' ~' A0 h  J4 _2 O6 v% I, U
微信图片_20240615160641.png
; g) _/ _3 Q$ F$ h9 k! Z: \- T
0 W! S8 Z% b3 V$ W2 w+ P- `3 m 微信图片_20240615160652.png % x1 d3 y9 ^0 ]9 O
3 D$ X! L* b4 S$ [; Y
微信图片_20240615160656.png + z/ v& K3 _' Y2 d

& o& U2 c7 B9 R  _9 ~d.修改构建配置为gcc) e2 }& C+ z6 ?

4 A/ p- N) |+ `7 l9 z1 V
微信图片_20240615160659.png
. h, y# x: M! d5 y4 D% I7 P0 C5 y" K9 d8 ^
e.烧录配置为STLink/OpenOCD
: U/ ^4 u4 W2 S6 ~- t" m
' t. k: J2 `/ \+ U3 }# Q" Z3 Z6 J
微信图片_20240615160704.png
/ r& B5 W) V$ L, k: f5 Z  s1 \& l
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
, H! r  n7 E4 f; @8 S
; I4 A2 X( u# D3 v5 G7 }, Y7 d
微信图片_20240615160707.png
6 o& f( l) {) J! x* _% j+ l
' `5 ?2 m  F3 Xg.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义  _  v4 L) e) B6 F1 Q
& \( V: n) }' k* a) W' q
微信图片_20240615160710.png $ u9 A! F1 p0 q

0 Y& Y* M3 r  V7 c0 H8 {h.此时编译可能会有下述报错
& d- u: l( Q7 A& u; M5 z- i! L7 `) }
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'8 M/ i0 v  w, E
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

) _. f+ h; @) ]+ u8 W7 x
5 _" U: h! f6 f& u

- y; N; I* T; B6 X  g6 X打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)! E8 M* [0 |" X
  2. {- A7 I# A  b4 O1 K" F6 }" R
  3.    uint32_t result=0;) q: X+ y2 {2 A. G

  4. $ A% f/ G7 _4 |6 X
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    ! R( x; n! P( D3 P
  6.    return(result);
    5 N9 k# S# ^7 ~, Q3 @" c7 d7 v
  7. }3 T% B7 |. p6 I$ e9 E6 i! U

  8. , }. v0 @* x; F$ ]" \  e
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)
    0 d# H4 @- \2 Q. B; ]6 ]1 I& d& e
  10. {+ p" M9 n+ B6 ^
  11.    uint32_t result=0;
    0 c. N: [* p/ F# G2 g9 _1 e" Q

  12. 1 L7 I4 q$ J/ a6 j( _' @& ?
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    # O8 q/ J: t! T5 \
  14.    return(result);
    ( J% K0 j5 G% s( i/ P
  15. }
复制代码

7 j" q. ~9 j6 Q+ [
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    0 u4 V" w0 L. m% r+ P3 d" j
5 D5 T$ a( k& {/ v: ?) s" \9 `
微信图片_20240615160713.png & D7 m) ^& U- W7 ]# |
  1. {  l# M. r" O7 J
  2.     "configurations": [  a: m- x. R/ ?+ V; _7 a
  3.         {
    4 P& _7 @$ ?2 @9 _* r
  4.             "name": "Win32",8 c+ L$ L9 s. ^/ h! A$ \, x3 D- `
  5.             "includePath": [- f) _- B( l7 m/ q0 L0 o
  6.                 "${workspaceFolder}/**",
    8 {! n4 T7 H8 A% e4 s) a/ d8 w4 C
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    + K$ E/ f( T% G8 s! D. y
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    9 K) u; j. F) K
  9.                 "${workspaceFolder}/CORE": t8 F, l, t' Q% c
  10.             ],0 A, R' I2 J# C9 D
  11.             "defines": [
    1 s: O  u6 Q: `7 x' K6 g" E' Y
  12.                 "_DEBUG",
    ; A' s% s$ ^# o" z
  13.                 "UNICODE",% X9 Q* T$ `3 {3 p
  14.                 "_UNICODE",
      C; u+ M' N8 M% O' u4 s0 w) M
  15.                 "STM32F10X_MD",5 Y6 O: ?8 ~8 N  Q# `" k
  16.                 "USE_STDPERIPH_DRIVER",
    0 Y0 W& f- R  z( S: N% D% X' c
  17.                 "__CC_ARM"& |- s4 \1 }7 }
  18.             ],; A5 I) I3 [! R$ c& w# o
  19.             "cStandard": "c99"5 @. n! Y5 P. G* y3 Z( |
  20.         }4 y, o' M4 o! ^/ B2 \7 S
  21.     ],
    6 }) w) q( @6 [
  22.     "version": 4
    % E5 V  D1 k/ j+ A  a1 t: }
  23. 1 R1 \$ b, y2 x- H) v
复制代码

/ C( S; e3 O: E" d6 v6 k' V3.编译工程
& P" N5 b4 N& @% l% f4 \: P: i
; Y* P0 I6 ^$ S. g( s: _+ r4.一些问题的处理:
& C. U/ F/ @% T2 J5 Q& @6 Xa.编译成功,但下载后没有任何反应。
6 U7 ~) Z, v/ f8 [8 F5 o* T注意检查stm32_flash.ld文件内容0 G# K" B0 i4 |0 y
  1. /* Highest address of the user mode stack */: T0 s) p  Q2 q& [& R" M
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码
3 Z2 v  ?- c- C( O3 w& o* q$ n
注意对应芯片型号
2 B, j( Y6 N$ Y* o5 b' T# d% D! q
  1. /* Specify the memory areas */
    9 w7 p0 U- n4 ~% t$ S7 i6 n
  2. MEMORY9 [4 _; j9 [& V4 l. H- m' w
  3. {
    # S# `$ M7 T5 v$ J( \" B6 c
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K3 |0 I) t  R( L! c( u
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    ' g( M2 L( s$ Q" j' X- Y$ i* Y- O
  6. }
复制代码

, [( c: H# m5 {) m- R4 y. Eb.vscode提交(commit)代码时卡住( L2 R& q$ T  v" U' a+ Y( d5 E& R
9 R5 ]/ ~# T* V, }. u( t6 S
微信图片_20240615160715.png
3 Q0 T! v. _. ^5 y. W1 X' D. G0 w' V% m9 z4 |* ^
微信图片_20240615160718.png $ \7 s6 m, L, U- ?- N

* B: N) {( Z* V+ ^& T" l! c# F 微信图片_20240615160722.png : d8 k4 q  v6 \* w* z  v/ p4 ]; X
2 n4 l" D- I, e1 v( y  l% g
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。& E1 @, O9 w" t- P0 t3 K
9 R9 V: c( W; L1 o; o* c" a
c.结束
6 |' I* ~+ r: x. a; L! s

5 Y$ v; q8 D- c& _' O1 I5.调试工程8 m# }  ?6 g& O+ U
a.添加launch.json
1 D8 d9 L2 O2 |- h. ~进入一个C文件,点击右上角按钮生成launch.json
4 Z8 o' j% V& R( V3 T1 |+ P$ X
0 t% O& a3 \" C
微信图片_20240615160726.png * H. P1 T/ y' s9 T4 }- T  `6 g+ t
& ~5 K3 n4 m8 F# w. p" o
b.修改launch.json为下述内容
  Z  o8 b+ ?9 @; t: \& S
  1. {
    1 L" v4 D' ~* V! P) U+ P7 `
  2.     // 使用 IntelliSense 了解相关属性。/ t' e/ r* g. q" R4 s: L
  3.     // 悬停以查看现有属性的描述。
    4 ^4 c( U: R* [  I  m
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=8303874 h% x1 `# e$ J8 u/ J
  5.     "version": "0.2.0",# C. K) q; Y$ J. b, @% Z
  6.     "configurations": [( D" f2 Q0 z. a+ M. d( n" x
  7.         {
      H! i" `3 w- p4 t/ e+ E8 v
  8.             "name": "Cortex Debug",
    & |$ U$ V! [( b: [3 @3 f/ p
  9.             "cwd": "${workspaceRoot}",  // 输出路径* d' b( M& m' f- O8 Q  F2 g6 y1 H/ x8 n
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序
    & \- Q. W3 t# w6 J* {# R  Q4 T! l7 r
  11.             "request": "launch",
    " t& r4 `4 k/ `$ O! G
  12.             "type": "cortex-debug",
    ( a- Y" q# \, M: Y7 I+ b
  13.             "servertype": "openocd",    // 调试器选择
    4 j$ d: o: O" D& n" v4 ^9 s. t) O
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    % d3 ?5 g8 _3 H; H
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载, a- W9 ]0 c' O- Y
  16.             "interface": "swd",. v# k. y: U3 j7 T
  17.             "configFiles": [
    5 G6 Y# _4 Q7 Z; M( f
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置" _- w& i* h5 l. e
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",7 `9 |: ^) j; ~8 P
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"# D+ a: n" v) g. S7 Z
  21.             ],  e& x6 i" {& W6 O% c, L4 K$ t
  22.             "runToEntryPoint": "false",
    8 a& `5 h7 D9 m/ c$ Z: B
  23.             //"runToMain": false,
    & B' f2 O; y. m0 x+ |: o
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    - G  Q; y- S' w$ H/ e' X, w
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
      E9 X' i8 K: ^: V& i
  26.         }2 O" p- h% R, D: O' ?

  27. ! @5 p! W) k; N
  28. }
复制代码
% i, b5 F4 W+ U+ z
上述最重要的是引入openocd的路径。
6 [  F* S3 |5 L0 t  B! O, x& u6 @. L3 {+ N% J5 V3 Q
! j( i0 w# a$ I$ V% z9 V  F
c.点击播放按钮进行调试
7 o( I& ?& @0 D! }9 _4 `7 }- J9 ], F; Z) {( a
微信图片_20240615160729.png 9 o' s. Y2 h: Z/ K. l6 ~! E

4 C! c$ s4 |5 A  F; D+ e6 Q% m6.结束9 ~% N7 _. A0 @& ~7 ?) ^

) I; K) K4 {% Q. A
* [$ v$ h2 O1 P* M0 P' o" P0 z$ Y1 i9 n0 h3 k' q
转载自: kevin# r' n$ c) n; ~0 m: @
如有侵权请联系删除
3 W2 R" ]' @; K' J2 _' o
, R. V& c8 D  g5 g7 L/ e% w+ a' C: z7 C
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

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