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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”/ V0 g9 Y( Q6 @$ D: G1 Q" L; o
# Y# f$ V" c6 M) u. A
微信图片_20240615160241.png
/ ^% @$ U; k5 [1 Q5 d6 r! f; K* G7 S
1.VSCode安装与配置( {# y( h0 f; s# p. x
a.卸载
+ r0 L& @+ v$ E  Z) a2 v4 J' Ub.安装
0 b8 h" X6 m  Q- r/ L9 q1 w# uc.git安装与配置
6 \7 K0 U- O% R/ ^6 t3 ~7 @d.安装插件- V- R$ M, b- B: C5 J( g
1 `1 j/ ]- Z/ A# {

0 u+ X/ L* f" d  }3 k4 L1 X- x2.Embedded IDE配置& E& y8 C- H9 T0 l$ n
a.安装EIDE插件: p3 x7 _. Y9 ?* M8 E% s2 v
b.安装实用工具到EIDE0 G8 m; g: i+ P4 v$ W
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools# b/ Q+ [7 b0 O; r2 R0 h' X+ \
3.Embedded IDE项目建立-stm32标准库
/ v" I9 L' h9 ?' L% v" A* I$ i: [a.工程项目建立3 A/ \$ G& Y8 y
b.在EIDE中使用标准库时的设置(无Makefile)( b# d1 i* {% w2 X0 e0 N
c.编译工程
. Q* X9 d8 w  W. X, J
, x" K" Q' u; X: n1 P
4.一些问题的处理:
, h% k6 H. A# Z# I0 T" i% f0 |2 H5.调试工程+ ]4 V9 G% Q$ C

6 i2 y( {! w" _01VSCode安装与配置% L% A+ o7 I0 ~% r, o6 x
1.完全卸载之前安装过的VSCode
/ z" m! C- f+ l/ ~1 `  J- ]$ V5 Qa.卸载软件' n& ~3 B1 `% S  C5 a
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。/ }/ J$ V: N& g  p) F- A% F3 n, ~: u
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。
: x; b* U6 }  K2 L8 g# I5 C+ u9 W8 \. j2 {
2.下载安装vscode8 f6 u, U4 `% E" I

; f+ y- K4 N8 m9 \* R
3.git安装与配置
; {1 u* i, r  \8 Y安装git
; P  S9 T; f- F3 u6 e
9 F) a0 R, a! e+ E1 i  v% I7 h
微信图片_20240615160248.png 0 f2 u4 u4 W) {6 D& C  v" H# K4 |
, F0 B& P4 L& H. r9 G
安装完成后,在开始菜单中找到并打开Git Bash# ~: E) P- y9 o/ l8 P) @2 M

; R8 `6 I: E- s$ a* D6 G
微信图片_20240615160250.png 4 D2 `  k2 L( n
; F) c7 ^$ a, d! @( J7 h/ ~0 b
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git" S( U( t/ l2 A7 L. Z  `
8 q, h% T. W: l' K$ k+ h
微信图片_20240615160253.png ! S# {! R$ P1 a+ t: d/ E

: U' B/ E4 X4 J+ R, Z5 w7 H在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' / a  s) P' K! f
  2. git config --global user.email 'ct15762287606@outlook.com'
    ) T! z% P- p6 L. L8 |
  3. //检查当前仓库状态# T! o+ \- `! w& P8 s3 V, _
  4. git status: I. x  ]5 l. }9 [! w) q: E8 L& V
  5. //确认git配置0 k7 O( P1 Y& z! P9 I9 z
  6. git config user.name) Q: ~6 v5 M: b: c
  7. git config user.email, k6 w2 ~# }( {4 W. K
  8. //查看错误信息$ ~- }6 L- g9 J# Y3 F7 J
  9. git commit -v' d+ |. X" e" s& e3 ?6 d
  10. //清理缓存
      t. I2 y9 J0 c4 \1 X* j
  11. git rm -r --cached .
    ) F! ^* @, }* z* J5 X
  12. git add .
    $ y0 R& V/ A0 `4 T3 y& G/ `
  13. git commit -m "Your commit message"
