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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”9 Y" b# r# X$ a6 ^! \# q# z! a9 N

. V( p6 ^/ d- }, v0 R. G; O
微信图片_20240615160241.png # l# E1 Q) O# k# U" n" Y

6 G( `8 T% h9 ^8 M( ~+ c4 y1.VSCode安装与配置
& J9 E9 m; @5 \3 y$ fa.卸载1 J/ c4 h% w4 ~
b.安装
0 Z; D, D% c& l& c1 g5 Mc.git安装与配置
# L8 B  L# g8 q8 ?0 ]# f0 |d.安装插件7 F: O8 p; h4 N) k+ f' ?- z' \
  d2 ~' j( A0 k& o# \! n) U0 g& ~

, F/ n5 C+ ?: C; Z' s& L2.Embedded IDE配置
; E. W; w( Q' X" p1 Ma.安装EIDE插件4 ]* h4 C* @- Y# c/ I" ^  h
b.安装实用工具到EIDE
6 U2 b7 I6 r+ Q" U5 _/ Y, s) K1 l
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools' E: W6 h0 H4 H) H4 t
3.Embedded IDE项目建立-stm32标准库
% D$ q& L+ _3 g+ m& e. ?a.工程项目建立
" \4 d1 a6 \2 [b.在EIDE中使用标准库时的设置(无Makefile)
7 ]* j" P5 G1 C9 Cc.编译工程
; O, j) @0 d, q% x4 ^5 Y7 s4 B% @4 A# z
4.一些问题的处理:
+ `  L. T! j+ t" c& l5.调试工程
/ A5 `9 d4 n  f3 N/ m3 p& d2 y" v$ j) ^% V+ `' V
01VSCode安装与配置
8 X- ?* k4 w& P9 X9 T1.完全卸载之前安装过的VSCode
* I+ x( K& `8 I( {1 wa.卸载软件0 ^& a  M6 g; G& ?0 R
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。' `. @9 J7 N, W  ]9 v- x
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。9 k% n/ K. {5 t  {
3 _, J4 ?: C2 Z: i! o& ^4 t. Z
2.下载安装vscode
( |7 _$ Y' M- P9 m' d/ j6 O# ?, k8 A7 `5 u! P" [8 z
3.git安装与配置7 q3 X5 V4 Y( y5 @! F& D. }% V3 ?
安装git
3 l$ ~: j1 R4 `) y
# Z3 d* |! H( a* w- N
微信图片_20240615160248.png
4 S. A' ]  {) F6 i% n$ C: X$ s/ b" g  z3 i# u- N4 A
安装完成后,在开始菜单中找到并打开Git Bash4 ~1 n0 |& }1 y2 I( U$ m* L7 G

' G# v8 ~0 Q1 w: c( h
微信图片_20240615160250.png 6 Q* r, T) r- t8 @9 I

7 {% V" o2 j, j在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git
' d- X0 J1 H% y. |3 T" S. d
8 ?5 B* b# _2 f6 f6 C% C, J/ V' P
微信图片_20240615160253.png   z7 X, s6 T% J' P- Q  y, z+ Y

- ^  n4 A5 c8 ]  G% w在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' ; f5 }2 d  g( L/ f. P4 e
  2. git config --global user.email 'ct15762287606@outlook.com'  D$ W, q' P7 v( R: h; E6 R2 m
  3. //检查当前仓库状态
    : s3 O8 z" A9 R  R- ]
  4. git status
    # U" g" N$ }4 p' J6 Z
  5. //确认git配置- d( S; @- m) w+ O* K! ]
  6. git config user.name; m+ @. p; [7 R; O" ~
  7. git config user.email
    * T4 s/ ^; F" y8 m( U
  8. //查看错误信息
    " {- W5 g" K  c" ?9 B  v0 ^/ R
  9. git commit -v
    # ^5 ], a8 K+ t6 t7 m6 H
  10. //清理缓存
    4 C) g5 h% w9 W$ V* ]
  11. git rm -r --cached .9 T7 l# K7 o! Q- g" A9 M/ K4 B2 H# d
  12. git add .
    8 Q* {) `$ a( z; U, h
  13. git commit -m "Your commit message"
复制代码

3 h2 d/ D$ R" @1 A! M2 o
微信图片_20240615160255.png
- Q8 @3 H7 ~2 J6 v" H4 b) u, P0 _% U6 }$ I' G
4.安装插件,如下图:, `/ J" a1 C! ?/ |

9 `# {- h: @( v0 g7 s
微信图片_20240615160258.jpg
' r2 f$ @* O& q- c# H# q
7 J, W4 b9 s% s' b9 K+ [
微信图片_20240615160301.png
0 t, b. `! x( `% J4 y; E! \2 B& B  c4 ]7 E! k( |
微信图片_20240615160303.png / {7 `8 L, @+ M1 _" z% s/ U

0 B7 w0 T4 w; I! S0 Q 微信图片_20240615160306.png 8 c- ?/ @/ _* [% F* L

& X$ s; A6 b9 s1 Q0 M 微信图片_20240615160309.png
; q* J& @+ y2 G
' g; y9 Z0 }. t& [2 r7 R! c 微信图片_20240615160312.png / c$ s' L2 e7 N9 _  U, x
* m% m1 B; Z2 A5 G
微信图片_20240615160317.png / z* _8 n+ J2 U4 S0 d6 `' n

, ~; f  R) v& ?# d 微信图片_20240615160320.png
# [! e& y" R2 u9 c( o) y
6 O9 G6 y( _, h1 y0 K% ` 微信图片_20240615160322.png
5 e# n9 M7 s; p0 @% i1 S2 Z( G2 y  c9 v  Z, U
微信图片_20240615160325.png
8 Z3 s8 E3 l0 P( N  V1 m8 |0 v, n, V; G+ w6 S& i3 J. z6 G1 [, K- i
微信图片_20240615160328.png 1 ]" Q9 \! M# o2 ?8 `/ X

) H3 z1 v; }% t! G. L9 [5 c* n7 S) ^ 微信图片_20240615160331.png
8 A$ O# u$ f: y( O! L  I/ t0 e' E
6 x1 E2 D) C3 D: d+ L1 ^! y 微信图片_20240615160334.png
( U# m+ ?: h8 F5 ^4 k8 p3 O# j) h) X) _2 `; f2 Z$ f" Q
微信图片_20240615160337.png 4 J, F2 ^2 l+ c- K/ ^9 m* J

4 J+ p5 r) l  T: w' @& r 微信图片_20240615160341.png
) L% ?, E/ g* R" q$ T3 @
( b/ J" U+ B% M  b+ ~+ `4 E 微信图片_20240615160344.png
, `5 l$ H$ ?3 g; Y4 c; E3 s7 |$ Q; {2 T! Q/ C+ G8 W% ^, M
微信图片_20240615160347.png
+ J/ M/ k# d) q0 Y0 f7 ?- i$ R, T6 u  h
微信图片_20240615160349.png 4 {$ Q9 F5 B: d/ ~

: m) \5 X, C) y+ i7 t4 H- o, ?/ N 微信图片_20240615160404.png
5 S# L$ N- r/ }: m" X4 B3 _$ @% {) m, h+ H
02Embedded IDE配置" F# m% ~9 p+ L- M+ u2 _3 ~# `6 J
1.安装EIDE插件到VS Code
2 _5 _6 c: \0 M8 U0 b2.安装实用工具到EIDE环境. R& |) y4 H) v/ I
a.安装arm-none-embed-gcc工具链
4 K, S& H% S6 F# W+ q" p- A/ F# U& _% y- F# J- @
微信图片_20240615160533.png 6 u# ?9 v& i3 Z2 Q
& U' C  [" d2 x+ i+ f) h3 d
b.添加其bin文件夹到环境变量
: r5 Z/ f7 p6 W% C/ |4 G- ^
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址% M4 [, h  u9 R
; m4 P3 Z; w- U% l8 C' I
微信图片_20240615160536.png $ N0 e1 I  H, T2 o: z; B
1 j. g$ x& u6 W9 F# P' W
微信图片_20240615160540.png
3 p- q. j2 u4 [7 x% e" ?$ n

% [! f# J# ], p5 T* E在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试% U, h8 S( [$ M$ R4 `+ ?( t+ f9 P
% A7 s5 s  H, h0 O( g" h
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

5 [5 ^2 n9 `; v; [c.安装OpenOCD' A4 Q- ]% ?( f  h" N
- x8 T4 H3 W% D, r' X
& J4 i4 U7 S% w' j" I
" o6 q% _; L& ^# v! M6 k2 p+ M
d.在vscode中安装Makefile Tools: m0 ^9 d9 g0 ]% L) l) H9 D
9 u7 Y8 I  n; p  `1 O
微信图片_20240615160554.png 8 p$ h8 }  G- A, Q( P

4 e5 ]- o9 D( l( [9 F+ w
  • 找到该工具的安装目录1 a. V# L; i% x

# Y4 ?  s6 v( x& Q) l) E' b; d1 C$ }
微信图片_20240615160557.png
$ H$ H+ R4 {* B0 p) u1 r5 v# f- H
3 _) n' e0 `$ G; ~$ o
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常: f9 i% m1 _* b4 S4 u/ f- @
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v0 V) }; n' B' W2 v
  2. GNU Make 3.81$ T% w+ j" r6 F4 m0 ^
  3. Copyright (C) 2006  Free Software Foundation, Inc.6 W0 y  q) v' {# O! j
  4. This is free software; see the source for copying conditions.
    . h& P; k7 S: N5 F8 r1 w
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    * P1 ~$ U9 ?; D, S$ q
  6. PARTICULAR PURPOSE.
    $ z0 u( W4 S0 I5 h; [0 c

  7. 3 B; W3 t' X* G0 G

  8. 3 b! Q4 w6 E. q* d3 w
  9. This program built for i686-pc-msys
复制代码
6 e2 F6 J9 H. k, l0 K5 I
03Embedded IDE项目建立-stm32标准库
8 }) A7 F; b( J( l# b- V* x1.工程项目建立( P% H. a1 A/ S) q1 O) G7 W
a.切换到EIDE环境,点击操作-新建项目-空项目图片
" l( w' }& `0 H# h# \6 k1 d7 _0 v5 L5 U+ |) f6 E( t4 {
微信图片_20240615160602.png
$ K' A/ J4 V: X3 }# l  L$ D: f- T4 H! O
b.选择一个合适的MCU项目类型,如Cortex-M项目
( q  u# Q( G8 P+ T6 W: T+ H5 Q6 T2 W  p9 p$ `# b; q) l. G
微信图片_20240615160605.png
4 Z; E$ V; r3 Z- ^# [. ?
: }& \  G, C4 R( V# T) S5 Y# uc.点击右下角继续,跳转到工作区. v% Q+ }9 b7 ^0 K

; x* q6 |3 [- ^3 `9 e- w  v 微信图片_20240615160608.png 6 Y, ^; C' p) r) H- \
6 N1 X; m7 ^1 `" g
d.添加工程文件到工作区路径下。——标准库
" _( @7 n( h7 I8 z: E' }2 R3 `8 _: m. M5 r$ u# Q" H& O8 o
5 \0 \+ h% G+ j9 D4 I
微信图片_20240615160612.png
( W* {6 k9 M7 f5 G3 S; r8 w6 B/ I' t( |4 {3 |  s8 l0 P0 ]6 g: r
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    ( ^8 B; K* N4 f* m* H# u- Q7 u

9 w9 i; p; S( K5 X9 \6 ]4 u( }: Z# 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文件。
    ; y2 l/ _% G8 m% C: H# R
( r* b9 H0 f8 S( y" a, M7 V: }- s
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件6 k* |' ?  D. [6 K+ c/ K
6 j1 Y) W# B8 U* P  L* a

/ P  L- r* S' j) l8 W
, T+ O$ B0 j: d# c
微信图片_20240615160615.png , f0 g/ q: b$ b" b6 j

2 N. @, v, X. u. U4 e' kstm32_flash.ld* [$ w$ Z- }6 p
  1. /*  O: ?& z( {* G. J  y3 g
  2. *****************************************************************************0 W5 [5 F7 I' l& t/ h' Q5 x8 y& ~
  3. **
    9 X  X6 L2 e5 u$ V( M2 g: f2 o
  4. **  File        : stm32_flash.ld0 J" c/ p* v/ \* u( T
  5. **: n5 g3 f) o: e$ v2 [) W
  6. **  Abstract    : Linker script for STM32F107VC Device with
    4 b: ~9 c. a7 T
  7. **                256KByte FLASH, 64KByte RAM
    + e# ?, \: h5 q/ v+ n
  8. **3 w- n! c0 l2 Z+ J5 b; |( Y0 ^
  9. **                Set heap size, stack size and stack location according/ `, n9 x; N8 @2 Q, B/ d* [3 I
  10. **                to application requirements.& Y' H( ^" n2 L; @) {8 p$ l3 W
  11. **
      c: ?2 b8 S! D6 P  C2 Y! D
  12. **                Set memory bank area and size if external memory is used.' |/ i( q5 T8 I
  13. **/ B* D+ s! _6 H* H! p
  14. **  Target      : STMicroelectronics STM327 d6 V: r- `. k  f' Q
  15. **/ F: {' K9 T& B& U, v5 \* K; F+ Z
  16. **  Environment : Atollic TrueSTUDIO(R)$ @" K2 Y. F) P" b4 G, h
  17. **
    * n7 P8 q) A. y
  18. **  Distribution: The file is distributed �as is,� without any warranty
    $ \; S  K9 }1 b6 d; a, Z# @
  19. **                of any kind.
    , g" I# {7 A% r) Z% R
  20. **( a, v* _' m  d
  21. **  (c)Copyright Atollic AB.
    - a4 ~* Y# L; X! _
  22. **  You may use this file as-is or modify it according to the needs of your: a6 \0 n7 Y+ f/ k  z9 g8 Q
  23. **  project. Distribution of this file (unmodified or modified) is not! P( }4 N2 C2 f
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the" b9 r  T( l: p  p0 U2 ?3 S9 q, T
  25. **  rights to distribute the assembled, compiled & linked contents of this; H! Y7 _; x7 k
  26. **  file as part of an application binary file, provided that it is built
    ' b6 A, R# |. ?, C4 v: U2 _* X1 ^
  27. **  using the Atollic TrueSTUDIO(R) toolchain.1 o# L# f* m/ Y$ s. {
  28. **( f6 y& j' H( W$ w. ~! Z
  29. *****************************************************************************5 x7 Z2 ]( {. y4 a3 R; H+ X- Z* x" `9 @
  30. */$ g  _4 i! {7 R" _  ~  K

  31. & b  C% b7 e, f8 J
  32. . ^. y8 `* ~  S8 e& Z. u' r
  33. /* Entry Point */6 N7 X" d) p5 v6 ^/ D
  34. ENTRY(Reset_Handler)1 `" _& T$ R% h. P

  35. & w' b) E0 l/ K; ~" g) e
  36. , K7 r+ K8 O* w7 i9 C. r3 e9 y0 ?0 K
  37. /* Highest address of the user mode stack */
    - \0 S3 K& Z! L. ~1 v& x6 [4 D
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    5 L; b* i6 h6 ]/ _% n

  39. 9 z2 n# g0 i" r  ^+ p. K' I

  40.   T& h/ t) O6 ^3 ^! z# w! r
  41. /* Generate a link error if heap and stack don't fit into RAM */
    7 e( \5 ~2 g9 j  x
  42. _Min_Heap_Size = 0;      /* required amount of heap  */
    2 u# a. w9 F+ \8 l  y! d% Z
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    & {2 k7 }# x9 Q' F* ?) [0 U

  44. / R/ M( Y6 J: C

  45. ) a8 X* ?, |! Q' a0 x
  46. /* Specify the memory areas */
    9 @. ]2 D/ g! Y6 N. k/ A; G8 @
  47. MEMORY
    ! I4 o2 v5 U. |0 `0 T. Y# h+ l
  48. {) L3 c0 C3 p3 @3 ~- j1 Q2 f
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K4 j6 k/ G! c' \. ], \
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K! U, d  @8 @: N# Z/ z+ O
  51. }. t# X1 R. B4 a/ G3 J

  52. 1 }. ~: m2 j) r- X2 {
  53. # |8 T1 F2 B/ {) |, k, f
  54. /* Define output sections */- l6 F. F1 _0 K$ T! J
  55. SECTIONS
    + G5 F: s( S2 T& S6 R9 Y
  56. {
    3 K$ M3 ^* Y' E$ V% {9 Q
  57.   /* The startup code goes first into FLASH */) F4 P9 Q% J8 H: T+ R: H5 p
  58.   .isr_vector :2 D* s; @( d. G4 g9 k! C5 M) A
  59.   {
      w" m2 c0 \( m, D0 K& T* v) H0 p
  60.     . = ALIGN(4);! L$ M/ C. S0 h; K# @$ l
  61.     KEEP(*(.isr_vector)) /* Startup code */1 z" P; S2 c+ k( ~6 [
  62.     . = ALIGN(4);
    ) a; ?$ R- P/ H! G
  63.   } >FLASH
    , `% C& b4 U6 v* p6 `% `9 L( a

  64. * l) Y4 d4 l, ?8 e0 U
  65. $ C' g$ B! v0 e( Z/ S* A
  66.   /* The program code and other data goes into FLASH */
    . ]0 b7 y/ ]1 T6 I$ E& ]% o
  67.   .text :
      c% X, g+ E1 Y" a0 D& r' e
  68.   {: |* \0 o& l. Z  J( [3 R
  69.     . = ALIGN(4);2 p4 U* g# P! n1 @# b- M  i8 H
  70.     *(.text)           /* .text sections (code) */
    2 q. Y( \. F5 O3 }9 l
  71.     *(.text*)          /* .text* sections (code) */- S9 J# s' [  E5 ]
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    ) B( K$ ~0 a4 t8 m4 Y' F, t" N3 L8 W
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    * ?+ o0 g) s: I' o9 L& o) O
  74.     *(.glue_7)         /* glue arm to thumb code */4 |1 _# e  K3 v
  75.     *(.glue_7t)        /* glue thumb to arm code */; O) t- K: U* ]' e7 |7 o

  76. 9 G9 T& S+ O5 O; J
  77. 8 _3 Q% d8 O5 P) y% ~. L
  78.     KEEP (*(.init))
    4 n, i2 l/ t- |; l: f
  79.     KEEP (*(.fini))1 A( C1 Y& s6 u' j
  80. % @8 V# E5 c: g) b

  81. 5 s: b- S$ N' J2 }5 R+ n4 ]
  82.     . = ALIGN(4);
    3 e4 n/ X+ n; @' D; f
  83.     _etext = .;        /* define a global symbols at end of code */! {! v' _& X) k3 w" c( }
  84.   } >FLASH4 T, [1 d, r. X
  85.   o  l- ?& `4 P$ b# d
  86. / Z6 B, W. A* f" M
  87. , [7 @& r" @" {. e$ P# Q& B

  88. 9 M3 @; d- _% J, c. ^" v0 ]
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    2 T( e+ @( W8 A3 F* @& N% L( [
  90.     .ARM : {0 {9 T7 y& o7 U$ i
  91.     __exidx_start = .;
    " w+ r5 v6 _! w
  92.       *(.ARM.exidx*)- r+ i. X3 A9 q3 z$ q
  93.       __exidx_end = .;- s2 ]+ f5 O! E/ m# W
  94.     } >FLASH
    7 x$ k  i. j0 F8 e5 v7 F* Q( e
  95. % N# W) O% @! |& _" P: d6 f. _
  96. 2 Q  ~( |9 y- ]7 w! @
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH) x! w- t  z+ d. \) T9 B

  98. - i; y, b5 s" W! s* c, C0 x% y* o

  99. : k4 ~; w% t2 ?6 C5 y$ x: x. \
  100.   .preinit_array     :
    4 P$ v+ V% m& U5 G/ ^: J
  101.   {
    ! t: r/ O# ]# n/ Q
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    9 `7 q1 @5 m0 e
  103.     KEEP (*(.preinit_array*))& B- |$ @9 K; k; p
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    # a( V: \  }% C. ~$ E
  105.   } >FLASH9 R  @- e" I2 `
  106.   .init_array :- I1 b. O, F, G! f2 ?) X3 l
  107.   {
    # T- Y3 @3 r5 ]' k6 o* H
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    ; ]$ B3 w6 I$ A; I
  109.     KEEP (*(SORT(.init_array.*)))  T5 U! D6 u& H3 F
  110.     KEEP (*(.init_array*))  l( S2 Q* p& k3 @( v4 s
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    $ J. [0 L& R+ \/ I. i3 {6 p
  112.   } >FLASH. p. l$ z7 L1 n, }
  113.   .fini_array :
    1 d& x# }0 U3 U# t4 }3 l7 B' ^, ~
  114.   {' {0 I; y" t0 v  o. d1 L
  115.     PROVIDE_HIDDEN (__fini_array_start = .);& X* B# x" ~0 K% j6 K$ q
  116.     KEEP (*(.fini_array*))( \8 |  d- G2 j/ L, H! I
  117.     KEEP (*(SORT(.fini_array.*)))
    0 t& F, r9 f/ e5 l8 O  t6 g0 ^
  118.     PROVIDE_HIDDEN (__fini_array_end = .);+ L  q  B! x; y# [# x, k- m/ d* ]
  119.   } >FLASH
    % B) Q$ T1 z4 F/ e9 ?

  120. % s: I& Q3 J7 l6 c8 _

  121. ' \1 e# U2 J+ c3 L! z
  122.   /* used by the startup to initialize data */, i7 |1 [* o" N% v* e
  123.   _sidata = .;* ?) o) y3 H) k

  124. # ]  l7 g1 p' T$ w

  125. " w7 p: a7 o8 Y% U- q; f. i
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */2 k: z+ `& o8 o( o* r# ~
  127.   .data : AT ( _sidata )
    3 ~0 }+ c2 R' w
  128.   {* p; m( k+ W/ B5 B. K% G# O
  129.     . = ALIGN(4);
    ( Q# l4 x4 |, _: y1 W8 b
  130.     _sdata = .;        /* create a global symbol at data start */% k0 ?6 i3 v- n/ I- ~( z" k
  131.     *(.data)           /* .data sections */7 ~. ?' g4 ~; k5 M/ T; K& w
  132.     *(.data*)          /* .data* sections */: L+ J( h/ b8 S, l2 j

  133. 1 L* I, @; ?+ A* S, Y9 e

  134. - A- Z# [7 H+ n8 ?
  135.     . = ALIGN(4);
    * Q; w* s1 r& Y
  136.     _edata = .;        /* define a global symbol at data end */
    $ T; L6 u" w: M
  137.   } >RAM
    $ w( d" S1 E- n4 `5 m( `; K# F
  138. 7 i' f& S3 M! r# y2 |& P
  139. ( ?% K/ _3 H  Y& B; J) ^$ K$ \
  140.   /* Uninitialized data section */
    , Q& z% I# Q0 ]; k( B
  141.   . = ALIGN(4);  g* k  J1 y  N* |
  142.   .bss :" L; ^' ?( P. F* `0 `
  143.   {
    " _9 X. T( v/ R
  144.     /* This is used by the startup in order to initialize the .bss secion */
    9 d1 l: r$ S" E4 ]6 o  K; t/ H
  145.     _sbss = .;         /* define a global symbol at bss start */% {6 E/ Y& t6 n- D7 h# C
  146.     __bss_start__ = _sbss;( Y! u5 \& O9 E" @" N# {4 X
  147.     *(.bss)1 L9 u; y* A& d1 u* _
  148.     *(.bss*)
    2 J+ x* ^) Q* F& ^' s# d
  149.     *(COMMON)9 [% c4 h; ^( k" B6 \

  150. , I3 K, d7 ~! b2 U1 }5 ~, p4 y
  151. 3 R/ ]  t  p6 {0 Q1 U
  152.     . = ALIGN(4);' v# ~* Y" n# L) b3 s7 w
  153.     _ebss = .;         /* define a global symbol at bss end */
    / E) c5 e2 @% R- o
  154.     __bss_end__ = _ebss;/ w3 U: f* ]& L! f
  155.   } >RAM
    ) o1 B( U) ?& ^4 t8 r; {6 d- q. q0 {6 n

  156. . V" X$ ~, |6 N0 o) ?8 T
  157.   Y0 a: c: s  D! b  x
  158.   PROVIDE ( end = _ebss );
    7 Z; X7 J; ?9 k
  159.   PROVIDE ( _end = _ebss );
    ) y# R1 ^2 C' n. t% i7 X
  160. ; B2 P% [4 V& d# p$ W

  161. 2 ]# ]/ _' S# e
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    # J5 u+ Z2 U7 S4 V) |0 L
  163.   ._user_heap_stack :0 H0 C9 R" R% m, o2 R
  164.   {: P0 L. {, M! p, }$ `' o9 ?9 U
  165.     . = ALIGN(4);
    & O: X! M* R7 [- {$ q. L- Y4 y
  166.     . = . + _Min_Heap_Size;
      N/ w7 O0 Q7 p
  167.     . = . + _Min_Stack_Size;
    . b% h' U% X1 F9 A, |
  168.     . = ALIGN(4);
    - K7 G6 m. U& y! F: W* b! O4 c
  169.   } >RAM% y) K3 _* H3 @9 Z3 I; B: l

  170. 2 F# v* C$ H. U
  171. 0 \' ]! K5 s& S
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */# i. R0 ?4 L( Z. L# k6 S
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
    8 }; h( K1 M. h: O8 `, V
  174.   .memory_b1_text :
    - V2 D1 q' d; C, R6 {" O
  175.   {
    ) h6 u0 e: a+ i' ^- L% W1 L
  176.     *(.mb1text)        /* .mb1text sections (code) */
    ' k& x$ Q( N3 {0 D9 |# V
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */$ i- s# Q& O- b/ S& O. y- U
  178.     *(.mb1rodata)      /* read-only data (constants) */
    : Q: V, ]7 _6 N
  179.     *(.mb1rodata*)% g% D' O/ x$ k+ t
  180.   } >MEMORY_B1
    6 Y7 m+ G* l' P" @9 }
  181. 2 E! V( e9 N1 ~" [" G

  182. 3 F# z! V/ Z. N! c/ K
  183.   /* Remove information from the standard libraries */' ^2 ~1 J$ |# }6 O4 k9 q4 g
  184.   /DISCARD/ :
    1 L0 n  q  U' _* p
  185.   {
    4 C; b% [6 ?* I$ k( |
  186.     libc.a ( * )+ ?6 a- d- M& V* E
  187.     libm.a ( * )& \6 b7 {9 R4 X1 X  [; Q% r* a
  188.     libgcc.a ( * )( M, ]& k- P, W4 c
  189.   }
    8 q' P/ C+ m& r9 n
  190. }
复制代码

2 o4 T$ H; @3 ?+ [/ a
  • 最终目录文件如下
    ! _6 n% S; f2 i; t( `, M% A& e

# R" u9 E; |9 ~
微信图片_20240615160620.png
1 Z4 I3 t, L+ K' @) d
$ d1 o2 M  M  f5 X! y/ a! Q( m+ B% b
2.在EIDE中使用标准库时的设置(无Makefile)
9 B0 J$ [" J4 h0 \% {& ha.切换到EIDE环境下
$ O3 p6 l$ ^! w7 T! y3 D7 p/ |  l0 c
微信图片_20240615160623.png , m' B! U3 c7 I) e8 {1 ^8 \

1 ^2 h& M8 x% p0 B1 w& [ 微信图片_20240615160627.png
% O& l8 s" d; s7 m1 Y2 A2 C
( ^) U+ a( Z' `/ K, a! ^7 s0 q+ x8 [
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
" B$ c) w0 r. |' n. Z0 ]  @) l6 A) x* e% O
微信图片_20240615160629.png 0 J" i; u7 I6 T
4 N- P  T- B, `- ?. ^
微信图片_20240615160632.png
  b  j7 \4 K* X: L4 J- Z0 V4 H  H
# a( c: }' D. r* x 微信图片_20240615160635.png
# D+ }5 r' h1 b- J' w5 u/ @
5 V# r' V$ h! \6 G9 \  ?- W, \7 i# @! k文件目录如下:: J: R1 {- ^0 O3 F

! O% e; ~% E) b
微信图片_20240615160638.png & w$ F  S  l9 }
- U. H* Q  A8 ~+ i% b
c.点击+号安装CMSIS芯片支持包" T" E! s7 F7 F0 \8 z
: f, p1 H" B5 E2 m( x
微信图片_20240615160641.png
$ h( r( |, K5 }8 x/ R9 L6 K3 U" c; j; P
微信图片_20240615160652.png # m) w& \9 A+ h% A. |2 i. {. g. r. v3 k. d( }

: P) n' b. Q0 u0 e6 j7 z 微信图片_20240615160656.png 0 E' L  @' a$ J, K

" i. ]+ S+ r2 ]% Dd.修改构建配置为gcc" ]: \% O# q: C& g6 J; W/ ^

* K# S) q% U) a( D& ^
微信图片_20240615160659.png ' `: T! f) a7 f+ ]* Y4 \. y

6 K, f, W5 |; B/ be.烧录配置为STLink/OpenOCD1 Q5 n' U; G# P9 U& ]# Y- i% s
9 }. R' O$ g' z
微信图片_20240615160704.png
- J/ f: T& r$ Z* ^
2 P7 I$ P  x' T  I$ G9 U! Ff.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。! P: l% |( W9 T
1 X" t; `! l' p
微信图片_20240615160707.png & ~' [; V- b" y
8 c: g6 O8 ^2 \) `% O. T2 Z
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义: _% f2 b5 q! G9 B$ v# p/ X
  m" Y3 H! R' P# E' C
微信图片_20240615160710.png
; }3 L9 @- S3 L- s3 `. ~
8 F5 r+ g" ~, W5 @h.此时编译可能会有下述报错
+ f4 u! Z3 R1 y7 w5 G3 t
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'% X7 ~) |) q- _5 s" o3 g
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

- `( Y, t" ^, ]8 |1 g7 s- ^! R! a- ^! S+ `8 c# u

5 F" y8 E  T7 e: s打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)
    ( |, S+ T% V: b. ?$ g9 B( M! `9 F
  2. {4 V7 C9 V1 e% J. B5 u
  3.    uint32_t result=0;3 j1 S4 }# ~# E- C/ p; C/ I- C
  4. ( q- u. R( X1 U- Y9 i8 E
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    * Y" V0 v# c4 v
  6.    return(result);
    2 }3 v+ E; E* r* }7 n) o$ U5 j
  7. }
    - O2 L. ?/ h4 b3 L" ^3 i8 O

  8.   d/ n, Z% `8 Q0 x# s% A
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)
    , ^; H4 o9 x8 m( h: l
  10. {; ?. a7 a* x! \/ q0 @
  11.    uint32_t result=0;
    2 y- B, }4 F5 x, p/ b) S; Q
  12. 6 H+ U' e; i& n6 w5 F4 o! i* w
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );+ B6 |0 @! G% T2 a
  14.    return(result);% |- U* e# E$ z0 [
  15. }
复制代码

4 G8 ^* d$ ^: M9 D; P4 h, n9 N
  • ctrl+shift+p,配置c_cpp_properties.json文件图片7 q9 ^% K0 O, t& X- h
; w( P2 v" b) f; r
微信图片_20240615160713.png
% |" k; g* s8 K% I3 a" [! Q
  1. {
    ) F" h/ O( ]/ ~4 B  Q: K+ D1 Q3 q
  2.     "configurations": [8 j5 Z0 v5 l' G( w
  3.         {
    9 k: \# `8 v9 [- ?4 y% I: T
  4.             "name": "Win32",1 U1 Y- \4 }7 V$ c; n
  5.             "includePath": [7 E1 U; _4 ~& B' r
  6.                 "${workspaceFolder}/**",  W# y0 }, y5 C3 w8 m5 ^
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",5 e) U# N6 P/ K' A& P
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",7 ]* G, I% z6 l$ B+ ]& I; {  {
  9.                 "${workspaceFolder}/CORE"9 k$ P0 u" q; S( x+ u1 U
  10.             ],
    # E; L% s1 X1 }  p% B/ l
  11.             "defines": [
    * m/ T2 I$ k; D- ?+ }
  12.                 "_DEBUG",# ?/ n7 h  c0 \$ n- d4 `
  13.                 "UNICODE",, C1 H4 I  M! Q6 V1 A/ M8 n" i
  14.                 "_UNICODE",
    : X5 z- ^. U. O1 \: N7 U: D
  15.                 "STM32F10X_MD",
    # L& w5 f# n. t6 U8 D# r
  16.                 "USE_STDPERIPH_DRIVER",
    ( L( V* S& P( U( U1 N8 A4 r: \7 ~. t
  17.                 "__CC_ARM"
    ( Y9 g1 M3 _5 h
  18.             ],
    0 |( c3 s( t4 }; f' k: Y
  19.             "cStandard": "c99"0 n! t: q; l# t% |1 z+ d
  20.         }
    5 k% N$ `4 s% C% P& l2 Y; j) v" p! g
  21.     ],
    ' q; @; V! @" A+ n
  22.     "version": 4
      k1 S" @1 I" O  r$ A% ~
  23. 1 S  a/ Y: d: u. e( y
复制代码

7 F1 }4 y1 C+ V  z( s3.编译工程1 j4 W0 p1 P9 P6 @3 R

5 H, L4 F; D7 g3 F8 L7 W( H' f# J, l4.一些问题的处理:
$ h$ L: f) ^2 Q4 Z" L- J' f" Na.编译成功,但下载后没有任何反应。  S" U! l& L4 H6 C7 b  r
注意检查stm32_flash.ld文件内容7 y0 i( W; c1 R+ i2 u8 f+ z' `
  1. /* Highest address of the user mode stack */
    # W( N& r( L8 j8 A& U4 _4 d
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码
/ h8 _% r; a& g/ Y: {) E5 ~
注意对应芯片型号
4 u& z% M1 M, X+ h5 {# x. H$ b
  1. /* Specify the memory areas */
    7 a6 C4 }$ W2 l# @# H
  2. MEMORY
    5 ~! S: l' _- m- d8 `0 V! U
  3. {) y3 Y8 G: N5 e0 ], l7 M  q
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    " H) R2 }3 k/ p' F, [  V
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    # B+ I7 f/ m! b3 `) o
  6. }
复制代码

. K8 n4 M, ]! i: {b.vscode提交(commit)代码时卡住- Y' R; d! H- K7 X7 e

% x% D5 U$ z$ x2 H% z  W- Z
微信图片_20240615160715.png
+ |  _& N" |! o+ O7 D) r, [, H" q! H! x3 L
微信图片_20240615160718.png
/ _! x& Z& f4 R1 C9 K% t1 F  F' X% _" z, f/ k& N
微信图片_20240615160722.png ) k6 B+ F6 m- i2 t8 {  k" j  M% Q
  o0 V. x1 @( v/ g
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。! o0 T+ j& T/ g% C4 z

) d5 X& {4 q& V! }& Ec.结束
1 X' A6 t# j/ B+ b

# T, {5 P% [" i! ?  E5.调试工程" @& z. M- @; l' R+ @: ~6 b2 Q
a.添加launch.json4 F: ^6 r6 Q3 A0 Y" G
进入一个C文件,点击右上角按钮生成launch.json
: |# x  X$ z+ u* x* h. l$ {' Z  z7 ^2 q: t6 H
微信图片_20240615160726.png 6 s; l) A* f8 D, O/ h- Y  T

  Z) e" l  y- _1 ]: N, X- E) ib.修改launch.json为下述内容
/ x0 N/ W% @7 m0 P$ V2 d; L
  1. {
    . b* y/ b/ Y% f9 V2 H
  2.     // 使用 IntelliSense 了解相关属性。6 z& |4 ?3 i/ v# G3 D+ Z8 S- G
  3.     // 悬停以查看现有属性的描述。
    % _- [) x/ Z  ^; J, _2 I/ Z
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387& Q  y& Q: {+ d4 {
  5.     "version": "0.2.0",
    4 A8 s, o- H, W( B) @$ G: X) t
  6.     "configurations": [" I3 F$ A( S7 f$ v! h
  7.         {
    6 i7 h, a! k8 m! j! N
  8.             "name": "Cortex Debug",
    ) |3 Y% _) _; z' y/ u
  9.             "cwd": "${workspaceRoot}",  // 输出路径
    + L2 }, m  u' z8 [$ F
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序+ ?& \& d% T9 }/ h/ n% `5 U
  11.             "request": "launch",
    . ?' w7 P+ F. q; J# Z6 L
  12.             "type": "cortex-debug",
    8 f0 D5 F" Q3 \
  13.             "servertype": "openocd",    // 调试器选择) q4 Q: b2 ?& Y7 p8 o
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php; ^9 c: E2 E, _6 A5 |* ]
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    6 K0 M0 O- F& n8 h: d' K1 S: r6 A
  16.             "interface": "swd",5 Y  m& ~' @& v% A* L' p
  17.             "configFiles": [
    $ a( A% q. d8 J2 L* z8 \
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置4 U& R- n# h8 x6 z1 w3 d, J  F
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",
    ' m1 _) S6 X0 n9 R- |' }; Q
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"  l) {+ Q, X) o( M9 v! @
  21.             ],
    # O* d0 b  F% K2 \
  22.             "runToEntryPoint": "false",
    " I( e3 I0 o" g" y
  23.             //"runToMain": false,. U; K: v3 j2 ?/ V. m! {* l; N
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    3 A' L- \4 P" R! a$ m) ]
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
    7 {5 w" V/ O. G1 K
  26.         }
    % }2 t2 N' ^' @4 U
  27. 5 z# T: w, P; D; p' s3 u
  28. }
复制代码
% q4 ]. K( }6 h& d
上述最重要的是引入openocd的路径。% J: {+ {, x- @/ o! w. `7 a

9 c2 l$ S; W5 b& v, A# y+ w

  L+ i, x3 p5 G- jc.点击播放按钮进行调试) L  Y. U7 ~" h6 {$ V
4 C6 ^* L# w1 _3 P
微信图片_20240615160729.png
5 u+ s/ V( {, B" p0 A

, r& R) O0 {* Q+ D6.结束
& [: L5 `; X+ l, y+ k' J& \, p  w$ v+ m( s, C8 {  |( W

0 f# I/ ~% g; _3 t( \
9 z: R0 p7 i" X" q转载自: kevin
$ \1 A- {7 z( T% N$ O) x/ |如有侵权请联系删除/ T. |( n7 {, y& R; {8 ?3 ^/ {
/ C! r  V& ]; ~

/ b% l2 V+ O9 S0 p8 R" \
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

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