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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
0 k& J! }  }+ {
2 N  ^  O( B2 w- G
微信图片_20240615160241.png 0 g: E( d' Z4 Q) ^% i! w- @! R0 d- y
6 v% z! s+ ?. a, K4 U0 n: v
1.VSCode安装与配置7 M; N5 p* V3 p6 u& k1 R
a.卸载4 p/ q# V& w- l
b.安装
/ J* {& H+ M; _: k1 p- {! n7 xc.git安装与配置* q+ ?1 z0 r+ l! n, Y
d.安装插件% h+ _, _8 G3 |' k0 c; p

0 ^* i0 t2 c+ I

' {: n, p/ Z1 _8 E2.Embedded IDE配置3 k% L0 T; x( Y. ?. K
a.安装EIDE插件  R3 A& b+ m5 A9 r9 T6 F. v; l
b.安装实用工具到EIDE  P7 e; R* c/ J; H! R0 N
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools( t! N+ `  x; j5 B
3.Embedded IDE项目建立-stm32标准库9 k2 z" E# R  `4 u" H
a.工程项目建立
; a; L1 G( ~2 {8 T6 g2 b5 i6 t3 j  r, Ib.在EIDE中使用标准库时的设置(无Makefile)- R1 }4 A/ m+ `
c.编译工程7 b" b$ J% D/ y$ y  O
3 F- L+ b. s6 [& R- G% i- @
4.一些问题的处理:3 l' x; k! k' R
5.调试工程
; ]. }: k% ]- C% Z! P' a$ E" A) O( A9 @3 ?
01VSCode安装与配置. w, U! k5 n- x
1.完全卸载之前安装过的VSCode9 `2 `) `. W9 T, _3 q# y
a.卸载软件, \1 Q" `/ U, z/ T2 }! R( o" i
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
7 ?/ j' e: g6 ]  P* v+ Dc.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。# M* O7 m  K  T1 v% f

- V" M5 b5 y: q% U! y* ?
2.下载安装vscode- X0 }0 }* e4 _# i, S$ m2 R- |& g2 c

+ x* s% ?9 H" f
3.git安装与配置
7 \# j0 H( M$ j& a( }安装git, q0 O- b$ ]# p! y1 \% P

& g7 R6 ?" O9 C6 j& D; A5 b6 M% Z
微信图片_20240615160248.png - L$ E5 K  f* u7 d$ n. S* p

5 |8 ~4 d6 K7 S( u( |安装完成后,在开始菜单中找到并打开Git Bash# I' h" _/ R5 o, b7 X/ A
' `9 Y  z8 g$ V% `4 ^: J$ Q
微信图片_20240615160250.png 9 t/ k. J) z$ ]  A2 @
" ?, U4 P' ]& c
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git3 w# V- k7 {1 [1 ~: r8 P

! z, e$ m7 _' l0 E
微信图片_20240615160253.png
: @( N2 y! [! @
+ o$ {" p1 |& j4 s2 b3 X
在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    4 p$ e! J2 h6 ?: L) c8 t; W
  2. git config --global user.email 'ct15762287606@outlook.com'
    4 q& ?0 `+ K* Q, g- Q6 r- L
  3. //检查当前仓库状态
    ! ^& E  z3 ]1 |
  4. git status- O% c  \' k5 n3 V  q- Z! d
  5. //确认git配置
    6 `0 B+ S' j+ _5 a+ Y
  6. git config user.name' S( n- Q4 T$ E6 A" {+ }) ?) H
  7. git config user.email+ u) M# ]( H9 }: Y
  8. //查看错误信息2 _, O/ V# r$ k" d
  9. git commit -v
    3 J. @' d/ b: w" R! h
  10. //清理缓存
    # _7 Q4 i. h0 X" [) N! A
  11. git rm -r --cached .
    ! E$ [/ g1 x' Y- n0 j) G
  12. git add .; m0 L2 w, }( Q4 {& E, ~+ W0 ?2 T
  13. git commit -m "Your commit message"
复制代码

. f  E; F8 y5 ], U; S0 ]  s! h1 W
微信图片_20240615160255.png   [4 l5 t* g6 T  F5 C* ?( d/ u; l

8 e3 E1 Y+ B6 ?* o* j$ z4.安装插件,如下图:
. h* Q. V6 L" _6 W, c2 ]: A/ K9 c
0 K& V8 F5 b" j8 Y
微信图片_20240615160258.jpg 4 o' k. a) Y$ O: g! Z$ ~

1 I: y# |( _& [# }& C8 T8 P: H
微信图片_20240615160301.png
+ n0 b+ J7 A- H/ [" K2 Q% k
: b. M! r% t3 }/ L: s, Q2 h
微信图片_20240615160303.png , S. J, N) O. b0 h% e

+ d' R/ e' z/ c6 n+ q 微信图片_20240615160306.png
# d$ m2 U! o+ W# e: m
& s& |+ w0 Q1 Y" x* n( G' t$ ^ 微信图片_20240615160309.png
5 X- u* F( T: q# V$ K/ a' {/ {8 u3 B  x7 E9 L
微信图片_20240615160312.png
, c/ i% i$ |: V+ c% q5 ]2 A; |1 j3 {- ~6 g3 x" h0 ]
微信图片_20240615160317.png
% M  d$ G% \6 n1 g7 q
. r2 j% f9 r' ]7 e2 \ 微信图片_20240615160320.png $ p( j) ^; ~5 Z) Y' s# P
- W: \  Y: `) @( ]1 ?- N
微信图片_20240615160322.png
8 a5 D4 F* l7 Q3 p2 L& s) H& F* b4 j- O0 P) a" I
微信图片_20240615160325.png   b- ]/ ?0 k: E2 o3 E. K$ e

3 F9 h2 b& M$ W7 A  O0 n 微信图片_20240615160328.png
8 ~: C- D. L) \$ D) V8 K
; M$ J1 N$ U0 l. i. K8 _ 微信图片_20240615160331.png + _  Y% H1 [8 `9 @

% P4 X3 g9 D+ Y. v) p! x/ `& ^ 微信图片_20240615160334.png
, [% i% [& F$ \0 ]( l: X  V8 k; Q
7 T' Q4 ^/ R- F8 r3 M+ E8 j, u 微信图片_20240615160337.png / ]' ^% {* C( X0 M# b, E
. x* q* U: Y: w* M3 L- m6 q$ S. U
微信图片_20240615160341.png
: |9 ]0 [  v. j% A+ r+ H$ X
8 g7 O) h/ |9 p0 y; a# z 微信图片_20240615160344.png " E8 t9 N, ]6 ]' `
1 J5 g4 E6 m, E0 L- s7 q% @
微信图片_20240615160347.png
' p' d1 ~0 i) h. Y$ @8 q4 r9 S/ q7 k. v# Y' U0 N# C
微信图片_20240615160349.png
3 ^+ G4 g5 L+ C& ]; e
$ t. s- w# r0 |. ^) E 微信图片_20240615160404.png 6 \9 @: V( g: D$ i

& ?5 U) [% G/ W/ q02Embedded IDE配置
* `( o& ]- F: U% {; S1.安装EIDE插件到VS Code
" ~* u' W" j9 h1 b; A+ B2.安装实用工具到EIDE环境
7 T. @+ O6 B  `/ Pa.安装arm-none-embed-gcc工具链
5 E. p7 M, R- z6 d) W  `* Y3 d3 v% }5 C8 s
微信图片_20240615160533.png ; o3 K/ G; y3 @, D* m

# b1 f8 ~2 ]7 Y* sb.添加其bin文件夹到环境变量
6 \2 E/ r7 Q( K% u% x& ]1 h
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址
    # {% k" {" r. ~6 |
* ~& C  B* Q) j' r: T2 u! W
微信图片_20240615160536.png ' J! m/ u5 x2 v& D( [. b" q

( L! _* p1 N9 F, R 微信图片_20240615160540.png 9 x* ?# `) d4 Q7 j  @( q8 `3 P

) M. ]( C7 h1 i. I在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试7 {* q. w7 `5 q% I- h4 y$ t! f( v
' h+ m- A" f  O
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码
& Y5 v& d' m2 Y5 a) m- f9 R7 W
c.安装OpenOCD
, ^" E- G7 x4 `1 a5 {8 r0 D1 s+ ]2 m" `3 t6 T; ^% A3 P6 n

* W$ A' |% ~( e- j6 F  l- t) r! s
8 ^- N7 w7 F0 C2 vd.在vscode中安装Makefile Tools
1 t3 C7 e0 P: |3 W8 y/ [- n% `# W0 d$ ^9 v5 e
微信图片_20240615160554.png ; c6 k* ~* M) j7 F& E

) I1 G1 {0 g' L; ^0 ^( ~4 W
  • 找到该工具的安装目录$ G, d/ D' P/ X
3 E6 B5 S; G4 E0 A+ ]# n: |
微信图片_20240615160557.png
- i  v2 \% H3 y+ Q0 y
( r: i( T. A3 M/ {) D9 [; t+ \
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常+ @' n# c5 T' V# ^2 m- ]7 \
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v! {7 r9 z5 i% V* m0 S
  2. GNU Make 3.81
    0 s, P: W7 C( N: I9 O
  3. Copyright (C) 2006  Free Software Foundation, Inc.7 k" p, w, y8 l+ G  Q8 R7 X" K# W+ h9 T
  4. This is free software; see the source for copying conditions.
    # b, @! v* @( ?. O, r4 w0 j1 ?/ k
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A" U9 \5 l2 D2 m* d0 i  f
  6. PARTICULAR PURPOSE.8 T! |: c- d6 Q; T' L

  7.   n7 p/ z0 h. B; J/ g+ I

  8. 7 \/ d2 T4 |2 ]
  9. This program built for i686-pc-msys
复制代码

  }; Q% ~- K+ O$ l03Embedded IDE项目建立-stm32标准库5 o! L  L/ Q3 Z4 y1 z8 o" v
1.工程项目建立
5 ^2 c# s2 i# w2 ~" m: Pa.切换到EIDE环境,点击操作-新建项目-空项目图片: {& b6 \3 \) z% @6 Q7 N1 k0 D
' A$ M, p$ A/ g8 i$ x
微信图片_20240615160602.png ! A1 @' t% h/ {& h! n

' F1 ?2 a1 ?% d9 o+ F2 {1 ob.选择一个合适的MCU项目类型,如Cortex-M项目
' y  z' Y/ b3 a" t; S! w, J2 ?) A5 f2 J
微信图片_20240615160605.png
: a( S. }! S) Y9 E, H: l; D. e. Z8 }3 ~" m* j: i5 b
c.点击右下角继续,跳转到工作区
+ X: i% M& G5 d8 F: c6 e0 n+ O4 `. R$ v. F2 ]
微信图片_20240615160608.png
9 @, R& s2 P: M/ ?. Y. A' n+ Q* V

8 m8 O- L* y3 V' Ed.添加工程文件到工作区路径下。——标准库
5 c) J+ @6 D7 `/ V) q/ l+ Y
& l3 \: q% T# C' H- b# z0 d3 z- Q7 Y
微信图片_20240615160612.png / Z0 [( @3 G" o  r8 l3 `6 e* b
) J# a3 [, P% Q- G
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    % `/ I: q# I  v' D9 Y

6 V2 @  ^6 Z: x
  • 新建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文件。
    / A$ ?; b6 W) V
9 x$ W# |# k8 L6 f( k% @0 Y
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    : K' ?( w' Q/ U

( ^: u. L+ r/ M# \  y, m2 x. P) I) C( {) }" w* {3 T
$ D3 F; Z) {6 P, v0 O5 R1 C
微信图片_20240615160615.png 6 g' J/ z- j4 U0 t1 y- ?# b

6 T( y4 U2 ?' W! vstm32_flash.ld
; ^, l% _. e' Y# c3 N% L8 J( `. d
  1. /*6 C; `% f: W! D' T# P
  2. *****************************************************************************5 @8 E" q6 L1 r$ {& t5 c  D, S3 b6 A5 J
  3. **, }! i/ x8 w) H6 d
  4. **  File        : stm32_flash.ld- Q# Z3 L  W/ B' X% Y# _# u
  5. **  `/ T* y% x' F6 d  |" _0 \2 g
  6. **  Abstract    : Linker script for STM32F107VC Device with6 M, j) l& R0 Y3 e
  7. **                256KByte FLASH, 64KByte RAM
    / q+ H9 I& P; e
  8. **% S7 I3 U8 s! R4 e
  9. **                Set heap size, stack size and stack location according
    - v% Z7 P( ]& w, k6 x
  10. **                to application requirements.
    1 L6 [" [% N& E% _1 y0 _
  11. **7 _4 C2 h7 v5 d
  12. **                Set memory bank area and size if external memory is used.
    ; x9 D0 U. a8 D) [: r1 `3 J) A* N
  13. **
    ! S& t5 J# a+ ^4 e6 T  |7 Z+ j
  14. **  Target      : STMicroelectronics STM32
    / A" p/ v  A; l: V. ]
  15. **
    - n/ R. f5 Q6 @# o- K- U$ N/ w) X, U
  16. **  Environment : Atollic TrueSTUDIO(R)8 `  o& L- ]- b; t+ T5 r: Z" S
  17. **
      D$ w$ ?* \5 Q9 \; h
  18. **  Distribution: The file is distributed �as is,� without any warranty
    2 P6 M6 k/ |+ V
  19. **                of any kind.$ Y1 V/ m6 M: K% s  I
  20. *** f) p. K3 m& n- d) T
  21. **  (c)Copyright Atollic AB.1 \% B0 r' A" o
  22. **  You may use this file as-is or modify it according to the needs of your' k1 y% d# K3 B
  23. **  project. Distribution of this file (unmodified or modified) is not& h  {0 S& X/ `6 i
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the/ M8 ?4 ]4 `/ R' W; z9 a
  25. **  rights to distribute the assembled, compiled & linked contents of this; w: P4 v- }3 E1 t- ^
  26. **  file as part of an application binary file, provided that it is built
    - @) O) Z- l% ^! }
  27. **  using the Atollic TrueSTUDIO(R) toolchain.
    ) T" x! D- d; b
  28. **% t" N& B2 F1 f) c1 K" R# K
  29. *****************************************************************************7 X. [) }7 ]% _" C7 m4 U
  30. */
    " Z0 i3 }8 U/ I8 W3 V* C$ ?
  31. ( W7 g+ b9 Q% D6 A. u
  32. $ o) u5 b4 l, G7 K
  33. /* Entry Point */
    # ]# c6 W/ V0 N! y
  34. ENTRY(Reset_Handler)
    % q0 t' ?' `, }
  35. # y. X. p: N  r8 B; R: w) o
  36. / I  J9 u; n/ E0 k6 o. ^* K
  37. /* Highest address of the user mode stack */- r) \% ]- n$ y5 x, I8 E
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */8 \2 S% W1 M2 q+ x! ^9 k$ q

  39. 4 k' x4 g# l8 d( ~+ d) Z1 M

  40. $ @5 i  g% i/ c
  41. /* Generate a link error if heap and stack don't fit into RAM */6 h" M& h. q! |
  42. _Min_Heap_Size = 0;      /* required amount of heap  */
    ) q0 \# @% K5 F8 y# [
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    $ z! @/ k, W0 k' A) C7 q( h; y# I  s' a: d

  44. ) t3 X! d9 i% p2 N4 o5 t0 b

  45. ; y# L5 p8 S! D' _0 ?
  46. /* Specify the memory areas */
    8 G6 C* U4 ]6 L  D7 f
  47. MEMORY* }) e+ S6 _6 h9 |3 F$ T
  48. {* a' m8 q6 S3 v# b/ `
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K2 X& C% x1 P+ _- S  R0 o
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    ) Q9 E  U6 g% V9 X% ?
  51. }
    - x3 k% x: C2 ^  q4 C  [
  52. - u- D+ b) f) N% B+ L' w
  53. ( L. r3 T6 D+ g2 n$ `0 ~0 H+ G
  54. /* Define output sections */
    $ K5 c! b( b0 e9 J" X( g
  55. SECTIONS
    ) ^# c# O4 |% Q
  56. {
    ! `" P( b) k/ V  h
  57.   /* The startup code goes first into FLASH */
    & \, }& S% D6 B( m# b
  58.   .isr_vector :0 n# ~/ u1 J5 |/ d
  59.   {  E7 ~( _& m. Z+ F8 P0 I
  60.     . = ALIGN(4);0 r* K( c* \! ?/ Y5 i# P, {* y
  61.     KEEP(*(.isr_vector)) /* Startup code */
      x- s% Q8 x5 c) ~# ^1 N. m3 `
  62.     . = ALIGN(4);
    ; [! G7 y: M3 `' ~
  63.   } >FLASH
    7 e4 [& n( A2 {9 `. S6 W3 W6 U
  64. ' c  Y' l& N9 ?7 J  g1 p
  65. ' k: V: C. }/ B0 [1 G; R6 u
  66.   /* The program code and other data goes into FLASH */  i! f7 T; h$ ^3 s6 N3 K( I
  67.   .text :
    1 x, G3 t" {5 u2 B+ H
  68.   {
    8 u, A, S/ K( ^9 Q
  69.     . = ALIGN(4);% w( x% g0 ^9 H  J, c! t* K
  70.     *(.text)           /* .text sections (code) */
    * H% q5 u' b, m8 Z6 v- K/ Z6 B
  71.     *(.text*)          /* .text* sections (code) */
    # \1 [6 F1 d8 i3 o( ]' ~
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    6 d4 C/ N' R8 P1 h2 D; V7 l
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    4 W* E. J6 w. X, T) z/ b
  74.     *(.glue_7)         /* glue arm to thumb code */
    8 S: t& z( M* i
  75.     *(.glue_7t)        /* glue thumb to arm code */
    7 o, ^) L" \% K! P
  76. + U$ Z5 k# T+ d8 r

  77. # {. q7 B* b4 Y% y
  78.     KEEP (*(.init))
    6 n5 V9 V1 w8 A  B
  79.     KEEP (*(.fini)). k6 Q* f' t( T

  80. 7 j1 Z& ?0 z  C

  81. . J9 e) D! i9 Z: C
  82.     . = ALIGN(4);* t+ L: a, D1 d" J
  83.     _etext = .;        /* define a global symbols at end of code */8 a$ _0 P$ Q# [
  84.   } >FLASH
    9 U! ]* n" k0 Y8 v0 h: Z6 Q

  85. # [2 b( d: Q. m; z5 c6 G$ C

  86. ( u% n( J1 w- E" ?7 J* B3 l6 V

  87. 4 \$ H$ o. J! {. b2 V8 O" @* @. v
  88. 5 R: H( ^  U: s( |1 v
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    1 E4 R. x5 V; [# n
  90.     .ARM : {& v; e* t/ K8 l
  91.     __exidx_start = .;7 D: T0 F; F* \
  92.       *(.ARM.exidx*)
    : p9 s! n- W' [
  93.       __exidx_end = .;
      C0 b1 L' `, d1 K7 r- O8 x
  94.     } >FLASH
    ) v% B/ Y2 z2 G, s2 W$ ~" v
  95. , X5 Y: D7 ^+ T* Z9 i

  96. ' g( ]) g) T& \) Y9 {3 M9 i
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    : B5 U. ~, y, u8 D
  98. % {% `- [, L, w" I

  99. # i. m$ e/ p, C( j
  100.   .preinit_array     :
    , _7 z  {# [. R7 E# A* J; t
  101.   {
    7 B0 ^' W6 f) `( s/ g! _" l
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    1 u2 V% _6 t5 [% Q7 Z- i
  103.     KEEP (*(.preinit_array*))  s. f: n, c0 N2 |" [
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);0 V2 _. d9 B' r
  105.   } >FLASH
    ' p6 Y. g0 ~' V8 Q+ n. N( G
  106.   .init_array :, U1 ^: w3 Z/ J0 t% A8 X
  107.   {9 D1 P( G+ @/ U8 K5 Z! t
  108.     PROVIDE_HIDDEN (__init_array_start = .);! Z" b9 y7 e3 U2 c' d$ n. h% \
  109.     KEEP (*(SORT(.init_array.*)))
    & N7 U( ]+ ~0 o% H6 _2 ]: U
  110.     KEEP (*(.init_array*))3 r1 j. c( x6 Q' T, g
  111.     PROVIDE_HIDDEN (__init_array_end = .);6 h0 w, Z9 v& i9 m* Z
  112.   } >FLASH
    % D- {! e$ w2 ~
  113.   .fini_array :, Y. M9 @+ S7 E0 |4 P# \
  114.   {
    7 y* g9 w" n8 h8 L, m' l( ^) Y
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
      B# G4 B8 j- j; z$ c: g: e& d
  116.     KEEP (*(.fini_array*))' u, g( @/ b0 i
  117.     KEEP (*(SORT(.fini_array.*)))* E' Y& j; B5 q* Q& R5 ^
  118.     PROVIDE_HIDDEN (__fini_array_end = .);
    - f& D8 L% _* |: W, Q( u
  119.   } >FLASH
    ) L+ g1 e1 i2 Q# ?. x$ ]4 w0 ]

  120. / u% a- x* a& s1 Z* ?6 h4 D
  121. 9 \% ]- G6 g; Z7 l4 ?; k% S
  122.   /* used by the startup to initialize data */; H" c/ q2 A3 j
  123.   _sidata = .;
    & v; W5 B6 f* }5 d% d) W
  124. 6 i2 E& K' L. C& P9 F, \- j

  125. 0 u. J/ S8 U( J7 t3 v3 g
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */
      q& m$ x% d) n2 F' _& L4 X
  127.   .data : AT ( _sidata ); n# K6 E5 D! d2 n0 R  h
  128.   {
    5 @8 `$ b3 T4 F+ `* N# Z6 d
  129.     . = ALIGN(4);
    ; q9 ^9 P/ d- C+ s
  130.     _sdata = .;        /* create a global symbol at data start */
    " w6 f0 M6 S: y0 u8 [& c
  131.     *(.data)           /* .data sections */
    " w  \* A5 Q- ^' I- R. ]' ]
  132.     *(.data*)          /* .data* sections */
    0 W8 F0 \$ m! L; d4 ]- _5 V- {7 M

  133. , ]- v$ ?" t3 m  i

  134. / C1 z& `+ U' r+ b& k" u6 a$ ^
  135.     . = ALIGN(4);
    2 X) U! B1 E" B7 F- [7 W
  136.     _edata = .;        /* define a global symbol at data end */
    8 B5 J$ u$ ^5 {2 U/ X4 q$ P# p
  137.   } >RAM+ E% V' S0 c/ M
  138. - f: }. {( @; \& ?& r/ s* F8 r# I5 Y
  139. ) W; @2 a0 O) s" m. ^; k5 [3 K
  140.   /* Uninitialized data section */: K; f4 K# h; b$ v: ?& z
  141.   . = ALIGN(4);8 K; F; F6 i  ]; Z
  142.   .bss :7 |7 _+ b/ d5 A' u; Y) C( U/ ^
  143.   {
    * Y/ c! i( B3 C, I: d. s& N2 G
  144.     /* This is used by the startup in order to initialize the .bss secion */
    . `; _9 A" G5 K
  145.     _sbss = .;         /* define a global symbol at bss start */
    " r2 R: q. |1 s. D  c+ `" i
  146.     __bss_start__ = _sbss;4 D  }* e- v  c" T" K& U: T, M
  147.     *(.bss)8 d) _6 o2 N  s1 Q$ {6 _8 l
  148.     *(.bss*)
    1 |, y0 b( o5 v
  149.     *(COMMON)
    5 Q+ W7 A) F5 E8 u1 |/ a

  150. 9 @  N, o; y7 K; c: K3 j$ U  d

  151. % k( Q8 z1 k7 l+ ~7 s% g) D* e
  152.     . = ALIGN(4);
    + p4 K% R% c3 |& i) t' j! i
  153.     _ebss = .;         /* define a global symbol at bss end */, @7 X3 y. R6 `, T
  154.     __bss_end__ = _ebss;& Y9 Q  D+ i7 U+ Y: }
  155.   } >RAM
    2 i& ~" w. ~+ i0 H* _; b) A
  156. + h' A; N$ A: f# {5 r+ D% E5 [
  157. , G: `* e) P, g
  158.   PROVIDE ( end = _ebss );, L% r  s; R7 P! k7 L5 y2 o+ l
  159.   PROVIDE ( _end = _ebss );% W! S$ [' U% h  X5 ^2 N- [0 Z- K
  160. " x7 b6 U+ V9 L6 h) O# J0 O$ o1 n
  161. ! i& H, u0 X' H' g
  162.   /* User_heap_stack section, used to check that there is enough RAM left */4 E% m+ k% @, o$ n, [& ?; v' m$ D
  163.   ._user_heap_stack :
    : {: i6 Y. W7 x& ~" t9 V
  164.   {# B- W# `8 W4 J" S( T
  165.     . = ALIGN(4);
    6 b% U+ f$ ^0 ?8 J/ O
  166.     . = . + _Min_Heap_Size;
    / C8 N4 h9 @+ l* k# k# u
  167.     . = . + _Min_Stack_Size;; Z  a' n- o! Z! c. D) i" M
  168.     . = ALIGN(4);
    ( o9 ?0 G& l& C- j! o7 l* q; K
  169.   } >RAM0 Y; ~! Q; M* E1 F: j. J
  170. 3 H/ h8 a; h1 a% [- R. T

  171. & o& C+ ^3 _3 E, i3 j* H
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */3 y* g- E# i. \6 b5 \4 |) }* V
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */: u5 m/ i- C, N- ]9 B5 ~+ r
  174.   .memory_b1_text :: Q' \' ^( e; [2 J) l% ]) M
  175.   {  R! `! @9 q% ^* w7 R% g) B
  176.     *(.mb1text)        /* .mb1text sections (code) */- ~( V0 D, Q! e9 T( ]* q' O  v$ G
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */7 r' Z3 H. {3 f5 Y: G  d
  178.     *(.mb1rodata)      /* read-only data (constants) */7 q, a7 |! L% r/ O
  179.     *(.mb1rodata*)5 m" x" ^$ O! H3 I0 d, Y  u
  180.   } >MEMORY_B1# `3 u! [+ M" o+ z; Z# p. U
  181. ( {8 |/ h2 @) g' r

  182. - Y" a3 @3 ]$ y- T8 p. G4 u
  183.   /* Remove information from the standard libraries */6 M' S/ L* ]& Z) J+ i
  184.   /DISCARD/ :2 B4 Z2 ^' K& ~2 N# ^! y, N( R, k
  185.   {* j' q" I2 Z' }$ U% _) v% e' M
  186.     libc.a ( * )
    / L- w( V% i9 l9 k
  187.     libm.a ( * )
    4 ~- c% X0 g8 X+ }/ E' ?% Z7 p
  188.     libgcc.a ( * )) v4 v# F/ {5 z1 k/ e
  189.   }7 |/ k- |$ z7 L$ M  T
  190. }
复制代码

' x! P  M, F1 W1 j" a* \
  • 最终目录文件如下; D; X6 O+ K; {0 ~  @
$ f1 e$ }; q6 Z- m* a# O$ \
微信图片_20240615160620.png ( `: [6 x+ {7 P8 O
5 Q; g! `7 |* M% T$ A8 B& \
2.在EIDE中使用标准库时的设置(无Makefile)
- G/ `0 S7 R! d2 Q$ B+ [$ Ia.切换到EIDE环境下
& Y/ s0 [# `" |- a0 [( K& v, n
微信图片_20240615160623.png , i1 J- r0 [; ]
7 U$ C( P9 {1 R9 {0 S
微信图片_20240615160627.png 3 ~6 q0 d0 D$ W' K! B- L' f8 _- q' z
; T# c; \1 r/ C3 a
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
3 X8 C/ Z  [- W5 A3 {0 t& T- `0 U! N
微信图片_20240615160629.png : E. H7 C1 M5 {
. [9 }! Z9 O; G* h* E9 U& M
微信图片_20240615160632.png ) s" y: r( Q9 K" @2 R: r
$ x! m* a! M4 i" ?( d/ S
微信图片_20240615160635.png
2 H( T- c) r. [2 E
4 g) j! f: e1 G( H文件目录如下:
- v; d; h& [5 J% n+ @! r
4 B8 h% j  w, p9 c
微信图片_20240615160638.png ' e, y4 V' q' I+ S7 j5 n$ n# ^/ t! t+ [
, q$ k) c2 U/ v  B
c.点击+号安装CMSIS芯片支持包+ B3 P; ?- U4 P( H

2 q2 i  w$ b# C# x' M' A
微信图片_20240615160641.png
8 X! k/ n: L0 L/ l$ p& [
' X" m7 \, d' \6 O1 S 微信图片_20240615160652.png
) Y. n# S3 [7 \! m$ q' O' P2 ?( ^" z
微信图片_20240615160656.png
) W7 j8 Q  u, I- k9 \8 \& N3 M/ ?) K6 Z

% [8 O/ \! B, a$ T8 D: Cd.修改构建配置为gcc
- p- x! N6 {5 i) ?
, U! ^( V6 V5 e* C
微信图片_20240615160659.png
% @9 h: g# @+ _6 m8 N1 P, ~7 g
0 |- g3 q! V0 \) H, A8 L' e2 j6 k2 r5 We.烧录配置为STLink/OpenOCD
( X3 f: S* @8 l9 i, v- P  U" v4 x& k9 W% `: x  y3 X
微信图片_20240615160704.png - _! v4 q! h" A9 x6 {! x& @' D

& g; o" p5 J( pf.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
4 h0 L/ X7 s% k9 m) Z2 j5 M- X6 b. x/ G/ a( b% Z! \# L
微信图片_20240615160707.png
+ R9 L0 g! t. v; |* d, p% |1 q7 e% e! f9 e
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义
% B5 p# s: G# V/ z0 A4 _+ J% o: I$ g/ g! ]
微信图片_20240615160710.png
3 O6 P8 T7 r& ~9 i% a" K# r, f( F4 w. v) M8 S1 H" }% U' e
h.此时编译可能会有下述报错  T9 q, O  F1 u3 M; q
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    # M/ C# j  d/ w% G
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

0 U( r, \. _3 S- _
5 I2 O) ]; b8 j- y: K  \# f
* n  D2 s; s1 k* y' J# a% i
打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)0 ?$ \8 j0 K9 s8 b# M' V* L
  2. {0 O0 }3 p1 _" W, [2 k
  3.    uint32_t result=0;
    % E) E  F, o& l0 s- x0 \6 Z$ _9 m

  4. 6 y+ q* T$ c5 n$ \
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );( f  R& J) o" g& @5 p
  6.    return(result);
    & q$ F- O9 O' Y1 i/ p. x: D6 [+ \
  7. }7 v8 \  Y0 K! b' u) e

  8. 0 d  X4 C: r: ^4 }) M
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)9 b, S7 g7 v" r' \8 Q) D
  10. {
    ( ?- b) [1 u# ?: t- |
  11.    uint32_t result=0;
    ) i9 a. N$ |2 O, G8 [
  12.   N9 ]) K( t* H5 E# c
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    , I# S8 |+ c0 U( h3 {, S
  14.    return(result);8 B+ A& {/ g! E3 a, K8 h# G
  15. }
复制代码

1 L) W' X/ O7 E* H- M2 g
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    ; R; G, X6 o$ O  E+ A2 [8 D
5 v1 w. j+ @9 ?6 Z! ?4 s
微信图片_20240615160713.png
$ I" K" P3 ?- @$ I. d, ]
  1. {
      s; k) t0 n* _& F
  2.     "configurations": [
    ) ~% {* j& h3 L1 `& t. s* h- h
  3.         {' \9 ~3 ^$ F7 L" s
  4.             "name": "Win32",. c6 Y9 F5 ?7 H9 n5 h2 \$ {
  5.             "includePath": [! J6 C: ~* Q# |4 }" X
  6.                 "${workspaceFolder}/**",/ Z5 T0 U+ Y0 q6 r
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",  z" M: g6 N  G9 O+ f4 P1 S
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    % ?! I+ j  q3 {2 ^1 v; ]& Q
  9.                 "${workspaceFolder}/CORE"+ Q+ o2 P: O; G8 \) J5 a3 ~. Y' U
  10.             ],* z- U2 Z" [7 g; n& h( R
  11.             "defines": [# l/ R* d! V2 `% R7 ^5 k* A1 \* u
  12.                 "_DEBUG",0 h+ g* M" }' P0 Z
  13.                 "UNICODE",# ]! _+ Q  b$ Z; k
  14.                 "_UNICODE",+ ^. F' M, A3 S+ Z
  15.                 "STM32F10X_MD",
    , g+ g: Z) e# }1 f% ~8 s
  16.                 "USE_STDPERIPH_DRIVER",% {. c5 A6 b( ]( _" H) f0 m
  17.                 "__CC_ARM"% b  E) B4 S& g* ^7 W
  18.             ],
    : i& C" c& H+ B( }# n
  19.             "cStandard": "c99"2 `* B3 @1 z3 X: V) \7 l
  20.         }
    ) d* Q7 q. T2 R3 Z4 G
  21.     ],2 u1 ~+ e, k; o7 l: Q8 Y
  22.     "version": 4
    : {1 n7 F: ~9 W  u- c

  23. $ @+ o: F- M  O
复制代码
- T0 U; A9 h8 O" R
3.编译工程* }% u- l7 `7 v( u) _, ~5 c- X
1 `0 H1 `1 |& N6 Q- s
4.一些问题的处理:
$ t% A" [5 @6 {a.编译成功,但下载后没有任何反应。' r& r' _& R1 O1 P" L
注意检查stm32_flash.ld文件内容
' D0 U7 W7 q! s4 X) g( A4 G6 K* r
  1. /* Highest address of the user mode stack */
    ( L9 b: p6 ~) b
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

2 K0 o/ D) P& U2 N9 C- S9 V注意对应芯片型号" p' o% Z. i. F- Q$ d! g
  1. /* Specify the memory areas */
    ' I1 t6 n& [' H* q! s2 ^
  2. MEMORY
    + ^- {9 w3 q, y% t" L4 S
  3. {
    6 s! q' w+ f5 `! S( T3 p: l
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K5 ?. m5 s* }) S. E
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    # @0 R. J- H0 c! u( k" {
  6. }
复制代码

8 l* K* ~# o  k8 o5 j6 m7 bb.vscode提交(commit)代码时卡住
) O$ t# f$ D( F& r
$ }5 e" I. Z: a* b5 s
微信图片_20240615160715.png
7 y& E, z# [' ^) T3 ^8 N3 x# l5 X3 J$ i$ U& S
微信图片_20240615160718.png
5 r. Q$ H& q" v/ \7 i* w# Q+ v2 _% ?/ k& \: I
微信图片_20240615160722.png " B2 \% P4 e: S

7 O; e$ e1 o# {, C设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。& j1 ^9 R, P& D* _$ M, e

% K# [# l+ B. M5 G+ Yc.结束1 h; o6 I; S, q$ d( c/ K; s
/ ~6 _& m5 U: k5 u! r2 W
5.调试工程
! R& j+ N9 Q! D! f' q8 Ma.添加launch.json& ]2 b3 A: S1 R; _" t3 f
进入一个C文件,点击右上角按钮生成launch.json
* R' {! ?1 ?5 Q. z( Q( k$ D
2 n& Z7 X5 A  t" }! B. ^
微信图片_20240615160726.png
+ d  _  J# @" M0 A1 L1 @  O  |$ k

- E5 e$ J* [, ^) ^& ]b.修改launch.json为下述内容
6 h( e# d$ @( `" F
  1. {
    7 q& I' p# |: b
  2.     // 使用 IntelliSense 了解相关属性。9 P/ {+ _# n, G0 X* C/ O- G$ @
  3.     // 悬停以查看现有属性的描述。
    5 G+ S, f6 h& ~8 N/ v  t* T
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387" k( M3 [# ^, o4 x8 d+ D
  5.     "version": "0.2.0",+ G" c) n4 w9 z" e
  6.     "configurations": [
    ( u4 ^+ Y- U! g2 q
  7.         {6 L7 B9 Y) G" l: G; G
  8.             "name": "Cortex Debug",0 d' V- O& ]+ e+ Z
  9.             "cwd": "${workspaceRoot}",  // 输出路径+ z4 y( p5 }$ p5 e! _( {
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序
    1 r( b, }! F) g1 S
  11.             "request": "launch",
    ! B0 [2 r# @. x- y
  12.             "type": "cortex-debug",. @2 z. s: G$ v% D9 P2 p: G" m
  13.             "servertype": "openocd",    // 调试器选择1 y4 N$ |! @' ~+ z% Z# V: v6 z% R
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    3 J  j! f5 c- h1 I
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    2 s) t3 T3 u7 O/ b1 ]- f
  16.             "interface": "swd",
    7 P  R  Y" U' V
  17.             "configFiles": [) O' M1 {6 F1 h( L
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    7 X: P2 a: v5 q( Y9 f4 ^9 ~& m0 w
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",- w' g' ]* M/ h$ _( o
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"- Y) v* N) E8 l7 `% Q! z
  21.             ],  f+ d4 i# w$ g7 U; B6 u4 k
  22.             "runToEntryPoint": "false",1 u' R! P# r  i1 L0 W2 s( m
  23.             //"runToMain": false,) g" T4 X& @; W3 @! x
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的; a' J7 u! m4 m# M6 \  M$ L/ w
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径2 d! A" g0 w2 v2 J. K
  26.         }
    9 `' ?/ k( [8 d- A
  27. + p9 C( Z# R7 Y: V. D8 A
  28. }
复制代码
0 b$ v' ^) y; ~3 Y2 q+ X  n# L; e
上述最重要的是引入openocd的路径。& c! x$ c5 {4 h
6 I  e) @, p$ q

  K* G- t8 D- F* S, Ac.点击播放按钮进行调试
5 E$ ^$ H: g# U) g* _! p! w
) l) h' U: |/ o6 S
微信图片_20240615160729.png * ^% w. v# s# }+ ?: X

8 Z$ K3 b' o1 H8 W  X+ q' \6.结束/ F1 s9 y0 a7 O3 `/ _, q& l, A
. J  a% Z1 N( ?) k4 j* }4 b) }
( Q7 J" \( m7 B- ^0 \" d
- ]( F  s3 C) @: Z, s" ]
转载自: kevin
( o: k. b8 Q3 j* @8 H7 h2 g; C3 b如有侵权请联系删除% C9 h" f/ {" _' f
: f; A! J# _2 P3 I7 U: H! H
) [* F' d9 n1 N! c/ _# r
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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