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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
: C' R2 @. Q" f; S1 e0 R8 ]7 P: g7 x. h9 M- Q* }; W  A
微信图片_20240615160241.png & {! |4 ~7 l) P+ R: U3 e
' ]1 G# V5 p8 ^+ _0 S8 E8 t' m
1.VSCode安装与配置* q; @" N7 K2 j1 B/ |! ]
a.卸载4 {/ r% c1 E' @6 j/ X" G
b.安装
" i& D: e! K  [% _c.git安装与配置2 t$ ^& c5 t8 I& r+ Y
d.安装插件& [5 d- Q  s# {7 B" R9 ?

/ z2 l+ ^! w$ M2 J
; Q' v2 \$ l6 X/ u9 w
2.Embedded IDE配置3 P" h7 z1 T4 C9 N) a" t$ b
a.安装EIDE插件
! R/ H+ h5 [# c9 f
b.安装实用工具到EIDE) Q* x7 C, j  s- h  B3 u8 j
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools1 J3 s' k# T# d$ z3 ^0 k/ O
3.Embedded IDE项目建立-stm32标准库
2 z, v# @: u7 ]& `/ ja.工程项目建立: Q. n$ J$ {- z8 u; s4 I+ Y
b.在EIDE中使用标准库时的设置(无Makefile)
/ X( M; ], |5 b- K9 Ic.编译工程
. A. e- f- r) `, j3 v
1 M2 ]1 o# [+ k$ K3 r
4.一些问题的处理:
5 _! _3 n3 H6 S! r* e0 q  D5.调试工程/ f- r$ x0 L, u  h
1 |1 @* V! U" h# B+ u6 B: U4 Z* m% W$ P
01VSCode安装与配置1 i9 x, X/ z! y. Y3 i; u
1.完全卸载之前安装过的VSCode0 U/ D& C* A% y( B5 s0 N3 k
a.卸载软件7 }5 `$ S7 z7 X4 C
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。3 z0 {% E7 H9 n' y# X
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。
6 v8 h4 t1 R  V/ N, s  U, \! L0 W2 |3 ]7 `8 S
2.下载安装vscode, D1 A6 `% [& a$ l( J

! r& O4 [" N8 |
3.git安装与配置
2 `2 J3 x  A3 X# Q; M+ D/ N安装git6 }$ y& m/ ^* ?" `: u

' b+ O$ l  e/ S" e' A# v
微信图片_20240615160248.png
8 Q* T! \5 c, ]  z% M/ t4 E+ Z, o' l8 ^8 c+ |1 g' {$ @* U
安装完成后,在开始菜单中找到并打开Git Bash3 V4 R4 v) Y+ `
# N  v/ }3 g" x! X1 {; u
微信图片_20240615160250.png & j, ]8 V+ s; ~: M" P

) E+ u  q  q3 i8 Z; t在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git' J- ?+ u+ ?5 z3 v/ g$ S
8 c( x% ?0 c- k  C, h7 R
微信图片_20240615160253.png
* {# P9 n6 K3 x+ s: s+ K+ N% U

' [6 p7 j$ ?+ ]( q" P( U在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    + _3 e' s' b1 a1 J- e! Z9 f
  2. git config --global user.email 'ct15762287606@outlook.com'
    2 R4 |: l- f: a0 V* ?; i" F
  3. //检查当前仓库状态) n2 m2 r* b& `2 o" e
  4. git status
    ! c& L" p8 B1 ~5 c; b( h# @) u
  5. //确认git配置- S/ W1 M+ |$ X# m( \7 E- g
  6. git config user.name
    % F. |2 i/ H5 P2 Q
  7. git config user.email
    . e. A5 G( s. w
  8. //查看错误信息; E% d& r6 M8 o+ Z! i* b7 ^+ u* o
  9. git commit -v$ D' y6 u- f+ S) D! }( s' U
  10. //清理缓存
    1 c4 ^5 ]# E6 C4 K- x: A) U$ Q
  11. git rm -r --cached .( H& U8 l0 b( @/ \- g
  12. git add .7 Q0 U6 f1 h" L3 p: ]
  13. git commit -m "Your commit message"
复制代码
; j) h4 t" m2 }% C1 F+ ^7 i* y
微信图片_20240615160255.png
7 O; l/ M& [3 w5 _; Z; z$ w5 t# D4 P% F9 l1 X$ x5 {" o5 [. X3 G
4.安装插件,如下图:
: r9 p, i# G" M6 D5 x
" T1 I/ T: T; c  Y) U, R! W$ w+ |: y
微信图片_20240615160258.jpg
, S8 V, m  N, S) M( ~, s# z- W
3 O$ @) O+ `1 f7 w
微信图片_20240615160301.png 3 U8 B4 Q# N2 c0 r

. U% ]/ }+ Z! z; {9 j
微信图片_20240615160303.png
2 k- U& Q) _" s& O2 c' S/ E$ l! R. X; r. E# f; c
微信图片_20240615160306.png
, ], Z& I. e! Q: T: |7 C
- q. e1 G7 a% w$ \7 N) I' g* m 微信图片_20240615160309.png - ?" {' b: v5 ]  B. E9 ^

  [# |9 H7 b  W% n9 Z  c' h2 q 微信图片_20240615160312.png
! U) _" A+ s8 H5 [$ _8 u
0 v0 a/ d% s% N( h- r4 U$ D$ Z! K7 ~ 微信图片_20240615160317.png
! d: L" j' X& ~/ m) `6 L3 V( w# l# f7 }5 a: ~, V+ R
微信图片_20240615160320.png
- @" i  ?3 J8 [6 n2 [: o: p0 ]+ Z9 @# O4 U9 x1 p
微信图片_20240615160322.png
$ C; ]: D/ t( c% {9 d# R: V1 S) n, F7 N$ q8 \* Y2 W- ^
微信图片_20240615160325.png
* z( [3 d) \2 {2 S3 v; \* P% p' B2 o* b2 x/ R
微信图片_20240615160328.png
$ {% X7 D+ S8 F) x; @! n& I' i4 M% |& t+ C0 g
微信图片_20240615160331.png   N: b" Z% ?$ M4 V8 N9 D

1 w* d: f$ J9 M% B: W9 z 微信图片_20240615160334.png
$ L$ ]5 Q( D2 h3 |2 h6 ]6 B  \
: |3 b0 g! D6 I% N( K6 k" b  x( A' L 微信图片_20240615160337.png
/ t. p# n: O, z
- b, p* u+ y; G# l7 h+ `8 g 微信图片_20240615160341.png : R) U9 J1 H1 W+ E( d$ Q

0 X! m$ d. N" j9 A4 ]6 y0 w# q& D 微信图片_20240615160344.png
, [5 V( b# q7 [7 A9 T2 H+ `! Q' `$ H" M4 E
微信图片_20240615160347.png
- Y) Z; e2 P- N) k3 F  H" a) m2 H, B/ z8 _; u1 m  l
微信图片_20240615160349.png
  u6 ^: g* l; S1 I% D
) [9 x0 d/ W" y3 P 微信图片_20240615160404.png ! a; y; ^9 B; p# N) \& F+ u
" ]3 U' u; @  u* l  y
02Embedded IDE配置
: K4 Y* W8 B. u1.安装EIDE插件到VS Code
' x8 i' ]+ |: |5 _2.安装实用工具到EIDE环境
( |' K0 V6 u  l/ {a.安装arm-none-embed-gcc工具链) W9 @5 v2 }3 j# P2 p( \
# i  G# ?3 \4 C  w' U
微信图片_20240615160533.png
: V( ]% s$ y* i, E/ N7 _# ~: V, o  A  @5 l3 |
b.添加其bin文件夹到环境变量) H+ }  y& i2 B
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址2 u2 ?6 I3 E8 p) j7 L

8 M( E+ D8 E) `, s+ v
微信图片_20240615160536.png
6 {, @# r' D( c6 \. S' a4 {& F0 Z5 A4 a! r6 N) u" W
微信图片_20240615160540.png 2 X1 T) `  w$ r3 J( P$ n* W

1 F( r. o4 f* v7 ]在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试% t+ V& M& T; e' B9 P( W
5 J+ A! K/ V* V* h+ j7 j
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

& ?- G7 I" F; L' b' S# F! A! O# k, {c.安装OpenOCD
; `. O; z% S. W5 n, z, v
! `, q1 Y. L5 E$ ?7 Q$ F  t

7 w0 [/ q& \* G/ i- z$ e/ P# D& u) T) t0 N
d.在vscode中安装Makefile Tools5 N4 G) u# q# p4 \
  ]& A, E! X( H; x5 T
微信图片_20240615160554.png
1 }# L# E( J5 o$ ^9 t/ s9 M+ n
* r0 j/ J- U0 s9 j
  • 找到该工具的安装目录( \/ L& Y/ S  ~5 I( d# g+ L

& O# g$ K+ S& ]9 l/ K5 W9 r
微信图片_20240615160557.png , p* g! d' u* T: m' S% a
/ ~  [( R1 \9 N& ^' i
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常' K4 ~" j- c" q2 L
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v+ t: g2 q1 C/ Q2 ^+ [
  2. GNU Make 3.81. b: u4 X5 w1 C2 ^# c- C: _
  3. Copyright (C) 2006  Free Software Foundation, Inc.
    : I1 u2 Y2 n! O7 U: D. P, }
  4. This is free software; see the source for copying conditions." ~9 O6 h1 `9 y3 W; E
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    , ]# ~1 ^& |2 l' S
  6. PARTICULAR PURPOSE.8 W  Y" H4 K/ j7 D. z- m5 ^
  7. $ Z# P  V. a8 b0 b

  8. . e, v" W1 k; y- I
  9. This program built for i686-pc-msys
复制代码
: [7 c4 E1 R  x7 M* U
03Embedded IDE项目建立-stm32标准库
8 o/ g/ g2 ?2 h( |& _0 q6 R* P- A1.工程项目建立: t7 F4 B8 S2 ^& |
a.切换到EIDE环境,点击操作-新建项目-空项目图片
+ w# _4 W" m) a9 o6 v2 B$ `2 d4 t& U( W. a! `( x( n! @
微信图片_20240615160602.png
2 o( e0 E9 ~. K, s1 ^" O9 o7 M! N, ^+ O1 I
b.选择一个合适的MCU项目类型,如Cortex-M项目
6 {) y5 n6 G3 d# `7 U8 b" t) Q, L- a* K+ _0 M' o
微信图片_20240615160605.png
& {7 T7 Z, e9 R4 ]4 I
& m7 S3 G/ `/ J& I! z$ @9 Yc.点击右下角继续,跳转到工作区$ i( m& z$ G- \% D$ @$ v% q

  i- q/ e# x, F! u 微信图片_20240615160608.png
9 e- f8 ^/ Q" y. D6 N

3 e  p# h+ h( od.添加工程文件到工作区路径下。——标准库
& G) a+ V+ v8 {; X% P
! s, ]2 C0 K; d7 a
/ A5 x& F$ Q4 ?) C3 {; p7 g3 Y
微信图片_20240615160612.png 8 L3 W1 S3 ^  O, J
- F1 T& ?( F" g5 W' h4 Z- P! L9 a
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。$ l7 K3 V' [2 V, k: u! n
* E# g8 F) N6 ]' Z
  • 新建User目录,将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c复制到User目录,并新建main.c文件。, k# ^. F/ Y' H/ H- c) t
" \8 \% }6 I& l, K& r( K
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件& d' X$ P/ s  @3 }1 J8 t2 z2 B

/ {5 ]# \' L1 F6 d8 o  U: h8 \, h  h( W  W

) |+ F& I" _: V8 d) ~" b- Y2 L
微信图片_20240615160615.png
" @4 }  O5 k7 s; g- {

+ \0 m) Y% W" p  R' U9 n4 _, ^0 ystm32_flash.ld* [+ |/ }- ?0 p, q8 W. c
  1. /*
    ; z+ m# x2 _. L) a: `
  2. *****************************************************************************
    ! z/ N% ]; h! ~( g) o- I
  3. **
    7 N# k. H, r5 {  v2 Z( H
  4. **  File        : stm32_flash.ld
    & X) Z* F9 O5 e6 ?" i/ x8 d" j6 S1 E
  5. **) ]3 @( r2 ~- x: ~1 T3 d! X
  6. **  Abstract    : Linker script for STM32F107VC Device with+ c+ A* q/ m, X) Z$ x' {$ w
  7. **                256KByte FLASH, 64KByte RAM
    - j9 A' T- ?0 j, u+ v
  8. **
    + Z8 _2 `7 x6 V
  9. **                Set heap size, stack size and stack location according. \* J: Z  @) C( |# }1 |! o* Q
  10. **                to application requirements.
    ' v6 M+ M% b- q" _" k$ ~4 V& _
  11. **
    " |: ^5 _  l  B6 I0 e, s6 l8 G
  12. **                Set memory bank area and size if external memory is used./ }( N5 S, D, a% `; ~
  13. **
    5 S7 G: ?$ e: k: @1 @
  14. **  Target      : STMicroelectronics STM328 f9 Z& c. K  ?  ^9 O" t) c
  15. **
    5 }/ T, x* r) }. W5 P) s2 a5 f
  16. **  Environment : Atollic TrueSTUDIO(R)
    % U0 b' h! L. b1 ~0 r! x; b' A, u
  17. **. `1 G1 M& V9 M
  18. **  Distribution: The file is distributed �as is,� without any warranty" m3 j! i/ M& s7 s
  19. **                of any kind.
    / L; {; w. s6 U  R5 a
  20. **
    0 H3 k5 S  y$ S& E
  21. **  (c)Copyright Atollic AB.
      b8 G; e: @! b+ n! T1 c
  22. **  You may use this file as-is or modify it according to the needs of your
    8 ]& c7 k& K; i5 P, u. {: @0 n/ m
  23. **  project. Distribution of this file (unmodified or modified) is not
    % J1 [0 W! J2 n" Z. j1 r6 V4 }
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the, @  U0 A, L$ t: b; l7 F9 k1 Z) D' J
  25. **  rights to distribute the assembled, compiled & linked contents of this1 o7 D$ v6 ^& ^3 j5 L
  26. **  file as part of an application binary file, provided that it is built
    % G- [# R  N7 S  S0 ]+ d
  27. **  using the Atollic TrueSTUDIO(R) toolchain.
    7 _5 J3 Z9 |9 B4 {
  28. **
    1 g  ]1 y, h( T; u
  29. *****************************************************************************
    ; b2 h, L( p5 X8 d! Y! I
  30. */
    4 e: d) S* ]' }! p1 @
  31. 8 F$ [! ~4 |! g' x. z; C
  32. ) o/ X* X; r. X3 `! n" J( V+ g* a
  33. /* Entry Point */4 {* F, B, i- q* E# G7 z8 }5 }
  34. ENTRY(Reset_Handler)7 D5 Z" R+ C+ q! G1 d
  35. ( H; H7 ]% W/ Z( y. {: e

  36. , W: h! ^/ Z7 _5 ~# l9 |
  37. /* Highest address of the user mode stack */
    # ^* c2 e5 L7 x. u
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */0 y3 j; {/ h# H  \# n% W

  39. 4 N4 Y  u2 w* l+ P3 p) u
  40. ; a: P9 r  R3 X# _! p
  41. /* Generate a link error if heap and stack don't fit into RAM */
    , p$ n  W+ \8 O* I
  42. _Min_Heap_Size = 0;      /* required amount of heap  */" d& }9 Q" t8 T7 M
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    ( x3 F5 V) `5 f$ J% F

  44. 7 N: Q; a7 K1 v/ V7 p

  45. ( N1 _9 G) @  a6 K& P
  46. /* Specify the memory areas */
    : N8 O  v' R" E0 @
  47. MEMORY
    0 E/ r; ]; c7 u- u  M1 m- A
  48. {  I+ u1 ]' ~3 r4 u. j
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K* s1 v" z& \/ s: L" Q" C& i/ f+ N. l
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    : c1 Y, L1 ~2 o: O, t
  51. }
    % U/ X* s1 `2 J  u( `

  52. # M2 z; ~2 z; ?, ?
  53. 8 Q' t3 c5 a1 r5 }5 r2 ]( {
  54. /* Define output sections */
    9 E1 E) C) v' T7 Q
  55. SECTIONS
    : _, o' x. V  f+ O. \- `
  56. {
    3 I5 ?5 w1 g9 j) f$ g  b
  57.   /* The startup code goes first into FLASH */
    ( Z: r5 N' x6 a: v! a
  58.   .isr_vector :
    / ~0 q- f6 N2 V4 _' Y) ]0 c- J
  59.   {, C; ?( R- J+ r3 u4 _, \  k7 R5 i
  60.     . = ALIGN(4);
    ; q# y9 i7 N: ]$ w
  61.     KEEP(*(.isr_vector)) /* Startup code */
    % @9 k: \* r' y) r, ~" b9 j
  62.     . = ALIGN(4);5 z4 k! N8 U9 C6 m, E4 h
  63.   } >FLASH
    / o/ {: ^* Y2 v" f% J# Q( e3 h
  64. " n" {! X6 j: C2 ~: z" P5 Q7 v6 e
  65. 4 G; \- Z9 V3 j* A
  66.   /* The program code and other data goes into FLASH */3 H8 C- b, F6 W. l
  67.   .text :
    . D  |  l% c& e8 U  x* s4 x
  68.   {
    , S( G7 \5 Z6 H& u
  69.     . = ALIGN(4);' b3 F( m8 J/ m- L
  70.     *(.text)           /* .text sections (code) */( f2 _8 c$ l8 q6 Y' {  q$ y
  71.     *(.text*)          /* .text* sections (code) */
      j+ O2 O8 C+ C8 Y: x; K" {( N/ X
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    + b& @) O0 a+ g# U5 D( n7 y% J1 G& T3 U
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */! E' l) M2 K4 ~) s
  74.     *(.glue_7)         /* glue arm to thumb code */5 |. Y( P9 l7 E- U
  75.     *(.glue_7t)        /* glue thumb to arm code */! _$ N2 x3 ^  I( X$ j$ i6 W

  76. ' A3 S, F2 X  G$ n( b

  77. * d" M& q# T+ t' e* s* t4 c4 e
  78.     KEEP (*(.init))
    * p/ @" U$ d$ m* x  s& G' O
  79.     KEEP (*(.fini))
    / g4 F+ z$ n3 y" s
  80. + C8 C% c, h/ E; w3 o0 e: }
  81. 7 }; P, @+ @0 g1 O
  82.     . = ALIGN(4);
    / [# T- r& U9 r" m1 T; s
  83.     _etext = .;        /* define a global symbols at end of code */
    ! j$ G" x6 _9 `! I$ x
  84.   } >FLASH
    % m8 r6 U2 S( A2 O! ?
  85. ! j: [4 Z, q& p, ^0 D

  86. $ O' y) G! j% Y, W1 |, Y
  87. 5 V' m6 I, ~5 {+ {) ?  m% z$ Z! `4 e

  88. : c  C" Q1 H, S) d4 A* U1 T0 c
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH3 Z3 m. t- K& r9 t9 x
  90.     .ARM : {
    ; Q; J; W& o4 [5 p
  91.     __exidx_start = .;% c5 `2 k- R1 e% N
  92.       *(.ARM.exidx*): J$ l: @% M8 m
  93.       __exidx_end = .;% o  B5 J9 @1 ^- f0 X3 e
  94.     } >FLASH
    $ E5 D5 v; h: k5 R2 G% a

  95. : s1 e0 E- f, N& _
  96. * [( g. A3 g( h$ R# M- T$ U; I; Q
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH% \) h, }- p# c4 v
  98. 6 t3 M. i1 t) ]. J

  99. % P: x6 l# i- i9 B2 c' G8 u5 ^
  100.   .preinit_array     :8 I7 y9 M+ @0 H' c" q
  101.   {
    $ |- w0 K, m1 B
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    " ]! h' q0 @  U1 f
  103.     KEEP (*(.preinit_array*))
    0 D1 m0 M6 {0 H# f/ X! p" \0 i! t
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);# f" j9 j' S5 {2 p( n
  105.   } >FLASH: {, h  h* l+ |* _, {
  106.   .init_array :2 V8 r% Z9 e) I$ U
  107.   {
    / I* }, J4 E  C& S5 V4 T' Y# g
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    5 t& M. X, T0 X! n1 x7 S; Q
  109.     KEEP (*(SORT(.init_array.*)))
    # ^. f5 S7 R: I. K( r+ H  E/ k
  110.     KEEP (*(.init_array*))
    8 q. J( m& U1 k5 v5 B
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    * h7 D% c6 \  |' ?
  112.   } >FLASH7 M6 P, H5 M5 G2 q; f' P/ p5 M
  113.   .fini_array :. y0 j1 d& E# i' z' `7 e. @
  114.   {% \/ Y+ P" Q: F6 v- ^
  115.     PROVIDE_HIDDEN (__fini_array_start = .);. `- _; b4 r" ?0 Q/ o
  116.     KEEP (*(.fini_array*))) f! A3 x! F% ]3 @5 f
  117.     KEEP (*(SORT(.fini_array.*)))' S$ w, ?+ _* `8 e! p( W2 y' {# v: t
  118.     PROVIDE_HIDDEN (__fini_array_end = .);- x0 O6 K* s: @1 {; G2 i, o# n
  119.   } >FLASH
    ; ^* z4 P7 K* [7 E' u% S6 u

  120. / K( ?" s1 z, k+ k8 D) J
  121. ; ^" B# q% ?3 e7 L7 Y* R9 U
  122.   /* used by the startup to initialize data */1 [2 E5 N/ F# h2 d
  123.   _sidata = .;
    7 {# T& r0 z* I, J1 @. a2 A% \
  124. 6 |. j' T/ o' U  ?0 d) D+ S

  125. $ O9 D' f/ D" r  R# x: ^6 o& k
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */
    3 x+ l3 z3 E  k- z% `+ r3 L+ |
  127.   .data : AT ( _sidata )
    ' a% ?; {  f9 W' v7 `( e& V5 H( r
  128.   {6 t; R! I; s: Y$ z/ ~
  129.     . = ALIGN(4);. q% q/ {6 ?3 @- J  w
  130.     _sdata = .;        /* create a global symbol at data start */- |: ?3 I4 L$ |" [
  131.     *(.data)           /* .data sections */0 j2 j2 S, D; G, O
  132.     *(.data*)          /* .data* sections */- T, R8 ~4 }) V8 Q
  133. 8 B# ~& X3 z5 f# b! g: c, m
  134. 0 l8 d( w& H8 i, X# ~( ]
  135.     . = ALIGN(4);
    4 T9 l! P; ~1 n- U. Q# H' N% r& d
  136.     _edata = .;        /* define a global symbol at data end */
      e  O  W4 M) l/ {) W/ x6 G
  137.   } >RAM, r9 X( X, v3 n8 J3 t

  138. 1 Q1 V. }/ Z+ B9 w
  139. $ w* L9 p4 v, F5 C" d3 ?
  140.   /* Uninitialized data section */5 r* z: U1 `1 Z
  141.   . = ALIGN(4);
    1 y  H  P7 V2 O+ p- t" |5 V
  142.   .bss :
    4 |4 q/ a  W/ Z' ?- j5 u1 b
  143.   {3 A$ S1 a9 f3 ?! n" d' E* G
  144.     /* This is used by the startup in order to initialize the .bss secion */
    . e8 x0 c& d$ x) o2 D5 ?( W$ T
  145.     _sbss = .;         /* define a global symbol at bss start */. a' q3 a1 v0 @
  146.     __bss_start__ = _sbss;
    9 q% V3 G' [: w  P4 @; v
  147.     *(.bss)8 S, A- Y0 @( q) Y9 g0 v
  148.     *(.bss*)) Z! {7 ~- h# O
  149.     *(COMMON)
    + X. `4 \/ C. A# N# n' F
  150. ! j' m% ~  A- P# d5 |
  151. # B" i7 K' ?/ w
  152.     . = ALIGN(4);) J  R: D# a# |' X, p
  153.     _ebss = .;         /* define a global symbol at bss end */1 [7 U+ L  K, W. H; [( m
  154.     __bss_end__ = _ebss;! X$ B  v( A) ?3 P0 J0 S
  155.   } >RAM, T+ K, z, Y* f8 k& J& ^) B- b

  156. % j& Q% ], Q/ F0 a1 A

  157. " B6 x. j9 T4 I6 R' b) L  }8 G( y
  158.   PROVIDE ( end = _ebss );6 ^1 k) b, g0 q! ?
  159.   PROVIDE ( _end = _ebss );
    ; [: w! H- t9 x! q
  160. 3 Y  L1 p, M8 B$ r9 E; R8 N' l

  161. 4 d9 F" h9 ^% A5 f7 L! y
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    ; d- k# g0 g% {  U' {3 ?8 p
  163.   ._user_heap_stack :
    6 s8 }7 O) L( T2 P3 w6 n  T+ I) }
  164.   {3 l' t) W3 |$ F3 x/ _) N# l
  165.     . = ALIGN(4);  b& k# C& y5 ^  Q5 c+ m
  166.     . = . + _Min_Heap_Size;1 U  a% y5 @  y$ j% t
  167.     . = . + _Min_Stack_Size;
    + t7 f" {1 M$ o! p
  168.     . = ALIGN(4);
    . E4 d$ H/ I  k3 }
  169.   } >RAM
    - _; q: M' n2 H7 d! [

  170. " b4 Q/ W* T2 N( T  W/ q: R6 A

  171. ; _4 k6 Y; \' `  {' F8 c, c
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */8 y4 n6 x, f7 L5 l0 E
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */( I" c( f. o) n7 C
  174.   .memory_b1_text :7 Y4 x0 a% X% M1 \2 T2 a& C9 f
  175.   {. D" r4 B# Y7 ?+ ~& b
  176.     *(.mb1text)        /* .mb1text sections (code) */  k" g/ N2 B$ r8 G
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */
    0 d5 Y) T# n; f5 H/ n! P3 U8 P1 P; ~
  178.     *(.mb1rodata)      /* read-only data (constants) */
    4 v5 ~- @; D8 G
  179.     *(.mb1rodata*)
    0 V, j5 W2 Y, Y5 @
  180.   } >MEMORY_B10 c( I* m6 o, ^; n8 m

  181. * c9 g4 `1 p& l

  182. $ ~# g1 k: O$ a
  183.   /* Remove information from the standard libraries */
    5 R7 c" s6 p& l/ V$ f5 l3 u
  184.   /DISCARD/ :2 V4 I9 y$ {9 K+ V
  185.   {
    + s* z& |* g: ^/ t( W8 I* }+ Q
  186.     libc.a ( * )6 U3 |/ Q2 n9 z
  187.     libm.a ( * )4 b( U% e: Y8 e
  188.     libgcc.a ( * )
    $ ^" p4 s& D$ p6 C
  189.   }
    * h( S4 L! _/ V8 |: ?
  190. }
复制代码
  ]" a5 K9 S$ b) j( V- I
  • 最终目录文件如下6 x' U& x3 Z; [2 r* k- H# `: B

* z) a1 e6 `3 ^0 E: T$ y& m
微信图片_20240615160620.png
% r. H4 Q7 ?# r4 S. i
1 a- ?2 ]# e( d) f. w1 T- F
2.在EIDE中使用标准库时的设置(无Makefile)- o" P3 n/ n  T. ?' d! j5 O! y0 o
a.切换到EIDE环境下  O) F% y' R0 Q  B4 g; {/ S
; s: l' h- n$ f" `/ a4 F
微信图片_20240615160623.png % Z$ f! b0 K& X8 T. a# r- n
* x4 C" J+ a' ~( i) r
微信图片_20240615160627.png . H/ s: ~; y, I

6 L2 q- P  {4 k( a- I* Fb.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
/ e7 Y% i! `: V* N' c+ v3 J
8 T- u+ q) s7 Y4 D% a
微信图片_20240615160629.png
6 C2 m* Y5 ^' Q8 @9 M0 B2 r/ `+ \% p. B+ o% b; T
微信图片_20240615160632.png
8 O9 L9 o7 m/ ~* t# g! G5 {- g
) w2 N+ Z9 x9 E8 L* V* N 微信图片_20240615160635.png % E% J% k. y/ w( N
- E! F& i$ `) {5 b- j! f4 s: ]
文件目录如下:) l8 L; ]* X; @" r% c) D8 ]' t

' i4 V4 C, t! p" z
微信图片_20240615160638.png
" ?' r! n2 f/ W0 k
+ a. F/ p  W1 Hc.点击+号安装CMSIS芯片支持包
) {  D' i; |% l4 z% \$ P+ h0 E! n! I, x
微信图片_20240615160641.png " a# o/ R0 w# N3 u# W

1 [) E- g. [7 e0 F4 y5 t 微信图片_20240615160652.png 7 J1 N' b, |* M3 O
# f+ ]5 s* U6 W. _+ R* D
微信图片_20240615160656.png , E: }" l: H: [/ ]% l9 a$ Q/ r" Y$ j

* D- j6 L) V3 ?/ m7 c; sd.修改构建配置为gcc
' J% R1 A; V+ C6 z0 q2 v- J4 ~, c, H/ F, c
微信图片_20240615160659.png   ^" _# c  y8 j' p4 ^! `3 q$ W
. F0 I! x* @: s: s* S/ _
e.烧录配置为STLink/OpenOCD
/ l* w3 {5 k! x2 x$ ?6 s& E& x. a9 h
微信图片_20240615160704.png
9 j& U( w9 ^& V% g
% H/ ~, K5 x+ i; P) j% Ef.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。8 m1 N8 _; ?- K2 ~$ B

# v" w' J$ T7 `6 I* a# v$ w! |- i
微信图片_20240615160707.png / b2 ^3 B  p$ w7 p* w
# q/ }& w/ G4 h
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义
. @+ q& Y0 |5 q8 m# i
* P% a: a3 S. l1 c/ S! g* F
微信图片_20240615160710.png * `$ O; p. M* g  c3 G

4 z9 k6 U7 c; J# F( Vh.此时编译可能会有下述报错
7 a" Y/ |" {, S. E
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    0 l; ^" S! Y* u( U
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码
3 y) v0 ^+ b3 v5 @# S
( w/ u0 }. ~! |( W+ f' S0 ~

" d5 E9 h0 c  w" g打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr). S  F3 G6 i9 p9 Y- ]
  2. {) L! V* }' R/ F) W; E
  3.    uint32_t result=0;
    2 H8 W( j  w9 I( w3 P
  4. 3 Y8 T7 n8 ?4 f8 u6 t* D
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    3 Z) A, {7 F+ A+ Y
  6.    return(result);# U. K( ?3 d& A% m
  7. }. A% ~( S5 |, b7 n) T

  8. . d5 B. W0 e, ?' N
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)5 d) X6 f2 T0 U) T6 H6 S4 F- B
  10. {
    " _9 b$ Y! K6 q* Y5 J* R
  11.    uint32_t result=0;
    ) o8 F$ {( }+ R8 N) u3 S7 t
  12. 8 l, ~8 H6 L" e( `
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    & a7 G. A' K9 I; E; f1 w) C2 s" t4 y
  14.    return(result);
    * t( m( e) b: t1 Y0 C
  15. }
复制代码

& R, g- R8 \8 H: I" l
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    " s0 T3 W. ~/ f
& T! P) f" `; k0 T8 W5 e5 S
微信图片_20240615160713.png 9 }) ^7 S9 u; J$ m" o0 E
  1. {1 x6 G& |* k  y
  2.     "configurations": [) j4 p% u* l* c) ~/ [/ \0 T
  3.         {
    * p9 M6 J3 V/ X: ?( Y
  4.             "name": "Win32",: T$ Z1 t9 g/ U8 K0 x% z
  5.             "includePath": [7 Q, r: m3 v) u) A/ e( ]
  6.                 "${workspaceFolder}/**",
    + o9 V5 f5 S( A( j/ D) r7 \6 ]
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    # Z+ z+ G0 e, ^
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    7 D. }1 o+ U) |7 t0 _9 O0 u9 F
  9.                 "${workspaceFolder}/CORE"
    ' j9 J( j# G/ j8 I, Z
  10.             ],
    - H) e; T" N$ r$ V
  11.             "defines": [. `9 O. H( m3 \9 G/ F5 y
  12.                 "_DEBUG",
    # w9 n) i4 ^7 h
  13.                 "UNICODE"," W7 `3 X' _# j  x
  14.                 "_UNICODE",) P0 d+ x0 {. q- i* z) q9 l% n- d
  15.                 "STM32F10X_MD",
    ' m! [+ V$ L$ w: V, u
  16.                 "USE_STDPERIPH_DRIVER",
      A, W4 e6 o/ m& D( K, n
  17.                 "__CC_ARM"' q: _/ ^  C8 o! A! A& b1 y8 G
  18.             ],
    $ G$ Z5 h9 y5 _
  19.             "cStandard": "c99"
    ; p1 s) z. J  b
  20.         }
    ' c  Z9 O* n# a* d
  21.     ],/ M' E3 q3 T* B% I* ^
  22.     "version": 4/ @! I- B5 m5 w' b4 V

  23. 2 L1 ?6 t, z+ `" l& N/ Y
复制代码

, y, r, _( n+ B0 l- {1 N" {3.编译工程! |: {6 [  Q; F" [2 H

# ~! O- O  Q: W, M5 N( e4.一些问题的处理:
& n- n$ l5 V' fa.编译成功,但下载后没有任何反应。0 u6 E& ~) p& O1 K3 ~9 j4 C: l
注意检查stm32_flash.ld文件内容5 J" u+ L; q' _2 `! v0 Z: U
  1. /* Highest address of the user mode stack */% I7 E+ j3 R  _5 Z
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

% L2 Q# I) k" d注意对应芯片型号/ Z$ v$ m1 y) g& {
  1. /* Specify the memory areas */
    ) W* y% c9 d3 @4 U: s% o
  2. MEMORY
    9 v; d/ R. t: I% X, ^* _
  3. {
    ( q4 R% d( w4 `4 A9 ?/ A% b. U0 f
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K% Y+ G: V' h7 R0 X/ M' k5 k% ^
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    $ _* ^, l  {% O/ v% M& L/ e
  6. }
复制代码

0 [9 d3 O1 r( K6 Lb.vscode提交(commit)代码时卡住! h( d1 T# Z- V& G) w

4 P# W8 L. R( ^+ W( X" ?9 Z- f
微信图片_20240615160715.png 9 o6 z$ C  e9 X$ b* R) P/ N

$ G8 X: W/ I: u$ `  s' f- M- P 微信图片_20240615160718.png
6 R4 ^  @# ?" k9 P7 w+ U& }  A& ?; `* R: G9 |) n
微信图片_20240615160722.png
$ ?, V" S' s/ V% F( S5 j2 @3 k/ O  s' @& T3 m$ L
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。7 t2 M) R( p* c2 z3 x7 v- R0 ^; k
. ?0 q" Q$ q+ X# H% A2 g7 k% N, m
c.结束# V9 ]+ I0 s& b9 e% |8 o) [" Y0 J
8 g0 |4 v) [" T% B7 c! v
5.调试工程
, R- O! j+ w2 X4 ma.添加launch.json
- v+ A/ o8 ]1 v, I6 q! ~5 |进入一个C文件,点击右上角按钮生成launch.json
" B7 u# n, }2 }* E6 W, ~; g1 q. Z* C' S; A3 W+ i
微信图片_20240615160726.png
; N5 ]) y& n; N1 [
* n2 x! `+ h  A
b.修改launch.json为下述内容
! S. j) l# y3 ?8 J7 f( N
  1. {
    : b  V9 T5 @$ @
  2.     // 使用 IntelliSense 了解相关属性。
    # g' y' |4 E) r3 P. \3 D
  3.     // 悬停以查看现有属性的描述。
    4 G2 p4 s) g4 i: l
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    8 S: U, X: K6 c* P. }; m5 c
  5.     "version": "0.2.0",
    2 R, |. w6 x2 [6 @, c( w3 x2 X
  6.     "configurations": [
    ( |7 u# O) n+ B3 ^4 q) i- G# k4 x/ s
  7.         {7 [1 `+ G8 {; O- r9 }  m( z! n
  8.             "name": "Cortex Debug",  q7 W: z4 n  }& E
  9.             "cwd": "${workspaceRoot}",  // 输出路径# u' N% h/ r! W2 m3 f8 K
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序: \/ p7 w6 r) H
  11.             "request": "launch",
    ) ^% M3 j5 h4 H8 n8 y* w' J
  12.             "type": "cortex-debug",
    ! P$ h: m# W6 A, H% b& M" l
  13.             "servertype": "openocd",    // 调试器选择) ?8 W  I$ D# F- w2 t8 i, H, g- x
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php3 W& ?: Z+ ^, Q7 `8 |5 ]
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载. g. A: _# ?; ^
  16.             "interface": "swd",+ Q; m, R3 P: t. _+ X
  17.             "configFiles": [/ J- B! G0 o% c  G& k! N
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置' P. j2 P$ T  Z" `$ d
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",1 X# ^4 L* u7 W4 T5 g9 [, b7 v
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"+ k, }  m& _; t6 C; B
  21.             ],
      o) M) E+ h1 e1 m3 T
  22.             "runToEntryPoint": "false",2 L* {4 J* a+ k. F$ }9 m
  23.             //"runToMain": false,6 ^7 K# ?3 J/ s6 j$ W
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的( X+ }. h& H2 w' C: z+ C. `4 C
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径: H& [  ]+ b. F$ F7 {7 I4 ?; M6 J
  26.         }
    * u! j& q2 K/ C$ N! t. C! G

  27. + w, J5 D; Y& f8 |% ?
  28. }
复制代码
% s, L/ R, S8 ~1 A$ l+ Q1 B
上述最重要的是引入openocd的路径。, S6 Y2 e- \! Y9 ]4 \1 r* b
  f6 y$ W- b! T3 c, t5 r
9 u& `6 ~1 j- v* J* V9 c7 v4 ]9 H
c.点击播放按钮进行调试
# x3 g& c& J! l! x. M- A' e; }3 P8 W# Q
微信图片_20240615160729.png
0 [0 }/ |' e7 G+ h2 Z
  |# ^! q0 k1 h1 n! K
6.结束
1 Q+ y2 J$ o- q9 P7 m, s6 o' @  Y+ w$ D* a, T& A+ G
; B7 G( _# N: q" K+ v/ s  s

0 Q( Y8 u6 m# j" X转载自: kevin
, Z/ d, l' P) J% @如有侵权请联系删除
3 ]  e. X( \  `3 T* Y; t
3 S2 \$ z. m* E3 r. p& y; H' ?3 c$ h( M
微信图片_20240615160549.png
赞 收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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