复制代码
+ ?# V( P( W' n7 I3 q
微信图片_20240615160255.png $ C. o2 Q/ U- H% f2 F3 F1 z
. V6 k% {# f$ A; x8 u* _- v" r
4.安装插件,如下图:
# D2 q: F# T7 t- Z+ H! O; K: T) w. I
微信图片_20240615160258.jpg 8 L: I, c' T7 r, f
! [/ G, y3 \9 ]% N. B
微信图片_20240615160301.png
" ^( e  \. ?* W# v  L2 ]# }
0 V# D  W# ?( G
微信图片_20240615160303.png
+ j& w" N7 R+ K0 h* s" H  J9 M% S$ v/ g) I1 |) G
微信图片_20240615160306.png
) s) `4 ~, G$ ^- k  R. H9 I& M# a. U( N' P$ ?
微信图片_20240615160309.png 3 Z, n4 M4 n& W3 d
7 A; |3 B, t5 [. O( e; a
微信图片_20240615160312.png
7 y7 N3 a) b5 Q' o) [4 f, d- q1 p' s3 \
微信图片_20240615160317.png ) n6 O4 S+ y4 W8 h
. M* h# t0 l& t( R- @1 L' u/ M
微信图片_20240615160320.png
! [* s6 L' k6 o; o! h3 z6 v, [, _! q' ]4 k+ Z" b' i
微信图片_20240615160322.png 2 x- Q+ r( D7 b2 u  q( @
% g7 C; A- y& f7 G
微信图片_20240615160325.png
; s  E+ C& t% W. p; }
/ ]; e0 X( m. a) q: y! K9 U 微信图片_20240615160328.png
# s# P" E: j# x0 p5 u5 _. z* g5 m* Q8 J
, }; S* U# @" i) v  @! w) P0 U5 c7 } 微信图片_20240615160331.png 1 {. y5 g' Q0 }7 s9 L: u% \- r, k  o! o

8 ?9 [- {0 q3 \ 微信图片_20240615160334.png   R. t* `* W1 |& G, L* U

, q1 [; ^: `5 J  \$ K( X4 b 微信图片_20240615160337.png
1 r1 O- L' S& z/ `' W, y& b' Z; N6 o+ y6 U
微信图片_20240615160341.png
, ]* Q  Q( P* I
# S8 m2 g5 K  [5 R* P: r7 j 微信图片_20240615160344.png % _: y) `7 R& `" n# [9 W3 C1 ~  I7 b
9 i$ a6 Y* V' W* N5 m/ _+ R$ P
微信图片_20240615160347.png ' r& t6 e/ \9 N5 f
$ U( K! z3 V3 y: |$ \
微信图片_20240615160349.png ; f$ y/ {; T: r; P) h9 D0 u
; q2 C4 q5 Z& k4 o# O$ `9 a- K9 X
微信图片_20240615160404.png
6 h& l8 x+ m. e/ u
: U  l# W  g( y& g( V* u' B02Embedded IDE配置
/ j* U" f7 Q5 G4 U; e1 E1.安装EIDE插件到VS Code
& B4 L. q, H- X4 ~2 ?2.安装实用工具到EIDE环境
1 I/ O0 s9 C, q. e+ I1 Ua.安装arm-none-embed-gcc工具链
- K4 C( p  T: o6 K8 M) ]& J) O. f( r7 g: v9 V# E
微信图片_20240615160533.png / N# r$ R0 ?/ B+ _) H- ?
% B$ `2 w6 f, J9 H: D7 L
b.添加其bin文件夹到环境变量
) H' \, t9 Y3 Q/ l' W$ F; S( q
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址1 s& i; F" V* K

! r" z7 m: R, @7 ^. l# f
微信图片_20240615160536.png - C  V+ Q8 _1 e. F

4 T0 z- Z- m4 W4 U 微信图片_20240615160540.png
4 K: n4 A# x7 v/ z

* @* k' z0 H$ g1 ^: k" r2 ?+ t在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试0 x& j, s5 Q. {3 p$ y6 \) p% y
7 O% y8 m# l# H+ q2 G
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

+ |0 _+ s4 T! x" ^# }c.安装OpenOCD
' Q  p3 l# s5 q  h1 s% Y- t
  T* {! C' }- ]' _* H7 ^2 _3 c

% W9 X+ J9 i2 q- R& g
$ ^' B+ t. V+ }d.在vscode中安装Makefile Tools
0 A/ V$ _. E! F9 r  m* H! w
& [* I+ ~0 t( o  Q, m% j6 |/ u
微信图片_20240615160554.png # W5 Z; E4 Q+ L  T

) {; j1 X6 g' |6 w
  • 找到该工具的安装目录9 t8 [; c* Q  v9 @! f

# H' S5 g% C9 B% p8 c- t
微信图片_20240615160557.png " B: c2 g* s$ y, l3 f' Z# ^

; D9 J6 `  e& a, |  x1 B& _
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常0 R3 Q* f$ i+ T% F
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v
    0 K& i) s; i( v/ e  I4 t
  2. GNU Make 3.81
    ' {, D$ A% w6 Y3 z; g
  3. Copyright (C) 2006  Free Software Foundation, Inc.4 ]! m7 ]7 H. s. K
  4. This is free software; see the source for copying conditions.% a" X7 M! z, p( x
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A  s- P# V* A0 j0 z: W7 `7 |
  6. PARTICULAR PURPOSE.5 l8 o2 t. j5 b2 ?# U1 N4 ^
  7. 0 S+ t- c* P% t( ~
  8.   B' g3 J" n4 i' ]4 }
  9. This program built for i686-pc-msys
复制代码

