请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
0 `+ j9 P% S2 e5 `( f: g( _. v
; ]& J, d# y9 m
微信图片_20240615160241.png
9 h! Z& d- E! }7 J) @
, k  U9 u, v% h' H" o* `1.VSCode安装与配置
' c6 U# q1 J* h1 t5 J' r" `a.卸载! a" I! n: R+ k! K) r/ H$ a
b.安装
5 H! V. r. W5 F  Fc.git安装与配置
+ b5 M- X/ _! O: \8 ]4 ?d.安装插件7 E7 r( k* i1 _' p) O2 C

( \, L3 Q- ~  d4 S

6 c7 r( ]. J- @# ~$ [2.Embedded IDE配置9 ^# e/ E: n; W! N. Q
a.安装EIDE插件" r0 z2 f3 G$ Q" t5 p9 t; @" [5 g
b.安装实用工具到EIDE
/ C. B: c! n; a9 p/ H3 X7 D6 C  v, _: s
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools" `% ]1 o5 C/ U
3.Embedded IDE项目建立-stm32标准库
# [5 w# z, v" d1 S& ta.工程项目建立/ W, ^+ R3 N2 Z. D, y, s7 s% k
b.在EIDE中使用标准库时的设置(无Makefile)  F/ y% L8 ?4 W* F+ r
c.编译工程
  U2 x& q4 J- W3 U+ Q
$ ]6 c# N' |% ], G4 k' \; M  f
4.一些问题的处理:; E( y) U' \2 q* M2 x7 A
5.调试工程1 j' U( b  |# g4 F$ s" x- S

* i, S4 O* A* V. S, l7 w. T01VSCode安装与配置
( ?2 s! ~3 ^# T9 R" d- e1.完全卸载之前安装过的VSCode
- X; q, _: F: l6 l4 pa.卸载软件
2 A- t# K0 `. q( q, K% C7 jb.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
( D' M+ S" ~( J. Z7 n8 B" z% o+ _c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。
' \7 u8 u/ ~( ^! ]3 M$ R2 p' g$ k1 R
2.下载安装vscode
; \3 \# Z/ n5 j* r, o! I
) u& D2 g3 l' Y/ _
3.git安装与配置( ^" Z$ e' E. L
安装git3 V1 F2 N6 |$ R7 A4 P
8 j) M$ z3 d+ y$ m- B4 o& Z
微信图片_20240615160248.png : u. r8 b' _7 X3 [
- }3 B7 D3 [0 y3 p. M
安装完成后,在开始菜单中找到并打开Git Bash
" y9 L3 R* z1 d9 T: I' d  u5 }( c
微信图片_20240615160250.png
; c1 `% m7 z! f

$ J3 {7 `8 a- m& C9 h在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git" g: ]4 S8 T7 S

3 |, l5 ?4 C8 Z
微信图片_20240615160253.png - ]6 M' w0 M& V" j1 A4 O& L

% H$ x+ r- O4 {  x1 N" Q0 w: g# K在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    1 e! I  `/ ~5 l  m
  2. git config --global user.email 'ct15762287606@outlook.com'
    ) _' F  i3 ~! G0 ]; d7 @) \, ]
  3. //检查当前仓库状态
    1 t* b( |7 t5 d, t
  4. git status
    + f3 b; N8 q, R
  5. //确认git配置
    # k+ _7 j0 m2 v
  6. git config user.name) e/ i# `( k- W& s! Q
  7. git config user.email
    # f2 G5 m. G. y# k% T4 O5 R
  8. //查看错误信息
    0 F. s8 W8 z. G8 y
  9. git commit -v2 f' q( {0 I0 O3 R9 b- K
  10. //清理缓存2 p2 |: w; f1 w+ P  `$ I0 C
  11. git rm -r --cached .
    ; B  v& D2 S' Y8 r
  12. git add .
    8 P3 @9 z3 t' q" }2 G2 t
  13. git commit -m "Your commit message"
复制代码
! @* ]1 Q: Q  s$ {" d$ Y0 |
微信图片_20240615160255.png
: E' H) t' L# V
; E6 @7 `4 h9 w( `4.安装插件,如下图:
( M) b+ L% X. Q. {" D
- w& I- s/ h! \( w7 ~
微信图片_20240615160258.jpg
9 N: r6 F% B3 }; J$ \2 {( |$ u3 j' u, n; _0 [& i
微信图片_20240615160301.png : H: c2 L1 \1 l9 c9 ]0 j0 b

; f4 J; L! p; z0 I" @2 f3 R0 `
微信图片_20240615160303.png ' `: i% U" [: Q1 w% U) K

1 [, x3 E: J) J( \  l4 H) s0 a 微信图片_20240615160306.png
8 c2 ^1 [* Z- i( b4 H/ K/ ]% I5 D5 b9 S. [
微信图片_20240615160309.png . y' e( o8 G5 o7 y$ A
8 {/ ?9 g. S# K& q( T4 W* h! f1 U
微信图片_20240615160312.png ! M" Z4 x! f( C$ p) Z
; ?+ g6 ]1 S  v( l! d/ e7 C3 K
微信图片_20240615160317.png & z- }5 r: t. j) R% A5 d% z5 o

3 b/ E9 V3 b' r; j2 K8 ?4 P 微信图片_20240615160320.png ) u! w6 `7 M0 J( J
8 F- v9 }0 O, t" j
微信图片_20240615160322.png 4 E6 H8 F. Q: s" s+ o% E  [: u

' N  a& r) b/ m2 N( Y' t 微信图片_20240615160325.png
- ^5 a% q/ X  d% Z& }& }# I" B
' e. V1 e8 U) j; }: M& a+ L( Q( [ 微信图片_20240615160328.png ( X# X# z; g7 n* Y, S: {; v

8 X: T4 d* T8 G+ g2 e 微信图片_20240615160331.png 8 [% J9 |, E5 G8 O' Y+ K- h

0 ^6 m& q2 p& K8 D9 N! T 微信图片_20240615160334.png
; J/ X" A6 j9 \8 z
! n* c: W& w* M, m7 o; l 微信图片_20240615160337.png 2 p" Z4 w, n* p2 \6 F4 Y; u9 `
$ v$ R+ a+ x3 s& I
微信图片_20240615160341.png
. Z" u, ~( y( G: W, e: E  N8 z2 M3 C( s& m* V) i$ g
微信图片_20240615160344.png 9 G: B. P4 w6 m' t

/ }6 R( \- c" w6 m 微信图片_20240615160347.png
0 m1 [- @: E' y0 j9 \( Q
/ d0 Z! Z. s1 p8 y0 X 微信图片_20240615160349.png
8 {5 n# L8 ?* O9 e) m
  X. Q+ j0 F, |9 G, z% m 微信图片_20240615160404.png
/ a* b- C* M( C/ f" Q0 S1 \& j. [* I# @* S0 i& B
02Embedded IDE配置* G, Z* U$ t! E* Y: y
1.安装EIDE插件到VS Code
9 M; M* Z/ o( _$ \2.安装实用工具到EIDE环境0 l3 @8 a! d( r" G1 e
a.安装arm-none-embed-gcc工具链; ]' h5 d% Z& g: A2 q/ Z4 X: a( r
, m8 ]2 p2 ?, }* A
微信图片_20240615160533.png . t4 Z2 i: s" ~/ C: X( L0 U
0 j; g. g& p& _! {4 C
b.添加其bin文件夹到环境变量
1 G) Z7 H0 z7 y; Z
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址
    % c" a2 u& G5 F7 N1 a9 h! W$ }# q
5 l3 L9 i4 \9 t- I; r
微信图片_20240615160536.png
/ [$ I8 V! R* ~1 r, f  L. k. o1 x+ g. @" J
微信图片_20240615160540.png
8 u' z. `1 J# \5 i9 \

0 ]6 i, n) Q, q- _+ A: o/ g7 s在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
8 r5 _7 X2 R# {* i6 K6 p% G- y0 p" P3 b% ~/ `* U
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

. C) D# u0 S3 x$ w2 T1 pc.安装OpenOCD" x) f7 a, G3 o) h" ^3 e

. L8 j0 r* U  d; F$ @  q3 y

% y) B$ L( ^% H. H) M8 m1 ]6 Q+ P9 F
d.在vscode中安装Makefile Tools2 Z: N3 @9 i3 }4 {; o! w
/ v4 A# u0 u# J, c# R! `; n
微信图片_20240615160554.png
4 [. L2 s: t" o; i9 a, U5 F1 l

; W6 `6 j# p* q' }1 Z
  • 找到该工具的安装目录$ W8 i. C8 K) m+ a

* L' u* I7 m. G' q( k0 e3 `, |% P
微信图片_20240615160557.png . c7 ]/ ^' }% q

7 H  b2 x: ~& ?0 Z
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常
    2 i' ]; }& [4 G% R5 G% z" T
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v8 l% _' D) D" H0 t
  2. GNU Make 3.81
    . D4 a- D2 ]( _9 e& k' I* X
  3. Copyright (C) 2006  Free Software Foundation, Inc.
    " H& z; d$ g7 [# `" Q5 V
  4. This is free software; see the source for copying conditions.
    9 t* D- K1 z( k( t7 }% w. x/ u
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    + R, w; g2 D' G4 L5 D* W" j2 ?
  6. PARTICULAR PURPOSE.
    ( {- i, B# j$ h

  7. " E. D. X8 Q& c/ p0 j
  8. 9 l  X9 k9 c- Z' ?# S8 m9 Q/ m! y
  9. This program built for i686-pc-msys
复制代码

* z. {8 V# V) [7 F+ G5 T* I03Embedded IDE项目建立-stm32标准库" C9 m0 e* |" c2 d9 M" f: u( @
1.工程项目建立0 G6 q* a1 i- H8 f
a.切换到EIDE环境,点击操作-新建项目-空项目图片
1 e" v% X7 o% C9 i  n/ }
7 s8 |3 a. g6 a7 b' w0 f; r
微信图片_20240615160602.png
" v  J: ^/ A4 D# B. C  O" k- {% p  e5 I
b.选择一个合适的MCU项目类型,如Cortex-M项目% M2 G4 c0 W$ a/ K8 z2 o

7 g' x( B" Q; `2 l; x2 p' j% J* o
微信图片_20240615160605.png ) Z3 G( G; Y- i% g; \
2 N' L" ], \/ m% a% O7 D
c.点击右下角继续,跳转到工作区" |9 t' |+ A; B# }4 _) c- m7 V

+ s$ r5 I% F! M+ c* n3 {% @ 微信图片_20240615160608.png
/ p* ~+ \3 i; j8 I# @0 Y/ }- D; w# B
: b, J" d3 G6 u3 _; c: ^
d.添加工程文件到工作区路径下。——标准库
1 l. L  f; R( Q' G6 ^$ i9 P
) X3 n; i; M2 D5 S
2 o4 D0 r; D8 W5 b, D! ^* e. _
微信图片_20240615160612.png
* \; F- d) m( r6 U5 P2 X1 {% L1 T/ ?5 Y5 `
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。; M4 j9 n( E2 h2 f: M/ }! T- ~: O

% n! e/ W+ m& J! b% P) y
  • 新建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文件。+ K* r. W/ H6 F7 L+ `
2 i1 w  M; N7 M  J! g
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件  k. n/ l* `( H; y

/ N. j' \! F1 Y
- I3 x5 a4 [8 h8 [* Q

& c/ S- ?+ W) W# c$ s$ |
微信图片_20240615160615.png
1 k0 K) u& {: T) U3 Y6 Y+ O

' h! u+ _& s6 k2 u+ T6 rstm32_flash.ld0 b4 ^* L# c$ j6 z: Q
  1. /*' \! n: _8 v) s5 Q2 s3 S3 d
  2. *****************************************************************************  G% N& s7 Y( v. T- ?7 ?: @
  3. **
    ( E5 Q& S& R9 S& e9 p- R2 O+ q
  4. **  File        : stm32_flash.ld* u+ P6 k; K6 s# s6 Z' D$ C
  5. **
    . H+ c) Y2 V* p/ F6 l3 L' W3 X% `
  6. **  Abstract    : Linker script for STM32F107VC Device with
      b. M( Q* s" D4 ?# h; F6 p
  7. **                256KByte FLASH, 64KByte RAM7 h, H% S4 `1 z! H& N4 Z
  8. **: ^) p+ N$ A$ P" K
  9. **                Set heap size, stack size and stack location according
    : I" w$ s0 A5 u5 r4 @' V* I
  10. **                to application requirements.
    # y2 V1 c  h9 E, M
  11. **! j% }1 }0 `0 c4 |) V7 R3 b& q5 e1 v
  12. **                Set memory bank area and size if external memory is used.
    5 \- o8 o; }$ ?6 K& j
  13. **0 {1 s: [; s' Z$ v
  14. **  Target      : STMicroelectronics STM32
    ) j7 f/ E/ v4 a2 T) e
  15. **
    0 {! z9 `: B3 s! ?& S
  16. **  Environment : Atollic TrueSTUDIO(R)6 T2 `4 K7 h& g/ h' g8 s" [: z
  17. **9 q, i5 j) y: _  y
  18. **  Distribution: The file is distributed �as is,� without any warranty
    : F  s$ m, A6 p% M* V: b! y- v9 H
  19. **                of any kind.
    4 z5 O4 k' c  W3 m5 \
  20. **
    - L) B6 ~) [. w3 f, `6 _5 ]+ M" `
  21. **  (c)Copyright Atollic AB.2 D( l+ L7 D5 _+ v3 U. o! ~  U
  22. **  You may use this file as-is or modify it according to the needs of your
    ' V/ z+ \. X" e* E3 m
  23. **  project. Distribution of this file (unmodified or modified) is not
    3 X4 C, }2 k' q; ]4 P7 T5 [. Q' G
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the! [6 E- {# ]. R
  25. **  rights to distribute the assembled, compiled & linked contents of this% u5 V8 p% q% }7 O8 m- ?7 c
  26. **  file as part of an application binary file, provided that it is built
    & C% r4 u' \* D: b4 n+ W
  27. **  using the Atollic TrueSTUDIO(R) toolchain.
    1 B8 A9 r7 N+ b  S' I
  28. **1 |0 A1 e1 T* b8 v: T) ~5 _
  29. *****************************************************************************& h5 W% i$ U. @7 m7 {1 o3 _5 D
  30. */
      h+ ~/ I+ S6 {) e. M5 Q& A1 ^
  31. % y5 i6 w( k$ ]. D- W2 u

  32. * n7 D9 e5 p8 ^! [, f
  33. /* Entry Point */
    " D) L- @% _' \9 [. |; S$ T0 {
  34. ENTRY(Reset_Handler)2 J$ }/ D- y8 V* y/ A! `
  35. , C2 {% {  g! W% D; m

  36. $ g( X; h+ p" D7 w" _
  37. /* Highest address of the user mode stack */' V$ Y$ E5 R# @' n& m; |( ^& N4 X
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    , P, }1 j! P$ Q' N. v  @7 T* }

  39. % C/ R3 T. p5 Z

  40.   O; W. r- X9 m6 \& s
  41. /* Generate a link error if heap and stack don't fit into RAM */
    $ `* ?+ V. H/ U3 Q' Z
  42. _Min_Heap_Size = 0;      /* required amount of heap  */
    " U, M& W* S3 G3 ~( l* x1 t% K* C- Y% S
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    4 P  f% c( y4 y8 E& H$ G

  44. # _: U; X5 y, x# B- q

  45. % V- N! v- F) p% Q
  46. /* Specify the memory areas */
    4 e( U9 v( Y1 ^& R
  47. MEMORY
    9 l2 s* i( B4 x
  48. {" A) w% j7 }3 ]( F
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    8 o9 f8 U" r; |; g" k
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    % c) R! {4 \5 z7 _! u
  51. }
    ; W7 d# u3 e6 h
  52. 0 w9 X  v$ Y0 o7 X1 R* T- ~9 ~4 X
  53.   x7 E+ r% H: [0 J
  54. /* Define output sections */2 W* r% g5 G4 H  m' {9 i. v
  55. SECTIONS- n; ~8 B3 x% e% \
  56. {( p0 e* @" M3 B; p6 R7 w
  57.   /* The startup code goes first into FLASH */. Q: x/ C( K+ z/ R7 l, W
  58.   .isr_vector :7 W( H. R) y; t$ y  H. a$ r# z
  59.   {
    ' b/ ?  t' [2 n: G8 M7 |! B6 K
  60.     . = ALIGN(4);9 G* d9 Z" M1 \* {/ \5 Y1 i
  61.     KEEP(*(.isr_vector)) /* Startup code */( G2 Y% {, J9 g$ D
  62.     . = ALIGN(4);
      S7 z- T, \( _5 \- z, ^* a
  63.   } >FLASH
      Y) Z- M! b8 O) G: R: n; ^
  64.   U3 t$ }9 G& p5 }* b/ O  G4 n

  65. , X' Q2 X: A: ~! d9 h
  66.   /* The program code and other data goes into FLASH */; i: X+ m" q' |8 h2 [: U0 r- J# `5 w
  67.   .text :, D* g. X* Y9 h5 E( y  l5 \8 R# B
  68.   {: K1 h" h* H* p" M# P
  69.     . = ALIGN(4);$ h  T) Z7 [* ?% B6 k
  70.     *(.text)           /* .text sections (code) */: A5 f$ H* g6 Z" o5 P2 R
  71.     *(.text*)          /* .text* sections (code) */% h/ A8 |5 E0 a( i; ~' v- }* z
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */8 U& T5 [4 b$ w
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */# L, a  R0 `  q5 \% h# N0 v
  74.     *(.glue_7)         /* glue arm to thumb code */2 e9 a, B6 Y3 Q
  75.     *(.glue_7t)        /* glue thumb to arm code */$ {( J( |2 s' |! T5 u, k
  76. 4 ]- A- |$ Y# B- B% v4 ]5 i  y
  77. 8 e0 j" w9 _& T* _* m4 C) h
  78.     KEEP (*(.init))6 f# A! d9 m2 Z# Q0 x; o
  79.     KEEP (*(.fini))$ u. [) b) j4 n

  80. ( z' E; M$ \- g0 u
  81. " s+ T0 n4 Y6 N7 o! C
  82.     . = ALIGN(4);
    3 ^+ c- G, k: u; S9 h+ r' ]2 `
  83.     _etext = .;        /* define a global symbols at end of code */
    ; y0 {; }! q1 [9 _  y
  84.   } >FLASH
    - q1 h7 A7 p* l4 o% G" `
  85. ( A3 n$ J, S6 ]( o

  86. 6 D* ~4 j* T. U+ s" |3 O  W1 u
  87. * O0 Q$ h# C9 ~" [
  88. $ R- m* G1 ~; l0 Y
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
      u# p; _  G, {- p1 w- R
  90.     .ARM : {2 G0 S7 f7 D6 V! H
  91.     __exidx_start = .;
    9 _6 f; l6 P$ E( @
  92.       *(.ARM.exidx*); J9 I& G( K- T
  93.       __exidx_end = .;3 W- r  n& g! y6 B
  94.     } >FLASH
    8 g& i( t6 H7 ?7 z1 f9 k  o

  95. 0 j& L6 t6 n9 o1 M( ^1 t2 f
  96. 0 d. {" p7 p0 [" A
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH' i3 x6 p. t" s$ j% @. L
  98. % L% Y& g/ W5 n8 f" o' q
  99. ( f, R, e; i, s8 Y1 r5 h. D! f) l4 b
  100.   .preinit_array     :* O5 ^; N" s  d
  101.   {, t0 X0 ~# k3 ^7 B: W) B
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    $ z/ W& U6 f3 j2 \" E( `) r
  103.     KEEP (*(.preinit_array*))
    * Y& n3 V& L8 n; i
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);9 l5 ?6 U, s2 a: l% D8 H2 L& U& \
  105.   } >FLASH. Z- o( U4 c- C3 g
  106.   .init_array :, [! a2 ]$ u5 x7 q: ~
  107.   {
      O8 c6 [5 T" o: k
  108.     PROVIDE_HIDDEN (__init_array_start = .);+ f2 c; D  O( ]( S$ ]
  109.     KEEP (*(SORT(.init_array.*)))
    ) U6 k! i+ ^( O# _. M
  110.     KEEP (*(.init_array*))$ e8 O$ o/ p& v2 n
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    2 V( `) V$ t+ \
  112.   } >FLASH) y! L1 M+ [$ a" Z
  113.   .fini_array :2 D% Q5 `$ H, l7 B( z
  114.   {0 \" o! }) V5 y+ t
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    3 \4 B6 E" J- P4 O* L
  116.     KEEP (*(.fini_array*))7 v2 ?5 L1 {* ?$ G. S5 f( a/ @- l
  117.     KEEP (*(SORT(.fini_array.*)))
    7 P- C, {  v( r( d
  118.     PROVIDE_HIDDEN (__fini_array_end = .);
    9 E1 R5 H$ U0 Q6 a
  119.   } >FLASH
    1 S  ^# @5 P4 A2 B# t2 B$ ]
  120. % Z2 @7 h/ g) Z8 A7 s/ N

  121. ) L; V; U: e* D% C" l
  122.   /* used by the startup to initialize data */
    ' G# x: `1 z" G3 n- ]# c
  123.   _sidata = .;
    1 i3 Y2 ^# {& y% B
  124. 5 [* V* o  K* k; [1 P

  125. : w. k: n0 B8 ^& X* r9 K1 r
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */) W' C5 P$ I; E; A( W. Q
  127.   .data : AT ( _sidata ), Y6 R7 k5 a3 X" B5 a6 F1 z
  128.   {
    . p, O( q# ?9 v' h0 }- ]3 n
  129.     . = ALIGN(4);
    ( `$ ^6 Q* k* ^2 _- q- \
  130.     _sdata = .;        /* create a global symbol at data start */
    2 t& G; D3 w; z, m" Y3 v! l0 A, l
  131.     *(.data)           /* .data sections */0 k0 w) X, Z( D1 r
  132.     *(.data*)          /* .data* sections */7 R* x) j$ M" g1 u  p4 ]) X; o
  133. - U' }  v; u+ I3 z( E6 I

  134. ; W% }% N7 b; y  S% B5 _! c& B
  135.     . = ALIGN(4);
    5 d) u% c7 ^3 H7 O
  136.     _edata = .;        /* define a global symbol at data end */
    * u3 ]6 k$ s0 m$ y  W
  137.   } >RAM. S. g3 P8 f7 S- H
  138. + J3 w: I/ k: d8 Y. D3 m

  139. , p- {# }9 N& n0 I! h/ p2 f' M  c) {
  140.   /* Uninitialized data section */
    2 N& A4 b7 x4 \. h* E
  141.   . = ALIGN(4);+ g) W4 A( b7 i3 |% k3 b6 g3 ]
  142.   .bss :. N' w9 t2 f6 S! L7 }  e6 ?
  143.   {
    4 X( @  ^2 U$ T3 s/ M0 F4 J
  144.     /* This is used by the startup in order to initialize the .bss secion */
    ! S! a. X) A8 @# O  s/ D8 ~
  145.     _sbss = .;         /* define a global symbol at bss start */% P3 Y4 P9 N4 F# T" L1 m$ R, e6 h
  146.     __bss_start__ = _sbss;" t* v- j7 X* y+ P" ]
  147.     *(.bss)
    1 T! c. _1 l: ]) `0 j- C, `- |( x
  148.     *(.bss*)+ P% d$ r- W4 S) S
  149.     *(COMMON)
    6 x1 ^) s' w2 Z3 b
  150. # A6 J1 u: {& ^8 G  F- o: ^

  151. * i, T1 V8 n+ k, U1 N! M4 m* \; k
  152.     . = ALIGN(4);
    4 g# b% U0 Y6 \! Q4 T1 Z/ k  C; x
  153.     _ebss = .;         /* define a global symbol at bss end */
    . ^% ^: H- \* i6 O' b% d7 Y
  154.     __bss_end__ = _ebss;& D4 }% W$ i# W7 H
  155.   } >RAM0 c0 C; N+ \$ E/ A5 T' d

  156. # ~2 d2 p; R) i$ g4 J; q6 ]$ ]

  157. # K6 q1 e" D  O+ ?
  158.   PROVIDE ( end = _ebss );' ^  S- i/ t5 h/ I+ }& q7 ]
  159.   PROVIDE ( _end = _ebss );
    + U6 k9 r* K* D$ R$ U& b
  160. + v( N5 Q3 W* k4 z& Q/ M8 v8 ~

  161. # I" O, i. z' R5 n* X) E
  162.   /* User_heap_stack section, used to check that there is enough RAM left */! e" w8 l$ P3 K8 e0 z
  163.   ._user_heap_stack :
    % Y% J. A; e( f. E* V' M
  164.   {
    ! A# f; {6 d+ R* s
  165.     . = ALIGN(4);
    , u( Q! G$ b1 s% V6 z. V0 H4 y9 o- j
  166.     . = . + _Min_Heap_Size;, l% p( q4 ?! X( E7 q* _
  167.     . = . + _Min_Stack_Size;9 Y; v6 ^; J( G/ \, c. w0 |' ~
  168.     . = ALIGN(4);
    ) K! \! z+ g/ t' l2 V0 n
  169.   } >RAM
      \) U8 a; Y; V5 x1 O
  170. 6 K; ^1 b+ F7 P7 N4 f

  171. & z3 I( H9 y0 H* T( k7 x5 e
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    4 J4 y5 u9 F; P% `2 x0 h
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */1 c4 {  ^- V# @. @1 H+ d; k; K
  174.   .memory_b1_text :
    * {; k: p" B- c# _. s' |
  175.   {$ [7 R7 Q: j0 ^. W& N  U
  176.     *(.mb1text)        /* .mb1text sections (code) */: p9 ], O% F4 y/ x5 Z
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */* D3 P. R( ?: V  Q
  178.     *(.mb1rodata)      /* read-only data (constants) */# v) l; c) {, ^1 \0 d) X# [' M
  179.     *(.mb1rodata*)
    , i1 B( f$ W# _1 @' k* p. I( s  a
  180.   } >MEMORY_B1. L7 D/ H& g+ m8 d& y
  181. 8 C% o% `4 W5 Q. U8 T

  182. 1 N, L4 V* r7 l
  183.   /* Remove information from the standard libraries */& }5 a' |2 `9 |' c
  184.   /DISCARD/ :
    3 @* W; S* F- S! W3 u
  185.   {0 _2 |+ v( m# z* I% _, k
  186.     libc.a ( * )
    : ?+ A6 ~/ o' Z& I8 o  S
  187.     libm.a ( * )
    , p4 p* N2 V8 {& i( ]4 U  M% ^
  188.     libgcc.a ( * )
    + ^5 y( @/ U$ S4 Q/ A) D# C$ ^" ]. R
  189.   }
    + k6 V8 _6 K  r! ?' l
  190. }
复制代码
: L, r$ S5 w" h: _* K: q1 v$ g
  • 最终目录文件如下0 V/ m7 _  D" f8 W

* I# ~( r  D, u# j; r: o6 v
微信图片_20240615160620.png 1 d) w+ ]) o: p3 n6 _

2 q. a1 S# _" Q' r1 Q, y2.在EIDE中使用标准库时的设置(无Makefile)2 ?' U: [% C- C0 X) `  q9 w
a.切换到EIDE环境下4 \5 X. d7 `& J5 H& Z
# e2 b% x3 W3 h$ g! I; R
微信图片_20240615160623.png
, E, ]9 B! \, _% h/ v. m* r. D
/ Y% C2 r4 T; t+ ] 微信图片_20240615160627.png
, T# {  Z! ?7 D# V
7 b$ R7 p& k/ Z
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
* ~3 J* P  J( Y3 \+ u4 a" ]' L0 z% K& ]
微信图片_20240615160629.png 3 J% s. Y; w. g! V# k9 J

5 ^4 K+ {! P/ k$ F. l$ X; _4 L 微信图片_20240615160632.png
: B+ z# z5 }3 b5 Z( M) `: s* i  B  b7 v0 {/ [0 a8 g9 ]
微信图片_20240615160635.png
. t# A5 J3 h* T. Y/ k  i. B0 t4 B
文件目录如下:% m+ [$ N, h$ V& t( p$ U* Y
) v$ B9 l3 f9 K/ M5 Z( Q* |, `0 a
微信图片_20240615160638.png $ D# s6 N' c' h: }" a/ K
, j& g) f3 r4 Q, D+ K0 w# X6 ~7 h+ d
c.点击+号安装CMSIS芯片支持包/ H/ a$ s% ]+ x7 q* L, A, p

* x2 c5 T8 @5 _( R  e
微信图片_20240615160641.png
% t/ ^9 |* E# t9 C2 k3 D2 r; Y2 ~" g) I: W8 b; L! y
微信图片_20240615160652.png
/ P' d) e) w! G, x( @  N# D6 i
5 K+ c- `) y. S- M  L% Y 微信图片_20240615160656.png
  c5 b. P! N; Z7 W$ K8 X

, f6 k2 K+ W$ t1 q# xd.修改构建配置为gcc, u. h% }( l9 e; p- N
8 k: m% G2 B3 V7 L- X
微信图片_20240615160659.png ; j7 F. x& N* T% F) I4 @! ]
! I3 c3 k6 P, r0 k  h* R: f3 @
e.烧录配置为STLink/OpenOCD
4 }5 n  s! A2 A, s) \* g1 j- k
7 W/ W2 e; H% K5 @9 B
微信图片_20240615160704.png
' \/ S3 @3 N% K9 k2 \+ z9 I3 W' H. _6 f1 R+ K3 z: S) @
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
& W3 V2 h9 a) q5 f
. q& U1 j/ R0 S
微信图片_20240615160707.png
' K* b0 c1 o/ z9 S2 C
' R5 S3 S5 r" v; O) S% e! |g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义* Q0 v+ y+ }9 @" v+ S( Y' ]  w2 m

8 |. r8 {9 a0 I% y. Q  ~( g  X
微信图片_20240615160710.png 1 Q! c0 n6 I) }4 E! b$ i  o
3 l# U( k/ _4 P! s1 v, T
h.此时编译可能会有下述报错: ]- t- `. K& D' ~
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    $ b  y5 t/ h& c/ C6 z
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

6 j8 }- r: ~) Q# m! y8 Q, c6 T9 G8 ^% r
/ J6 p: p" F' R" j# d! l7 x
打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)
    . l# G6 O; I4 p
  2. {
    " G1 t3 R) {5 i$ ^
  3.    uint32_t result=0;
    ) }+ y8 I+ t; u

  4. - X4 h4 L5 P/ W/ T
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    ' w' C* c1 T8 Q) l, r3 o7 c+ R
  6.    return(result);
    9 _4 w# F  O( w8 v8 w9 Q7 r
  7. }
    4 c+ ]7 i- Y& F! G: R" n) z8 a

  8. 6 [- L: X1 ^& `( ^$ T
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)# f4 d* P; a0 M# L2 J& f
  10. {
    % f( d6 k/ }8 V8 {
  11.    uint32_t result=0;  _- n! d( @2 t/ n3 U4 r! n' W
  12. ) h* X1 n8 K7 Q$ X) J8 m) g
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );' t3 L  ~" o: _2 c
  14.    return(result);
    1 Q: n" t1 ]0 t3 J  }1 X/ \; Q2 y2 W
  15. }
复制代码

' Z8 o8 _, p4 A
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    . R/ P- g. q6 W1 x

: ^6 C. d: i' k/ {7 k; C
微信图片_20240615160713.png
! v) x9 ~. Q* T8 G. V* p, k' c
  1. {
    4 H; v& F. w' f8 e1 x2 Q! B5 n& A
  2.     "configurations": [" l/ D8 G9 [1 W) ]
  3.         {! `( ]& L9 T) D1 Z
  4.             "name": "Win32",
    # [, C% h/ [% B/ M- a( k7 t
  5.             "includePath": [. E! I# y0 R# f: ~/ w2 q
  6.                 "${workspaceFolder}/**",
    : M  B3 `* F( o3 }" B, T0 B# }
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    7 F7 v; X0 o2 {- x' Z/ r! t2 b
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",7 {3 ^0 i. P7 {" I( l5 z# m( }
  9.                 "${workspaceFolder}/CORE"
    5 i2 [& t! O. I& w3 L
  10.             ],3 \% @% m0 C0 W  h4 }7 `# n: ^  j6 Q% N
  11.             "defines": [$ @% W: v# f! ^; L* \
  12.                 "_DEBUG",
    / ]  n. b/ Y. W* S0 c
  13.                 "UNICODE",
    % J. p4 r7 B( @6 b( a
  14.                 "_UNICODE",8 f( c- Q. A2 k. _" V
  15.                 "STM32F10X_MD",( A. }2 [; v8 ~; ?4 V, a5 G
  16.                 "USE_STDPERIPH_DRIVER",
    7 P( O" m6 Z- E" e
  17.                 "__CC_ARM"! I6 c, f- b* j* H8 m, k& G
  18.             ],
    , U! p& v9 w2 q( S7 e
  19.             "cStandard": "c99"" T, R: `2 `: x2 q# ^  O; l$ s: P
  20.         }/ N' g1 K' Z  h7 y  e
  21.     ],1 g. d! j+ [) ]  T
  22.     "version": 4
    + V( Q; b" ]# E: ?2 m+ B  \- R
  23.   ]" ]6 v: S" d  i7 p+ P
复制代码

( t- Y7 R) U; s8 n3 |3.编译工程# D9 [/ W* a" k  C/ `) c9 p8 n* n

0 {8 k, X0 Q5 b  |6 o. n+ T0 z& P+ a6 ^4.一些问题的处理:( B$ Q$ h; u  `2 l; X' Z8 G
a.编译成功,但下载后没有任何反应。
+ Q6 O: [" r" @注意检查stm32_flash.ld文件内容
4 {3 C2 p# R& k; a8 ^% V4 v3 Y2 o6 O
  1. /* Highest address of the user mode stack */  ]; ]' I$ _4 i1 U- F1 u
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码
- O; p2 r$ s1 ?: m6 \
注意对应芯片型号" T- K/ B/ |0 l% d' u: P* {2 x
  1. /* Specify the memory areas */# }/ v4 n; }7 r( W+ O5 {2 Q, j! s
  2. MEMORY
    0 j) q2 }; j2 }4 e+ O' D
  3. {
    % c, B4 F3 S; }9 `
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    : a& Q: q  t* k# Q4 o) l
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K7 P. O$ S; Z* y9 A: }3 w
  6. }
复制代码

; X: l; x/ i1 Nb.vscode提交(commit)代码时卡住
1 g, Z( o. S% m7 ^/ F# s4 `
9 _& M% Y8 T1 v  x
微信图片_20240615160715.png : ^  Q& x& I2 O& _6 V* t7 Q
: B; T" p0 `, P, t# r: ]: ?
微信图片_20240615160718.png - x0 H/ R( {) A7 k( ^. b; i
1 u  ?1 S6 a1 r+ W5 ?. U( G
微信图片_20240615160722.png
2 k9 t& P2 T% v' L
0 Q: K0 l) M& y6 a) D设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。/ c8 J2 z" T0 w& |  R* d. `
: V, S. x5 J, b9 U
c.结束
0 T" p3 B- ~  [! b& p

0 v, I; s) K9 Z' v% M: M5.调试工程& h8 [9 H' }7 K) `, L3 {
a.添加launch.json: ?# ^+ b; }7 G, E& c
进入一个C文件,点击右上角按钮生成launch.json3 o& J# K' X' {  p4 a; \3 V

, K% L1 o' q5 p+ }$ a
微信图片_20240615160726.png 9 _4 [" ^7 t. @9 [$ \

) ?2 v# O! I8 g2 y* z6 s8 f& hb.修改launch.json为下述内容
, d: u# b6 l1 y
  1. {
    8 j8 w9 `" ]' E. a% R" s+ A# z
  2.     // 使用 IntelliSense 了解相关属性。
    : \' ]# j; E" U% w% \1 Y6 F. Y
  3.     // 悬停以查看现有属性的描述。/ }5 ^' R! Y  _0 B
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    1 o" f9 ^! F7 Q% \( r
  5.     "version": "0.2.0",
    ' M9 \' J2 {9 b% q
  6.     "configurations": [) P; A' L9 Q3 e
  7.         {
    , h; x7 u0 D; M! _
  8.             "name": "Cortex Debug",# o; ^/ f- L# `; F7 E  I! v$ c
  9.             "cwd": "${workspaceRoot}",  // 输出路径
    : L/ Z  n% Y* p/ \. i
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序3 v! u6 ~# D/ B% k
  11.             "request": "launch",$ I) s2 n+ x/ U) ]* {; L. P
  12.             "type": "cortex-debug",
    3 n- v+ D8 e+ @8 N1 H
  13.             "servertype": "openocd",    // 调试器选择
    . ^: d1 {2 G5 n0 ]6 q- K4 A
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php. W! A& d0 c; A: y, X6 w+ M
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    2 A( B+ b/ `* S
  16.             "interface": "swd",- N+ Q( S7 Z) t# i) g  G1 q: @, {
  17.             "configFiles": [9 s1 f9 K4 A9 d, D5 B
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置! E+ \9 i. I+ l
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",8 @1 [, O. e' h1 S9 f) l
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"/ u" m! S8 b! Y7 }5 Z5 a6 }
  21.             ],
    ; ?9 Z7 c% I8 N' g' K
  22.             "runToEntryPoint": "false",
    , N9 J, [: K7 Q# \0 p3 h% ^
  23.             //"runToMain": false,
    3 `7 I, a3 O! {  M
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    , w! G2 m. p, g& K# K
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径" f1 H% _2 j7 P  Y8 P
  26.         }
    ) S5 @2 P4 C6 f) i
  27. $ t# O1 K2 G* c( Q
  28. }
复制代码

: Z, _% s2 @3 u  u上述最重要的是引入openocd的路径。
/ x- A% B+ j- _: Y  D
% |3 @/ T1 P# h/ g+ @) [
* {; q0 ~, k" s! j3 Q
c.点击播放按钮进行调试0 c9 E7 F/ q7 L$ d) b5 g

& I' s  n3 B; Y
微信图片_20240615160729.png & n: F& L0 z2 n$ G6 R3 y' c
3 u5 k* P3 g9 s  @  A' G, n
6.结束
+ g; n7 ~6 }+ j# y, q& t% Z
4 s# ]7 [: y# b& b- H
  {* a4 F1 V5 D9 s4 A( `: [; |9 ^1 R! I; T/ S6 z1 g
转载自: kevin
# A0 C$ ~4 ]* U- m5 ~. N& Y如有侵权请联系删除
8 e' E2 W7 @) e0 L" ~2 q3 t$ i
, X# }6 m0 D! [
& ~1 {$ g# [9 `4 `7 O/ h
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

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