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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”8 U6 M6 N! g7 U* ~3 M. g4 y0 o2 I

7 j6 l2 P5 E& U5 W/ e5 e; i% C
微信图片_20240615160241.png
( B, z3 b6 T" t- M2 y9 C6 \7 e, N  `. n( Q
1.VSCode安装与配置8 j( V+ m9 i3 n$ ~$ u
a.卸载7 h5 b- c+ K. ?
b.安装/ `' b. T, F3 W1 \; @5 i
c.git安装与配置2 x: I" x) J4 `; o. O5 g
d.安装插件, T0 ~/ g& z& ?6 j; n. v& q$ b: c

0 Z' r3 Z) @" M+ @  C5 E+ R7 k

% b% H2 P' E/ v4 d$ t# V2.Embedded IDE配置
+ {; m) p6 q9 ha.安装EIDE插件: D& \' C  W; L9 a* ~2 \
b.安装实用工具到EIDE8 a4 s+ R- u2 r/ Z. k. t# ]" d# S
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools( g6 L- x3 H1 I( i
3.Embedded IDE项目建立-stm32标准库. M: p2 K, P2 |: f2 W
a.工程项目建立
  q6 ]" i+ _2 s% Q' ~b.在EIDE中使用标准库时的设置(无Makefile)
8 _5 ], d8 F  e! B1 lc.编译工程2 l! {9 s; N3 p# r: R
; b9 `+ u! A: l% _# {8 w6 F
4.一些问题的处理:! ?, t) ]. @" g% J" A
5.调试工程1 s7 ?. w/ g1 M& j& }. x$ I4 i, L
; w' w8 W! ?7 q" F* h
01VSCode安装与配置
% R& v8 J% ?1 h1.完全卸载之前安装过的VSCode
. m" P9 A  ]" ra.卸载软件. W9 V- E' B+ Q9 t
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
+ p" w9 m) o4 z1 u7 Z) n# Dc.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。
" y) A6 c% w) \$ E- T
& S5 w% j0 a4 X0 R
2.下载安装vscode+ w; x9 e+ T0 N) u
0 d1 U3 ^9 N9 E! e" @* l
3.git安装与配置* w0 m* M! W8 \; M/ |
安装git$ f. `3 T0 ~' z7 s' V$ x
4 ?! K4 g9 z5 |% Y$ k# @& {
微信图片_20240615160248.png
; v8 \, P4 `" P
" m, M$ N; }, P( k! n! z安装完成后,在开始菜单中找到并打开Git Bash
: A% Y! \% M3 I# n' S
8 ^3 c: G  C" m6 H8 k5 K; G
微信图片_20240615160250.png 6 s& J6 P2 j! T+ D- L) Z

4 `2 m6 U& {' o) D! k1 \; {, k$ c在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git$ F1 b8 {! g4 H3 P

, p+ I. x$ J+ Z# W/ f
微信图片_20240615160253.png
' Y5 G& T: K% a
/ i+ c) e: c, B: H( e0 J4 W4 P
在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' 8 T" i, w; K" E! n8 f2 ?6 s
  2. git config --global user.email 'ct15762287606@outlook.com'
    6 p  r/ T: A- T% v7 j
  3. //检查当前仓库状态7 w% h; F. [2 c. ]* X- R
  4. git status
    , [" ]% L( i' v0 `
  5. //确认git配置
    , w1 c# h$ }3 ]( G8 ?
  6. git config user.name) }+ [$ v# D: O
  7. git config user.email
    0 ?; A) x5 T$ Q6 H
  8. //查看错误信息
    2 n" j4 w1 Z( N% Q" J2 g
  9. git commit -v! P: f0 M2 J8 m5 F, ~
  10. //清理缓存
      b0 O" U6 k) ~6 N4 R
  11. git rm -r --cached .$ v) H% t2 f: z, z6 j
  12. git add .
    4 E% K' O0 I0 E. c6 X6 p
  13. git commit -m "Your commit message"
复制代码

* k% A  d) j% Y+ i
微信图片_20240615160255.png - z+ t9 _9 F" W" n3 S  k
2 s' |7 v$ ^- s6 O, m
4.安装插件,如下图:
2 S2 ~/ x: o1 `) b2 G' M3 w% k. C/ m" E# o
微信图片_20240615160258.jpg
1 X+ K# j* g, ]' {' k7 @- [2 l, F; L$ f$ F" U
微信图片_20240615160301.png 5 g/ H# D7 m( L2 w: k/ \$ Q) K% N

& Y* k) J% A) C( V+ M6 Y8 w; a, P8 ^
微信图片_20240615160303.png
5 r8 Q* {- w% ~( A0 ~+ ~
" c5 T! U" {5 d0 p: | 微信图片_20240615160306.png 4 x9 E5 Z' m" Y; `# i- a

9 u) G3 q% }% @2 c6 i6 m# P: { 微信图片_20240615160309.png
0 Y, q/ M' j, J; n8 {% F; A4 d/ S9 Y" p/ h) r& y, m4 m! D& P
微信图片_20240615160312.png
- O$ c/ H. i- `8 [7 A8 ~3 ]
0 q: N/ u! ~$ L, F- o2 Q7 _$ t, ? 微信图片_20240615160317.png
1 g$ L$ M1 u. c* p- a! e
$ w; B  f! B  ~& A+ U3 t 微信图片_20240615160320.png
/ d4 P, j9 x1 @
. @% b( }" ~. o% Q0 X  y 微信图片_20240615160322.png
( K6 E6 e* ^/ ]7 G# `+ ?2 e
& S; V8 c: G; p5 {3 [9 c# ~4 d 微信图片_20240615160325.png
9 q+ K% E% a6 H" ~% F8 }6 F1 U
1 x5 [0 T- N6 j: n5 O, X" u 微信图片_20240615160328.png - o3 @% P4 f. M- U% Q

' B1 N( Y8 i" E2 J# S2 ^# c' k: r 微信图片_20240615160331.png
" k$ j( {# `0 T( ?' O; i
6 |. d( D( X& G" {9 Q 微信图片_20240615160334.png
- `& m/ W4 p6 J! X( F: L! s# e6 Z* q7 H* t* R- a2 v6 A+ z
微信图片_20240615160337.png , @* q  y3 m4 o0 M

5 a  [6 ]7 b) I 微信图片_20240615160341.png
) Q. _5 }4 A2 ^- u# b2 t4 S# P! Q* }$ G' U/ ~# o' O
微信图片_20240615160344.png
4 s/ w2 |  F( j% |! c& E' Z- l& y6 B: r- W
微信图片_20240615160347.png . u- }: n0 {0 D0 S- g4 @
! Y" v' I# j  ~. x" y
微信图片_20240615160349.png 1 P- e1 E2 \  m

# F4 P9 p8 y- C9 S0 l 微信图片_20240615160404.png " h8 M" g( T0 U, U1 r3 [1 X/ B

+ Q* C  F$ P' E' T' o  f8 R# _02Embedded IDE配置1 M  f  Q& }" l+ V# s$ V3 B# b1 S$ z
1.安装EIDE插件到VS Code3 `; u5 D# A" \4 w
2.安装实用工具到EIDE环境
3 i9 u0 q5 T5 ^  L+ ta.安装arm-none-embed-gcc工具链
, s% D" k, ~# b5 |0 {9 d4 T+ C% D
7 P! _, ~$ r4 V2 F) K% J
微信图片_20240615160533.png * i9 y; X! O' f: t

$ o, w3 o$ S8 d9 g, Gb.添加其bin文件夹到环境变量
' ^1 W+ V/ `) P# f/ \. m
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址- v% e9 t% D# z5 n% I- I3 a, \8 C+ T
9 a3 Y0 m. ]$ r! S; k! S
微信图片_20240615160536.png $ }, s2 u1 t: U6 M! k9 r% q/ D
; S& R  w3 h* E- Y5 O3 x
微信图片_20240615160540.png
8 s  X: M, K( e  l6 q9 W5 k' |# c$ q

/ F  P. e5 v3 [( D/ J在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
0 U- b* i. V% \5 ?' E) n
6 @$ t( t8 J- D% N
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

' O% u3 Z: M! z0 R% k0 bc.安装OpenOCD
8 w+ v- U# [7 x$ b. c
# I3 R% Q, K% B& H/ w  q# x: P

' a; t# W/ `$ T
$ L2 A( I( n; P$ J' C; _d.在vscode中安装Makefile Tools
7 ]8 V9 `: x9 F1 @! }. z; V/ w2 C! F. t7 v- d' m. g
微信图片_20240615160554.png ( l( V/ e6 y8 z* C0 G
& h/ q: Y5 j6 t# I
  • 找到该工具的安装目录6 f2 Y1 D' Q3 Q' r& o( u
- H9 w& ?4 E! ]% z, l  b0 z/ ?# p# r6 i# H
微信图片_20240615160557.png
* V7 m& T8 ^" `" S$ {' h/ J# @) r8 A6 x
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常
    * L8 |* J- H; r6 C7 }* r
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v
    ) Y' x6 F6 @! L# H
  2. GNU Make 3.81
    # }2 z/ q' X6 A* Z+ r$ \2 a
  3. Copyright (C) 2006  Free Software Foundation, Inc.
    , G1 ?' f( p1 Y; u5 z$ T% r( c8 S
  4. This is free software; see the source for copying conditions.
    & I4 j. J/ {+ Y$ ?
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    5 L. B. _. P6 Y  V
  6. PARTICULAR PURPOSE.+ W# f( x/ Y" H3 @8 e7 X8 s

  7. 9 n! `! p7 `3 _4 v8 u9 p
  8. 7 Z- s1 R* w+ p( k* m+ A
  9. This program built for i686-pc-msys
复制代码

& {6 j( j! W* Z( V! ~. g03Embedded IDE项目建立-stm32标准库
* R2 A# m0 b, f7 X1.工程项目建立
6 N) U; w: P6 ~# ^; C! t) va.切换到EIDE环境,点击操作-新建项目-空项目图片3 D0 g* y% c% S$ P% ]7 |8 z' i
$ j0 F; p4 ~; }
微信图片_20240615160602.png ( ?0 g% j0 A+ T5 V

. p  n. @2 Y; H' J, l3 kb.选择一个合适的MCU项目类型,如Cortex-M项目
7 O( ?0 i2 W- l/ [3 j: N9 L) S* Y) L7 N& p. \% _
微信图片_20240615160605.png
/ B& ]+ A$ K# ^% x7 Y
& [5 a4 S* P6 ~- Q% [c.点击右下角继续,跳转到工作区  v# ^, P+ J  C' ?- C6 ~0 V" g
) v- r8 |) Z0 {  r) U$ ^; I$ C
微信图片_20240615160608.png 7 y: b4 a/ U  o1 @

8 |5 M' s/ a" m+ A! O8 H' ~' xd.添加工程文件到工作区路径下。——标准库
( f' F# S4 |# z" R1 D, H9 O/ J( r( E/ @. ]% n4 n5 W0 ^
4 B0 Q7 r- `- x: P0 W
微信图片_20240615160612.png ) g, q: t( F) ^/ n2 v4 M  y; L" \
. K2 }) s: a' y0 k" I8 l: i
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    ' ~2 U: v! `) ]/ g: g
0 b7 F0 d5 w1 X% t- M) w
  • 新建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文件。
    0 o9 C! K' t$ l

, E& E" ]' W- v' J8 W' \
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    2 e" R! ~9 N  h) v9 c

' ^4 p9 ~/ |: x0 G1 D7 K9 @9 U0 [6 A. Y0 X# f
3 p9 Z& }7 o# T
微信图片_20240615160615.png 2 c1 a/ J9 b9 |/ K. }
! }, B) y5 k5 n, _1 x
stm32_flash.ld8 [: {: h6 V/ x$ \2 M
  1. /*8 a3 C. c, T4 n' B8 b  a
  2. *****************************************************************************, o8 M2 w5 }+ O
  3. **" @$ w1 x5 o3 g, N( h9 V
  4. **  File        : stm32_flash.ld
    / J, t- ~% g0 d2 I
  5. **
    . ~1 F7 x+ B9 h6 I6 n6 K7 ]9 w8 \
  6. **  Abstract    : Linker script for STM32F107VC Device with
    % f+ s' V6 Z- O3 v; K
  7. **                256KByte FLASH, 64KByte RAM
    " a  X' @' {+ d' X% J
  8. **' g. z, f+ m) {% V( T
  9. **                Set heap size, stack size and stack location according+ Z. o+ T7 h- ]6 }$ @
  10. **                to application requirements.2 f$ ^; S& D- s% ^- z
  11. **% e( V! r* _- @/ Z2 `& T8 u
  12. **                Set memory bank area and size if external memory is used.
    % w& R; A# }; i/ X( H5 j1 U
  13. **! H- O: B; g% x& }7 a* W
  14. **  Target      : STMicroelectronics STM32
    $ r/ Y0 _* k! L9 j
  15. **& \* p+ p* a3 R/ W# N, a6 V
  16. **  Environment : Atollic TrueSTUDIO(R)
    8 P2 }3 D. S* a" p( V4 ^$ T+ Y! ^" C
  17. **
    3 G* J5 c7 W, C3 k  p. M
  18. **  Distribution: The file is distributed �as is,� without any warranty
    . k! Z$ ~2 ?9 m# }% E6 ?
  19. **                of any kind., @7 M5 N  e$ L/ ^
  20. **: l4 L8 e  Z( ^! X5 H+ d2 V7 \
  21. **  (c)Copyright Atollic AB., b9 T% O; `3 R
  22. **  You may use this file as-is or modify it according to the needs of your
    + R8 b+ `: k( C% r! V
  23. **  project. Distribution of this file (unmodified or modified) is not
    - g9 o4 J+ L) j3 `2 b- `1 J
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the. h$ |% J# M4 h* _
  25. **  rights to distribute the assembled, compiled & linked contents of this
    ; @' c7 O5 M# H9 M
  26. **  file as part of an application binary file, provided that it is built
    , V: y0 r4 @+ t" ?# E% [; V# S0 b
  27. **  using the Atollic TrueSTUDIO(R) toolchain.0 J9 p$ H/ D( F" a/ ]1 H
  28. **6 f: s* A$ _# f* q- s3 \
  29. *****************************************************************************9 r% Z3 o8 a) E0 V
  30. */; _: D* e5 ]5 K- p
  31. 5 J- u9 l9 l/ H' A$ i: g7 s- h

  32. % C. Z7 \# }9 z! P% I# r/ `
  33. /* Entry Point */
    . A" K8 q" {- k0 Z: s$ R, m! E( p
  34. ENTRY(Reset_Handler)2 q1 @" [* x( @% |1 E: L7 {

  35. 8 i. c* P* l3 V- Y& Q: F; M) ~$ U

  36. 7 v- Q# }# Q! I/ g* P
  37. /* Highest address of the user mode stack */
    " U: s' F: s8 X: U
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    ( R( C8 M4 Q% d( Q( P

  39. # j! I8 g% f5 k' w; A1 z
  40. * ]# R; `- J9 O3 O/ c
  41. /* Generate a link error if heap and stack don't fit into RAM */+ ]6 j; ]6 b  u8 o7 t+ b" l
  42. _Min_Heap_Size = 0;      /* required amount of heap  */
    4 T; {  \4 h5 d5 z6 ~0 X
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    ( g8 R8 {5 l7 P! ]/ r: q( |

  44. + L! _( z$ |; c! V. Q

  45. 0 i$ x7 w1 Z0 d) m* W
  46. /* Specify the memory areas */+ L: F5 s- h+ o- _- `# q/ x. c8 B
  47. MEMORY) s6 @( O' Z! S, Y+ f& ?' z' y+ b
  48. {# y9 A' ?* n: t" u3 Q6 R: F
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K5 t3 C7 f" U. T+ z9 V2 d
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K! w9 ]9 H; s# B3 \9 R
  51. }: J0 j8 z3 t: P/ x  @* p/ t$ [3 A

  52. ) R3 o# B- t) M3 N: ^# X
  53. / W  z  S) L' l2 Z
  54. /* Define output sections */
    ; L7 q3 O1 b) Q( @  G7 l( Y
  55. SECTIONS" b; C+ W" J! @1 S5 P4 ?
  56. {$ s& S. w' C. l/ ~
  57.   /* The startup code goes first into FLASH */
    & e) M+ M  D! \
  58.   .isr_vector :
    9 L! S, K$ n8 ^! X2 W
  59.   {3 f" p5 ]% K* x6 C. q( u8 y
  60.     . = ALIGN(4);" z0 u4 z& |. [' |6 R; ~$ @0 n
  61.     KEEP(*(.isr_vector)) /* Startup code */
    ( W( a9 n" o- n' }
  62.     . = ALIGN(4);
    & ~- {  p5 D  e  |  H3 @
  63.   } >FLASH* o* k: s8 t; T# ^
  64. 6 a, v6 p2 I4 a. e) m$ l
  65. " P) y+ r. f' Q5 R3 P& ?
  66.   /* The program code and other data goes into FLASH */+ s: e4 j% j. o- _/ S
  67.   .text :
    0 }/ X6 C! h/ D- q3 f" e6 }7 `
  68.   {7 l* f, G' X# i* V# E7 C9 p5 |
  69.     . = ALIGN(4);: o* h( E2 M+ ~3 y
  70.     *(.text)           /* .text sections (code) */$ l# H9 h5 T# H0 L  H9 I, f$ ^
  71.     *(.text*)          /* .text* sections (code) */
    " v. d5 O8 R; @! f
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */! l* p/ E9 m" Y$ j1 h; v+ B
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */+ J1 G5 n# A7 b6 b  \0 O7 M
  74.     *(.glue_7)         /* glue arm to thumb code *// I& Q- |0 ]6 f" N! x
  75.     *(.glue_7t)        /* glue thumb to arm code */- b/ r2 k4 M/ t7 V# Y# n
  76. 6 O& |  i7 v  r& V/ V+ Y

  77. , B7 r+ a  N! }6 p8 @- J" r
  78.     KEEP (*(.init))
    ! s" p6 l7 X9 f+ {# Q6 R0 g
  79.     KEEP (*(.fini)): l+ ?" n2 q2 U  @1 W/ S9 O
  80. 1 t+ B3 f2 j3 }: l+ i7 t( k' a9 [$ }

  81. 0 s8 f$ j0 _7 @! @8 _/ i/ I: k& c
  82.     . = ALIGN(4);
    8 o8 w% W+ U7 L' e
  83.     _etext = .;        /* define a global symbols at end of code */! I$ v% ]8 j0 \! @- D6 n9 u9 p
  84.   } >FLASH( f6 `2 @9 \! p; G: G: X
  85. $ \- s! {( z5 l" k& O

  86. - H/ j1 Q; X+ j  ~' K$ G% l7 F
  87. " J# [" a# w/ i: y% D/ c

  88. 0 H. i4 u7 ~. q6 n
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH1 F" W& |# D, o- n' Q5 \# \8 ?( P
  90.     .ARM : {9 G4 X3 M( g5 H8 w( {
  91.     __exidx_start = .;) e6 r& `7 _0 h5 f  y% J
  92.       *(.ARM.exidx*)
    & n1 J5 {& e1 _; ?$ f* S
  93.       __exidx_end = .;
    7 B9 \. h' a  e- |4 a6 K8 \
  94.     } >FLASH
    ' h: Y% \1 x0 z

  95. + R+ Q3 v1 o  I# I. P5 Z

  96. 7 c1 y9 O+ s& H: m* b& d1 J1 F! X6 N
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    ) q- G/ r  F9 ?0 A

  98. ' `6 ~  K, P# G! E! s) Q
  99.   w+ I3 B8 V7 R$ R1 V# n
  100.   .preinit_array     :
    / G) O2 b8 ?% a$ h$ x
  101.   {2 k: E! X; N5 M$ \
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    " t6 b" Z, T2 |- P6 `# Y
  103.     KEEP (*(.preinit_array*))& O% l8 M- r, U# i- n4 i% M% p
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);: L6 ]6 Q! d* U
  105.   } >FLASH  L  r: b6 f4 K/ l: {8 N% M
  106.   .init_array :* \" A3 q0 I0 m2 a
  107.   {+ N3 D" ^4 B0 s' i+ r  P
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    % O' p' o) S3 ?( o+ }
  109.     KEEP (*(SORT(.init_array.*))); g6 l1 K) b- ~4 M7 `% z" s
  110.     KEEP (*(.init_array*))
    $ x1 J& x# t: M' I
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    % W" t7 ]0 A* D, T
  112.   } >FLASH
    " y* ?, l! N. a
  113.   .fini_array :
    ( v/ Z- v  u0 q; c( C0 f
  114.   {+ a+ _) T% y0 X2 S
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    $ F+ j1 @0 D% k& U. ]
  116.     KEEP (*(.fini_array*))5 @- ?" u* i8 L/ U$ ^# s
  117.     KEEP (*(SORT(.fini_array.*)))
      d) q" a( u4 w. p# C3 b
  118.     PROVIDE_HIDDEN (__fini_array_end = .);3 F4 F7 n; b6 \' I
  119.   } >FLASH3 J* J$ O' S( h# k% p
  120. : m7 H7 p. r" V2 n( F8 i
  121. / L$ C) d7 }0 W
  122.   /* used by the startup to initialize data */
    7 Z) f* Y& b+ D8 W
  123.   _sidata = .;( F) Y+ \2 l; ]0 A. B' c+ Y

  124. 3 \- Z7 q# g9 V
  125. - ^9 F" \0 G) t( t
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */
    : }0 x3 z9 u: s3 D8 ?  C$ |  E. ]
  127.   .data : AT ( _sidata )
    3 O3 W! o+ I* t) W4 @7 O
  128.   {
    $ _0 ]% u5 @3 F3 o% f$ g% _! {8 I
  129.     . = ALIGN(4);
    . T. Q8 K9 r& k  N; ?5 E& m
  130.     _sdata = .;        /* create a global symbol at data start */$ A5 f9 E. i7 c
  131.     *(.data)           /* .data sections */3 X* b+ A6 |1 K3 a" X
  132.     *(.data*)          /* .data* sections */
    6 Q2 A% d3 j+ V. k

  133. 1 g6 i! A: A, |# D& H

  134. $ P2 _. w5 U5 Q8 f1 R
  135.     . = ALIGN(4);$ Z' F, ]( M6 V5 C- I* \/ r
  136.     _edata = .;        /* define a global symbol at data end */6 m7 z3 I4 h: F+ I  D5 y
  137.   } >RAM
    & l$ {3 w2 E' G

  138. + X  R$ @4 s! y7 {

  139. : Z+ x* ~. @# r3 d+ j3 m0 {
  140.   /* Uninitialized data section */, j; A: G9 N  r9 v8 m, C1 Y
  141.   . = ALIGN(4);- M2 Z" b0 a3 l% v% g! Z0 z
  142.   .bss :
    & `1 P+ @' F8 Z& M
  143.   {% x. D. Q1 q/ Z6 K0 n5 y
  144.     /* This is used by the startup in order to initialize the .bss secion */
    ; {$ m6 C, B( u3 [/ r; i
  145.     _sbss = .;         /* define a global symbol at bss start */
    ( t) }# V; w5 p$ D1 f: k
  146.     __bss_start__ = _sbss;
    6 d9 }, ~; r/ u8 D" A2 @1 J
  147.     *(.bss)  F9 T8 r% k2 v/ S7 z% v
  148.     *(.bss*)
    0 Q9 a* U' ~# h
  149.     *(COMMON)2 t7 J2 m* C; _8 U# F% f
  150. : c4 B  G2 v) Q

  151. , E5 Z) f; i0 L. Y9 R
  152.     . = ALIGN(4);6 J. ~( ]" W& D# |- p
  153.     _ebss = .;         /* define a global symbol at bss end */
    * u) |; ?4 \, n' q
  154.     __bss_end__ = _ebss;
    & f! o2 H1 f; T+ u; M4 h& d8 a4 ?
  155.   } >RAM: m* E! t+ ^# ~, k/ J: j. ]
  156. 5 v  U1 s6 W; p  B8 S: w' i; M
  157. , x* Y5 Z8 d5 K# L+ J) ?9 S$ i
  158.   PROVIDE ( end = _ebss );1 J, y9 W0 \; r( e: R
  159.   PROVIDE ( _end = _ebss );5 q8 M% \# _# I$ o1 O
  160.   K2 k2 ]7 ~2 z+ d4 _( f

  161. 4 B: I: \+ H9 d9 o3 E4 J. q
  162.   /* User_heap_stack section, used to check that there is enough RAM left */8 [5 k: Z7 \" O/ F$ r" g6 r
  163.   ._user_heap_stack :' R+ I: U+ @; [. h( W
  164.   {
    3 l/ H3 e8 f1 I: v2 y! U
  165.     . = ALIGN(4);
    & C/ i$ H3 W5 o9 F3 w3 B9 E9 }
  166.     . = . + _Min_Heap_Size;% X8 O& e  `0 P0 Z9 [
  167.     . = . + _Min_Stack_Size;
    5 l( k8 \( U7 }3 a! {/ {
  168.     . = ALIGN(4);
    5 G' F/ h% T0 G2 r8 o# n4 l
  169.   } >RAM! q3 [8 y6 q, b

  170. , I% p, ]$ F' A% M& g

  171. ( t. o$ Z6 G! Z& A" W% G) ^5 t' |# \
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    . R+ j! s7 j2 I7 `5 E0 x1 ?, `4 z
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */; L" b; J0 ]) Z' @1 ?! Y
  174.   .memory_b1_text :3 F- x3 I1 I$ o. R7 Z( S% [
  175.   {. @# S* k* h1 }1 f3 w6 b) T% a
  176.     *(.mb1text)        /* .mb1text sections (code) */
    " Q3 Z) p! x+ r: j" w
  177.     *(.mb1text*)       /* .mb1text* sections (code)  *// X. c% d0 @/ R. l# B
  178.     *(.mb1rodata)      /* read-only data (constants) */
    5 \! S& j, _8 v6 G  `( k$ b8 c# k5 |0 F
  179.     *(.mb1rodata*)% E$ l7 o" W% w; G: z) K
  180.   } >MEMORY_B1
    5 U" A" I# ~8 E* [2 I1 G! l, w
  181. / I8 l; U6 ?/ r8 E/ E; N; w# a6 N" Y
  182. . W- l9 O) R4 ^; M& o
  183.   /* Remove information from the standard libraries */" h3 z+ {# h  O& N) \4 }+ `
  184.   /DISCARD/ :
    6 w: ?2 H7 @( L$ w# @9 `
  185.   {
    0 i  `! x- s7 e5 L! X5 y
  186.     libc.a ( * )) Z+ {7 \! d% @6 }; z4 M& `4 {
  187.     libm.a ( * )
    + }& H0 s* t8 g! D& b. E
  188.     libgcc.a ( * )- i: H& V7 D  x+ `
  189.   }
    0 C- T+ j/ z: o
  190. }
复制代码

! _5 C4 l8 a4 ]( e
  • 最终目录文件如下- X$ p  @, w. n" e/ g& U. Q
8 @2 y, n' G+ ~/ w0 v8 I. U- o% d: N' y
微信图片_20240615160620.png 5 {8 Y- A  U4 H7 G. u, R8 z0 q
3 U4 h, [7 q5 ~- M3 Z( U& h
2.在EIDE中使用标准库时的设置(无Makefile)4 O  u+ j! G0 p! D0 [
a.切换到EIDE环境下: K' {; `3 W! U

9 Q" t% f2 {+ P( ?- n
微信图片_20240615160623.png : K5 f  P. {7 L+ {* C
* c3 v; f5 K1 J4 e7 h- }4 y
微信图片_20240615160627.png 2 H5 F7 b% J( f; P
- J( y! ]/ Z" X
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹% |6 f0 ^0 A7 F8 R" {5 r: L0 z  N

( k5 B2 I, b7 w2 M
微信图片_20240615160629.png
' c, O1 p6 o1 e: p: @# s. E8 A3 `# x+ @
微信图片_20240615160632.png
6 w0 {, K, f0 {6 ~* _# U. I: O7 p8 i
微信图片_20240615160635.png
* n9 ~7 p1 w, H' m+ _' g+ }) g- H: ?/ F* H- }
文件目录如下:  r, R& f! ?4 I9 o+ `' k6 m: H

2 T  A5 }6 I- D. V' Y, _; J8 P
微信图片_20240615160638.png
2 b; o5 V" D% E& z" z
. l+ m# r; @/ F" Kc.点击+号安装CMSIS芯片支持包" m- w* {" H4 D& y
; i' h+ p6 R1 a
微信图片_20240615160641.png   k0 T$ F3 `' A: m
0 Z/ m( _( V/ h4 _
微信图片_20240615160652.png ' \: ?9 W: v4 {/ {6 e
# F  [' E7 `, l! h! r5 }
微信图片_20240615160656.png
. Z1 _: }- r* D
. i/ W1 N1 t( {7 B* @6 I
d.修改构建配置为gcc8 O6 R) M  V& _8 I2 B' s3 O/ {

' H  B5 `& z1 s9 g3 M
微信图片_20240615160659.png
# f" f- W5 e# k4 U. M: G3 a0 I1 i- ?% i( n+ c3 n
e.烧录配置为STLink/OpenOCD
5 r) S% {# u& s( k
( |! M6 @2 G/ T7 X9 m+ d. K
微信图片_20240615160704.png
6 b7 K. C! h0 X
. Q: A( V, n/ b+ b6 N) tf.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。1 P% Z" W1 v' L2 S2 k. r) P5 o

/ \$ t* \7 V. G: e/ c$ K! W  }
微信图片_20240615160707.png
! {: m% F7 \* w. I# f" D, Z$ h$ m
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义
8 ]  }* p% w' l8 m; d% @+ `/ p3 a- a& N; W' z  m
微信图片_20240615160710.png
) [- m: w$ _' o! _3 I% q2 K+ k% V9 B8 |, E5 K0 i1 p
h.此时编译可能会有下述报错
0 p5 g2 X, Q+ W3 n# v- p) G
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'  r, c7 B4 @, @8 J0 |
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

7 s7 z, U; U1 U* \
% \' X7 |& R$ y8 z/ @( D3 N

7 U) W3 O1 {) {! U1 N打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)
    7 d$ K8 W  F9 n- q  L7 s; k7 b
  2. {
    . S. v1 u4 x0 w! a5 Z4 z
  3.    uint32_t result=0;
    6 R8 V4 M' x# I# P
  4. ) r$ B- @7 {% P: C
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    ! Z8 Z7 G6 C0 X' B/ C: h* n
  6.    return(result);
    3 }- E( m' E+ h  G! F, z) i
  7. }
    ; _, t7 H% }1 I2 z# `; g

  8. * w, E5 P, W% V5 e, e; J( e7 e
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)
    - [! x) ]( j: g4 P1 G  g
  10. {
    ( E9 s* x6 l9 i, q8 g
  11.    uint32_t result=0;
    + L- H7 w7 Y! I$ V
  12. & Q; B: `" r- C" B$ c6 x7 B
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );- h& y; ~) }) {2 [8 N1 D
  14.    return(result);; `& d5 b! r; X) |
  15. }
复制代码

6 w5 e$ A0 Z% A6 L
  • ctrl+shift+p,配置c_cpp_properties.json文件图片7 w( ?1 T6 c+ X. Z' m$ H, F. l

+ E* H0 z0 W! `& g3 `9 b
微信图片_20240615160713.png
7 z1 q/ W" B! y! X
  1. {
    " v; z" c9 g. [* V; a
  2.     "configurations": [3 V* w* e' W% v& m' o7 j* s
  3.         {6 Q. T( B7 ^7 m/ B0 _/ O! g
  4.             "name": "Win32",
    2 }3 f% W: b/ J, \
  5.             "includePath": [
    2 H7 w- X7 P3 s3 j9 u0 o3 U
  6.                 "${workspaceFolder}/**",) {  {2 [) u4 \! J6 B; {! I" P
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",; j! T+ ~8 R5 M  f; }8 |; k7 ]
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    1 C; s$ D9 v, H' ]( S' {5 X' c
  9.                 "${workspaceFolder}/CORE"8 d4 D; W# W- \5 `
  10.             ],
    * V! x/ F3 {7 L
  11.             "defines": [) X) i" B& }  L: ~
  12.                 "_DEBUG",, u: b4 m& v' P% F& {
  13.                 "UNICODE",
    : D5 y; w4 K* [  B
  14.                 "_UNICODE",; _* k: W8 k! \+ n, c8 j# |
  15.                 "STM32F10X_MD",3 S5 O/ G8 y8 e+ I; R) c; I) X
  16.                 "USE_STDPERIPH_DRIVER",! W4 ^2 g8 W) Q$ i6 X5 c
  17.                 "__CC_ARM"7 U+ m/ g6 e+ ~' L
  18.             ],
    5 }! ^3 n* i# G/ z  ?
  19.             "cStandard": "c99"
    ' T4 L$ |# |7 l
  20.         }3 O4 q3 f5 k7 p( ~% D
  21.     ],7 P' R' B  M7 w, ?
  22.     "version": 4
    8 S/ j* i! V, w+ [+ @& y% U
  23. 3 P3 y. l" ?+ @' D5 Y
复制代码
9 M0 e: @* u7 i0 z/ H
3.编译工程- Q+ s. d, }: P+ K8 y7 N  i8 `; R9 ]: m% q
, f6 W8 T$ L* Y, ^# C' a3 X% e; n
4.一些问题的处理:
6 h3 J* ~. n4 J* T/ T# B& ha.编译成功,但下载后没有任何反应。9 R* `+ @. ~- C3 _- x+ g: a
注意检查stm32_flash.ld文件内容
: k8 p- V$ H- R2 K9 j3 W% i
  1. /* Highest address of the user mode stack */
    2 w. J. Q( ?$ I' L9 y% w1 X& V
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

: m4 B. ~8 C4 c. z注意对应芯片型号8 i3 f3 {' V3 r  S& A
  1. /* Specify the memory areas *// x# L7 n- o& {4 l7 x: m$ N0 G
  2. MEMORY% }" ?' v& B. Z1 L. n3 O( v. _$ e
  3. {! d3 r" t+ f; ]8 |
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    . F8 b" c: F0 `8 ?
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K' H. m6 c- }- u! f7 s
  6. }
复制代码
$ Y7 ?, f& |  S# }. l
b.vscode提交(commit)代码时卡住
0 S0 }& y* o9 L" n9 k2 R8 b9 ^
微信图片_20240615160715.png
0 q% `. E, e9 n: v0 d4 P
6 _: c6 y2 j: J/ X3 O) \ 微信图片_20240615160718.png
# E; f0 f" }0 D: `+ T& @0 a; y+ q/ x4 V
微信图片_20240615160722.png 8 T  l9 L7 ^! s0 W! d, {
- R$ s7 i# ^' j0 W( s, L/ S
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。4 [8 O/ x3 o, ^& c1 d7 u7 {2 e

  j  f& K- f) d6 T' Kc.结束
. b0 h" a' m: U% d& L! e
5 L- k; C8 J, o
5.调试工程6 e' _' ]4 c& J  h
a.添加launch.json* Y; v/ _* C+ y5 @; z
进入一个C文件,点击右上角按钮生成launch.json( e- P2 `7 g- a8 X3 K2 \3 s
% ?& _' s9 ?) H+ B+ v5 N+ E: F9 v( s- Y
微信图片_20240615160726.png
# O; C' N9 ^- Q
( A5 E& J/ |/ N7 j1 {! W
b.修改launch.json为下述内容, w$ `* P- o# G' f5 y6 J' @. ?! |  r
  1. {
    8 J- b8 G7 t/ Z! {
  2.     // 使用 IntelliSense 了解相关属性。
    7 g+ D9 Q; a1 e* t! @$ s1 f
  3.     // 悬停以查看现有属性的描述。
    2 |) G" ?2 m8 ~: a( R9 |' U
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    8 Q1 e, n, u7 @. Y7 A; a
  5.     "version": "0.2.0",
    , r! K! R) C8 q% x9 n
  6.     "configurations": [8 K( z( l3 d6 D5 d7 P. `
  7.         {
    4 e! l- I: L$ g0 N6 M
  8.             "name": "Cortex Debug",
    " ~& ?$ Z- D0 j8 v
  9.             "cwd": "${workspaceRoot}",  // 输出路径, ?7 L) Z. N3 ^6 d  `
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序
    ' p0 L7 L) A% a! O# N5 Z3 q* h
  11.             "request": "launch",7 `8 b- W" v/ {6 m
  12.             "type": "cortex-debug",& z3 P6 T0 B2 V: b# y' e6 u
  13.             "servertype": "openocd",    // 调试器选择
    8 Q& h' J8 F$ D- X+ n
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    / [- c: n/ G9 k, y
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    - n' ?  R0 L$ ~# w
  16.             "interface": "swd",0 ?; P9 m3 k# p* U
  17.             "configFiles": [# b! a1 d4 K5 A6 ?/ [
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    . U4 C$ b. ~) v7 p
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",' S" L" i0 M* S1 N, ^2 a2 j
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg". D$ ^/ F9 A" J
  21.             ],
    # X/ M6 ?2 }6 T7 g% M+ K  m, m- B
  22.             "runToEntryPoint": "false",
    # b# K0 W* A$ L. g9 }1 ?4 Z& w
  23.             //"runToMain": false,7 u9 w* V7 p4 w  {; C8 m7 X* P& K
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    : ^$ e; }, b! z9 {* `' N( t
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径; y4 j% Q( R5 \2 f# w# t" n
  26.         }/ \: P; I+ {( ]

  27. ) s( ]0 J8 j7 Z7 ?0 L7 P0 `! c& `
  28. }
复制代码
9 S8 w4 W' E. G/ u  Y) N$ \
上述最重要的是引入openocd的路径。
3 e% i* X3 G$ _% t
" x5 y% S- z$ x' h3 X: J
4 m) I* ]: G1 Q7 P: G
c.点击播放按钮进行调试
# i9 k6 Y; ?3 Z2 F. B, D, ]" b# H: M4 ?; x
微信图片_20240615160729.png
+ x+ z9 L; e5 N. ?( c% R' I" m" p

0 L/ M( O; g: k+ l! i6.结束
# ~' }# K1 D* [/ _5 J# Q$ J
9 p) g% ?% T5 v" R
. L( n0 c$ k3 }' [
8 b0 {1 J) a$ m- c& h; Y转载自: kevin/ X" L2 i7 `- R8 w4 g' t
如有侵权请联系删除
  r; Q* P: W# G/ s4 B* }8 `$ \' z; X0 O4 X

0 D: h5 J8 O' w7 {, f1 @
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版