5 f* |* n& ]" k, X' r03Embedded IDE项目建立-stm32标准库/ A" b8 `8 y/ O
1.工程项目建立2 k2 ?, y3 e3 i8 I7 S4 L$ {- J. A
a.切换到EIDE环境,点击操作-新建项目-空项目图片* B8 q! l  p& N' U/ T7 \# ?' G8 N
9 `! h5 N6 [) P
微信图片_20240615160602.png
& \" P1 w7 g( h# d2 ^% J" R, q
/ h& \' S1 u. r7 c: I4 wb.选择一个合适的MCU项目类型,如Cortex-M项目
$ b+ H2 z. H7 V! @1 p& C
0 n4 m4 M- r9 E' e7 @0 K! O" r
微信图片_20240615160605.png
/ l- }* B: v$ g/ M
: M) [6 T1 N- p3 P+ u* nc.点击右下角继续,跳转到工作区& d+ i7 H1 V5 D6 U4 C( l3 d

. ~. l- O( G1 l  n; A, V' J* j 微信图片_20240615160608.png
% n' [+ ]0 Y7 O: V4 s

3 c, j+ o* q; X2 _, o# A# g9 Sd.添加工程文件到工作区路径下。——标准库
5 c1 Y# W* K; j9 I! K: C2 h' G8 U
$ C; i5 Y! j4 z$ t& N- P+ ~! L! O6 \7 S3 u/ \
微信图片_20240615160612.png
' [& t. K1 r* i% ^( V0 d/ _7 M6 M, R. Y- M
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    8 E; u( d% h+ i) S
4 w% H+ g7 o1 S' B- B
  • 新建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文件。
    $ t/ k5 D9 x' \6 x. t% s; W, k
, u+ P% f$ L2 p+ T
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    6 z0 i, l- I4 i( [. X8 n: W

% P# y1 \& J* u5 _# v2 W$ U; W1 t5 O
8 O; @( \- e: {
& I7 y' D( L. z
微信图片_20240615160615.png
3 e+ h& g3 i5 A8 O7 R# V2 ^( q
1 u3 K9 Q& a, r; ^5 i8 r/ ~; V
stm32_flash.ld8 B- P! C% S/ ?. S3 \0 a
  1. /*
    . B3 ]0 C' A; F( ~& r
  2. *****************************************************************************3 k3 l. u) i8 Z- M' {9 N
  3. **4 v9 m3 s% s3 |$ a
  4. **  File        : stm32_flash.ld& l" S) ?8 I! I$ {
  5. **
    - t6 j2 G- \- _2 g1 ]0 R. E5 h3 c7 W
  6. **  Abstract    : Linker script for STM32F107VC Device with
    1 k$ n3 ]5 y2 K
  7. **                256KByte FLASH, 64KByte RAM
    1 U, u% Y0 W6 ]
  8. **
    " I6 j9 e. J% q. s# c* [% t; l
  9. **                Set heap size, stack size and stack location according5 ?, W5 a5 e# y& g
  10. **                to application requirements.
    2 k* y, m0 d0 B
  11. **
    . q3 X/ v2 x, S! c7 n9 H2 f
  12. **                Set memory bank area and size if external memory is used.& [9 K2 u, y! {$ G: h1 P1 v
  13. **
    - C. k1 z. b+ c0 `9 h
  14. **  Target      : STMicroelectronics STM32
    6 Z8 B6 w' B. G, L9 v
  15. **
    - V- e& ]0 P* }- y2 v1 a
  16. **  Environment : Atollic TrueSTUDIO(R)
    9 v6 X3 @0 C! y/ X& t
  17. **9 p3 s( q9 U4 t8 p& r
  18. **  Distribution: The file is distributed �as is,� without any warranty
    6 @7 \* ~; Q! `; B" O- C
  19. **                of any kind.
    4 }, d  V9 T( M3 C
  20. **% @  B+ _" F2 O, V- L' x0 f! u+ ?
  21. **  (c)Copyright Atollic AB.% K8 a7 w! D. R
  22. **  You may use this file as-is or modify it according to the needs of your
    / A' ?. Y7 a/ [. J
  23. **  project. Distribution of this file (unmodified or modified) is not
    , R/ M: H$ C, S7 \8 m
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    1 P/ _) [$ v: U1 h; s
  25. **  rights to distribute the assembled, compiled & linked contents of this
      S" j+ y/ j0 K  l5 _0 e% E
  26. **  file as part of an application binary file, provided that it is built
    - F- p* S9 |4 c9 c& {5 @
  27. **  using the Atollic TrueSTUDIO(R) toolchain.! b; S2 [# g: o' y
  28. **
    : H& q. \* ?4 W9 p6 Q: y8 U; R( H
  29. *****************************************************************************! q+ u" H, S( A! v
  30. */7 l$ S6 [6 H3 T! X; ~% `5 z& Q" g
  31. ) _+ y) e) |7 w
  32. " L+ q& E1 C4 N
  33. /* Entry Point */
    $ P6 {2 l* C) L+ p) r+ ]7 |
  34. ENTRY(Reset_Handler)
    : K' z9 N: Q5 i! N! X
  35. + B$ D, T  A7 w2 \& I+ |

  36. % P4 L8 C) V1 a( L
  37. /* Highest address of the user mode stack */
    ; B/ B( H3 R' n/ v/ J
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    ! U' B* x4 W: R6 v/ ^1 O

  39. 9 ?4 ^7 r) N5 y! k4 L6 }6 Y4 P- T

  40. * h7 x1 ^/ C/ w, ]- k! p* H
  41. /* Generate a link error if heap and stack don't fit into RAM */
    & B* f1 I$ b* ]+ ~4 M9 L5 l
  42. _Min_Heap_Size = 0;      /* required amount of heap  */& h$ J* L6 \: X
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    : L$ Y, g  B' w7 f1 u0 T0 S
  44. * ~* {% A; p4 a# c9 T
  45. ; Q9 V  e) p' Q
  46. /* Specify the memory areas */
    % l, u( T- s/ F6 c) q" y' Q
  47. MEMORY& ^4 M  J# `/ l- c, p3 d1 h( h
  48. {
    ( S; H' M1 A* y" W4 b
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K/ N7 m! T( m7 C9 G; l
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K( @9 I# ]+ o5 F" {$ h( C5 s
  51. }
    ; Z' r. [( n5 Y
  52. ! J1 N% l: N* O$ `. i7 S

  53. ) T( x5 Z% t% |& V  O! O. ]
  54. /* Define output sections */% K6 h2 ^% E/ x7 N' k
  55. SECTIONS
    . y7 w' t: f$ J2 u0 D
  56. {; g9 \% ?$ t8 f& C" D8 O
  57.   /* The startup code goes first into FLASH */, J. O) k" J' I, B5 i) n
  58.   .isr_vector :
    % m4 W1 p! _/ G  u0 z/ o
  59.   {9 Y$ b1 C( Y5 Z4 M$ ^5 f2 B! ^
  60.     . = ALIGN(4);
    ) ]9 v) x! l( W! B' A6 @/ S' i' h
  61.     KEEP(*(.isr_vector)) /* Startup code */
    / P- [( J, k8 |- m& a
  62.     . = ALIGN(4);
    * G  T. V; T2 i+ K
  63.   } >FLASH5 n, K, d; R) _: R
  64. 9 {' D4 o+ Z$ H. S3 _

  65. 9 |1 i6 @' g0 @1 k4 W/ N7 a! [
  66.   /* The program code and other data goes into FLASH */' o) M3 I6 L2 R4 L% J
  67.   .text :' i: Y% g; d7 o( ?& l7 ?
  68.   {
    ; [/ s6 L7 z" b/ _$ A
  69.     . = ALIGN(4);7 \8 V4 H# C: J
  70.     *(.text)           /* .text sections (code) */
    - u( u% {, l: N8 \
  71.     *(.text*)          /* .text* sections (code) */
    * M7 Y2 v: ~5 Q+ Y3 _
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    6 q% w$ H4 L0 o. W' v( `. F! a2 p
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */1 w+ z& R6 d0 a6 Q9 g* i9 X
  74.     *(.glue_7)         /* glue arm to thumb code */
    0 v9 W$ `1 X6 J2 ?/ u
  75.     *(.glue_7t)        /* glue thumb to arm code */
    " O% h9 [5 {. }5 k3 b

  76. 3 t3 P# l7 }0 s: U
  77. 4 p+ E7 n# k+ g
  78.     KEEP (*(.init))
    - q4 q! I4 d$ }. v
  79.     KEEP (*(.fini))
    5 r5 H  ?3 T; ]6 |/ V" B0 k# [
  80. & V* G' I' W8 m0 _$ @  ~
  81. ' O5 u9 p* ]$ r6 M& L9 a# s
  82.     . = ALIGN(4);
    ! h  Z7 F1 a9 c/ E, V
  83.     _etext = .;        /* define a global symbols at end of code */
    : u0 K: O# M- E0 D, e' r
  84.   } >FLASH
      M; T' K+ g' z9 p, }6 M2 H5 B

  85. # H5 l$ ]3 F7 t5 E0 w

  86. 1 ?" }& j3 P; h

  87. ) i5 j% K# h) s- F8 c+ d

  88. ; z4 q/ A' T* Z9 k( ^* w% F# n
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH5 N  A5 N: y* R6 Z: G' p' z% L# X( h% ?
  90.     .ARM : {1 |- N6 j3 P! ?. M  r
  91.     __exidx_start = .;5 O% _$ S! N5 `8 x9 ?
  92.       *(.ARM.exidx*)
    ; u1 ^! G0 Y2 n2 X( r+ ~
  93.       __exidx_end = .;
    ) U: U( |+ r# [& z  B: H
  94.     } >FLASH8 P7 X* o2 R: V  I% p% x$ n. x
  95. 8 ?+ U3 U" r4 r5 }( p
  96. " c) Y$ d& W2 `& S; R3 m* Q
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH/ l* [3 _+ e: s5 i) m. N+ y$ C

  98. $ C% L2 u5 P: d2 w) B

  99. . x+ p& _2 D7 R  k! Y7 T
  100.   .preinit_array     :
    " t8 F5 Z5 s: E  d. k9 E; ?0 S
  101.   {
    6 ?! |5 i9 ~+ v+ i) {' b( `1 T, P/ o4 ~
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    " V/ I/ u; j# u, i
  103.     KEEP (*(.preinit_array*))
    ; s( d' |1 K$ i5 k2 H- T- ~) }' ?
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    0 o0 h9 h4 {5 g  D3 }! t
  105.   } >FLASH) |( _5 K- E- }
  106.   .init_array :: u# U1 _5 c& ^$ a: i9 _! A1 E, W% H
  107.   {
    3 U. U0 `6 z0 g7 e% E  _
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    ! I) B8 q" ]  d
  109.     KEEP (*(SORT(.init_array.*)))- V6 V+ q% X( h. q0 Q
  110.     KEEP (*(.init_array*))
    $ a( f( N6 d. L& R8 a
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    . o9 g, {; f! ~; r1 G8 q7 N7 d/ Z) d2 W
  112.   } >FLASH7 I' x* W# I: }/ X. v' ?4 \
  113.   .fini_array :2 `' V# Y, e' o7 D( W7 a+ |
  114.   {
    - M/ @5 |# d. R! v
  115.     PROVIDE_HIDDEN (__fini_array_start = .);: o$ `! ~% Q" D. U" w3 V
  116.     KEEP (*(.fini_array*))( ~% Z' ?( J, k' g  m% X
  117.     KEEP (*(SORT(.fini_array.*)))$ I" B' c, i; @1 f7 `4 ~. P
  118.     PROVIDE_HIDDEN (__fini_array_end = .);* s; F# m: @: ~6 _5 d
  119.   } >FLASH
    % ]9 g8 h9 R! F5 ]8 P/ j# w
  120. 6 y: ?2 R7 Z5 g* P  \

  121. . W' q7 m% E( q2 u/ r8 R
  122.   /* used by the startup to initialize data */, R8 V. j- B  P6 h
  123.   _sidata = .;+ Z5 _& W# M+ N% k8 V+ k5 W

  124. " y# t* p% k" ^6 |6 I

  125. 5 O$ l8 g3 d, b* P! X
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */9 a( E" h; J% e0 D, S0 o
  127.   .data : AT ( _sidata )* c9 X" N) r* @2 e: n  Y# m
  128.   {
    3 p! H; W! K- n) k& X- z% W. }
  129.     . = ALIGN(4);' ]5 i: {) i* V2 w. @
  130.     _sdata = .;        /* create a global symbol at data start *// D9 c" W5 d: K1 S' M7 Y
  131.     *(.data)           /* .data sections */
    7 [# A6 n& c: \% r4 ~6 I
  132.     *(.data*)          /* .data* sections */( n0 w( }3 P) _6 a% s
  133. : X3 @+ q* a8 @" U! L5 c

  134. * K% G* e4 Z' H* h3 w9 @9 e
  135.     . = ALIGN(4);
    2 h; d! U) s, \8 [- f9 d3 O) {
  136.     _edata = .;        /* define a global symbol at data end */4 F8 u) m' b+ t  t) ?
  137.   } >RAM" d' a8 ?' V! S' _7 [; o* I

  138. 5 T# W$ S2 e6 g9 b+ f

  139. 1 X3 j( v- N- J& E; ?
  140.   /* Uninitialized data section */- ~# U% m6 a, b( X& v+ L$ n. j  k2 ?
  141.   . = ALIGN(4);
    ) M# }6 I- L( n& V8 f0 R8 M) B) R
  142.   .bss :
    / s) C8 [# ^. g
  143.   {
    - f) V, L  _( d$ \" ~& A1 `
  144.     /* This is used by the startup in order to initialize the .bss secion */
    : E) S7 S& ~5 N' X
  145.     _sbss = .;         /* define a global symbol at bss start */
    3 l3 E- y& B$ U6 V- R! r( c# R
  146.     __bss_start__ = _sbss;
    " Y) G; a" m9 P
  147.     *(.bss)# @! f0 e- q# @4 I6 f8 W  e; ^
  148.     *(.bss*)" z0 A1 z; l, X$ i# B
  149.     *(COMMON)0 W: X/ o$ B+ d2 r
  150. + S. R$ j/ D8 b/ t! h0 t: E# t
  151. . x# m. G: K% C% d0 J* }0 j; v0 q
  152.     . = ALIGN(4);
    . R; p! ]) \4 g  ?# p5 A5 H
  153.     _ebss = .;         /* define a global symbol at bss end */- `) C" \, [9 {9 ~
  154.     __bss_end__ = _ebss;
    0 A' g+ O. h1 I6 P
  155.   } >RAM
    + k  p# a0 F0 i' {/ @: l* h: R' t! Z
  156. * G/ g3 p$ [% |0 t* g

  157. " P$ D7 _& p, X) s  F! U3 h4 g8 e9 _
  158.   PROVIDE ( end = _ebss );! f- }* _+ |0 ~2 i' D2 w& C
  159.   PROVIDE ( _end = _ebss );
    $ j' ~# a: P- i. n) H1 _
  160. ; y' H, ^* P8 K- f" [5 v

  161. $ l( _; l9 y/ v7 u1 i
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    ) I0 ]5 Q6 |" y6 O
  163.   ._user_heap_stack :
    & o9 U  h( d3 x
  164.   {
    8 u5 }4 F: M5 I8 k8 e
  165.     . = ALIGN(4);. D6 @5 R$ F. T3 C# c% I8 I, V
  166.     . = . + _Min_Heap_Size;0 {% I4 [, o7 P$ w
  167.     . = . + _Min_Stack_Size;$ ~; _! D4 v; o' m+ f
  168.     . = ALIGN(4);
    - T  _4 d( W% E! m
  169.   } >RAM: s0 q( z8 {! V+ Z( D; R

  170. 7 \& H9 O0 w0 @  @& X
  171. ( O$ l; S0 {: ]+ X- Q: |  N* `
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */! _1 D, p/ q) B( @4 O, L; [5 }
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */! |6 Y/ Z( I* @# o( V( m7 T$ o
  174.   .memory_b1_text :$ f' p  q& L- ?, C, f# y  B
  175.   {7 d( ]6 C$ y8 C* a" W% u
  176.     *(.mb1text)        /* .mb1text sections (code) */: o. m( q# P, m! P5 g
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */
    / F# m: W+ g  i
  178.     *(.mb1rodata)      /* read-only data (constants) */' y9 W! i* C% i1 F
  179.     *(.mb1rodata*)0 F, X4 ^6 a$ c' ]4 i% v  r; {
  180.   } >MEMORY_B1( S# u* |, V* @. x
  181. 5 y! k5 R* G8 @$ J7 t9 C: p
  182. 8 E5 j) N' U  b9 \" G: Z
  183.   /* Remove information from the standard libraries */
    ) V+ ?0 v5 [) f# j1 b- j7 h
  184.   /DISCARD/ :
    , r  l  _/ @3 g% I: ]8 O
  185.   {& H% q" f6 U( Q3 i& U" w* H
  186.     libc.a ( * )+ n# S1 u, T7 [4 q. S0 e6 O8 d
  187.     libm.a ( * )4 P* `  M+ V# N: Q' {1 P
  188.     libgcc.a ( * )
    ; {3 y% J3 A' ^/ _( F' }1 q, \
  189.   }3 Y9 ~& L3 L& k* z# L' b2 F1 Z4 F
  190. }
复制代码
$ S; ^  P& N! r' v
  • 最终目录文件如下7 S# j' L3 R1 m' w( O/ t7 n9 X9 A$ q
6 A% Q# t. M  S6 X
微信图片_20240615160620.png 2 e# Z9 R: I8 c/ l- ~7 R' D! N
5 h; q1 L# y4 w. x6 }& H
2.在EIDE中使用标准库时的设置(无Makefile)
3 ~0 L' l- w+ P% n( T4 fa.切换到EIDE环境下& Q. v9 c& v6 [% }* v9 P6 ~8 a

% x2 s" K9 [4 I6 q0 |- N
微信图片_20240615160623.png 4 w* ~3 q2 q& o% R8 z1 d$ X

  ^8 D! f8 N' I3 Q 微信图片_20240615160627.png
0 Y0 I$ b" i( B7 [
. j* w7 k9 q) e3 z2 g4 h" o
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹, h: v* F! L' i& d% V2 X- r

9 j6 c6 T7 Q+ B* V+ ]
微信图片_20240615160629.png 3 B4 W( Z% }  ^, r" a" V: B

, _% S- _  l% o/ P$ z+ x# R 微信图片_20240615160632.png * i) a7 z, D6 l$ `7 ~+ ?/ V6 Y
8 @0 K/ L1 C* o+ V5 C
微信图片_20240615160635.png
  d; I* u8 }( I4 ^3 E: q8 S" b2 m) o/ f. B& K" b
文件目录如下:
& U6 z% {. g, R& H
0 e. ]6 }& U9 _- K) @% |' ^
微信图片_20240615160638.png 4 L- s( a) H5 V, v8 w
8 J5 m) R! ^( C& m; G
c.点击+号安装CMSIS芯片支持包
& Y: F+ ?9 N* n8 H& \* w' p( A. ?
) Z8 C* D6 |/ d% G/ Z
微信图片_20240615160641.png 5 G$ t$ B/ A- f# ]" W; m0 }/ D) w
0 A# i0 L! x0 `8 N3 l
微信图片_20240615160652.png * d3 k2 k3 I0 }2 k+ @! G
3 F! ^' \0 _8 E6 U
微信图片_20240615160656.png
% f+ x. Y4 s. p/ i

2 p0 c  ^8 u4 P# p3 z6 c* ]d.修改构建配置为gcc/ d) I9 R* O1 R) M

; y" a/ y5 S. f
微信图片_20240615160659.png
; P, S- z7 u* g5 t( |* N9 p  d$ T, @9 G/ A
e.烧录配置为STLink/OpenOCD5 X% [" M6 y  _" L$ P

% J: G% r& t& a4 e( g0 p* I* c
微信图片_20240615160704.png - V% e5 @7 w1 c% r' H5 {
; U# k' g' u% v
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
* A' `$ ]2 @+ e) o0 {7 u
/ [3 v1 y! ^0 S1 p: w2 I9 y
微信图片_20240615160707.png
8 ^1 R. e" P" U: w/ W2 g' z1 H$ W5 F/ ^
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义4 ~6 d9 W8 o6 Q5 `1 I# q5 G
' _+ q4 C3 ~7 z
微信图片_20240615160710.png
' W0 {; M$ b6 ^/ K, z. [0 V1 L
# A, t0 w6 U& r1 W+ A7 `2 f7 {+ Eh.此时编译可能会有下述报错
% j+ U' a/ p5 t3 e+ y! e
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    * p: N6 s3 f5 q" a, @' X  n! _
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码
0 f+ }, w8 `$ }4 C5 B

: Q4 i% H: i# G) P4 l: a7 h

  X5 z& e. X& M打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)
    $ x5 U0 |1 L' M: s& {. H. |" t2 R$ |
  2. {: I9 A/ P$ L" t0 J3 E/ L+ o$ g
  3.    uint32_t result=0;5 b9 B' _- B; T! z2 C: z0 S1 |

  4. 5 G6 [$ z* ~! V5 X& }# J; Z
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );! J6 S; ~, ^8 @1 |
  6.    return(result);4 o5 J0 Y% S  k" z- p, d- b* o
  7. }
    ) O" G1 G; o" x! H  F

  8. - T* x) R2 {- m; U3 ?6 }3 U
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)* p/ s8 Q1 S7 q
  10. {
    3 X* g% u; @7 x2 l$ m% t" P
  11.    uint32_t result=0;+ M3 ^3 e. G% `
  12. / W1 I- o: u7 ]& V" ]: W
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );+ W, T- q1 h7 ^# N7 ?: L( [/ V
  14.    return(result);0 v8 {# [$ X- K4 x2 p# k
  15. }
复制代码

) p5 P# n" L% @. [( v, O1 |
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    8 a$ Z& O4 q# F  j# t

# `" I: V  F1 l6 n+ d8 \
微信图片_20240615160713.png 5 A1 n$ b% B0 e# @! Q  v3 f, ^# r- J
  1. {' g% N9 Q2 O# J- i1 L: L2 m% ^0 h
  2.     "configurations": [6 L$ H$ z! E9 H% }* I
  3.         {
    . v0 i$ X5 Z2 `& h3 r8 r% p3 i
  4.             "name": "Win32",- R0 N$ |% Q! B4 R3 t, w9 a
  5.             "includePath": [
    4 [) c1 }) S' y8 }. l3 S
  6.                 "${workspaceFolder}/**",
    6 v) Y( a+ ~/ P4 r
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",/ D3 a7 Q! k; @9 W3 X8 P
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",1 U5 f% P# j+ r; o6 h, a9 z+ `
  9.                 "${workspaceFolder}/CORE"" g9 V3 B1 V: T; A& p
  10.             ],
    ; n0 c4 D/ E* \6 a
  11.             "defines": [
    6 ?7 o5 W3 u6 @) ~; Y
  12.                 "_DEBUG",$ d0 c/ j1 p7 X) n( q
  13.                 "UNICODE",  u( Z. }3 t9 o( _0 A0 ^) a6 t0 ?, z
  14.                 "_UNICODE",
    ( P; T) P" {3 @8 r
  15.                 "STM32F10X_MD",
    " ~" J! o" O" {# e' j3 v
  16.                 "USE_STDPERIPH_DRIVER",! t" M/ s. R5 e0 \
  17.                 "__CC_ARM"
    ' d) p: ^( a; Z$ H4 [% }* F
  18.             ],
    3 E9 Z4 S  f% U- O1 j
  19.             "cStandard": "c99"
    ( k: e  z! v9 @% Y8 h1 ^
  20.         }0 |' H- a& @/ u; z4 c% y! o
  21.     ],
    , C+ F( j( e2 t, Y( R9 _
  22.     "version": 4
    ! i1 J  O; _3 r# _5 {5 ^

  23. & A4 v" \6 O- K2 b; I3 n, \5 m
复制代码
2 V$ U2 N9 a' F. W8 J3 j7 Y
3.编译工程
2 k) G  Q2 h0 B6 Q7 G: j+ y) S% |
' ]1 _0 L" J+ N8 D% I7 M7 o, _, r5 }4.一些问题的处理:% K5 z/ c( r7 b, D( d3 E7 l
a.编译成功,但下载后没有任何反应。
( z7 S2 J6 T7 E% [$ L% ^- b注意检查stm32_flash.ld文件内容
$ E+ o3 m  F- ~* w: ]
  1. /* Highest address of the user mode stack */
    , b  u7 F8 i/ t7 G$ {" z. z
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

; h. j; c7 v, R! _# z9 K" J注意对应芯片型号
* ?: j4 ?- w: q8 y( I$ A
  1. /* Specify the memory areas */; X* @# O# B) t; Y: ?7 y; }5 C
  2. MEMORY
    5 t+ V  n# E8 K* l
  3. {( W) B" V! w* r7 b# ?1 j  [
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K9 n/ F: g$ V% t, ]/ I1 @6 p
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    + F( S3 h, S% [  v
  6. }
复制代码

/ Z1 V+ n- d' Tb.vscode提交(commit)代码时卡住- j3 x. I, T: m9 l
0 B9 N& ^. i2 E8 {
微信图片_20240615160715.png
7 G6 U. R: X- @! _: o, S" X4 J1 M& J7 \
微信图片_20240615160718.png 6 e( }& K# k7 `$ X- m

( v, v# B1 L  j' w8 n 微信图片_20240615160722.png
  q1 K# Z$ V7 N+ I( _
7 ?/ f$ u- Y0 o- I& j设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。) L' i" ?9 \) Q- ~9 _* V3 {$ \
1 r+ S7 d+ y7 c
c.结束
9 P: h# L( x5 `  L. z2 l
9 k' a. u% R- {7 n  d& H
5.调试工程3 q) J  ~  C# Y
a.添加launch.json8 F. V5 Q8 J/ c, W8 _
进入一个C文件,点击右上角按钮生成launch.json* s7 w4 q( f- F3 w
& |% m( E  m% U; ]
微信图片_20240615160726.png
# @1 _( A# D' V4 G: w' Y* r

% R/ K6 z! s6 ?) j6 H2 gb.修改launch.json为下述内容+ X) D9 C! N6 p
  1. {
    ; v" @* v+ F1 v) C- E8 S2 s
  2.     // 使用 IntelliSense 了解相关属性。
    . S2 C" U6 y& ?% \7 p- ~5 f& d
  3.     // 悬停以查看现有属性的描述。! ~7 V: H; i) r% n. g
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    - J8 R" \5 @4 a" `# V# R9 q
  5.     "version": "0.2.0",
    8 e: _0 [& Z" }
  6.     "configurations": [
    ' {5 d1 O/ A3 Y: ?' N  e
  7.         {
    . I1 z2 @, K5 t6 g9 L  y5 S# K
  8.             "name": "Cortex Debug",
    - w) J: H$ _" I& T2 ^1 W
  9.             "cwd": "${workspaceRoot}",  // 输出路径  l2 p) h8 h# G; O
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序
    : k; s! n4 _1 h# R
  11.             "request": "launch",
    6 b- S2 n3 y* t- c
  12.             "type": "cortex-debug",2 W" I3 Q8 b+ y% i3 l$ ]5 F. c
  13.             "servertype": "openocd",    // 调试器选择; I0 A" E& X  x8 a
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    0 Q0 C8 }$ D5 _; T$ R* U4 U3 J
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    # H$ B$ `) p  U- F; B
  16.             "interface": "swd",, I/ o1 U5 ?) r
  17.             "configFiles": [
    & `* e2 W/ O5 I8 |( ?
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    7 D- T, b6 |* ?1 I' U4 d0 E
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",8 [: I3 Q+ U; m3 c  A7 _* h
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"! g$ L! i5 p- m; C% f8 o$ D5 T
  21.             ],
    # [1 G; V$ c$ H. H: q9 I8 m) G( Q/ X
  22.             "runToEntryPoint": "false",
    6 f& @( a; \% I/ z. j$ E
  23.             //"runToMain": false,  D  a$ j7 ?. C; F
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的0 J7 @( J# W- t: e7 e
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径# c/ p6 X( }2 ?! u4 a6 G- `5 L
  26.         }. r1 _' ~8 x6 M9 {
  27. 2 P: Q, H2 Z! s( P2 Q! F8 i. c
  28. }
复制代码

1 h/ Z& T4 i, p) z上述最重要的是引入openocd的路径。6 q+ M) X* Z; b7 z" A+ P7 [

5 A4 V6 d7 g3 R  E) [

% ]  q/ K# m* d( ]% t( bc.点击播放按钮进行调试5 X* Z0 N, z1 i

. l. [4 W1 f, l4 J
微信图片_20240615160729.png
- f/ R; N4 V7 Y9 D

' R5 I8 s) Z6 B% W5 {4 ~' I6.结束) @; w. L# a! L5 G; R: w
- ~' [8 f6 D+ ^& }- e4 P3 ~
8 v* i/ H7 i8 H* T* m

* K5 }5 d" j! p, @转载自: kevin
" ^$ b  |1 x8 L; E如有侵权请联系删除
& H$ p' R+ n7 s# c3 f0 N4 X' q! J  r  _0 S. \6 q9 u
0 R3 P( x- K1 }
微信图片_20240615160549.png
赞 收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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