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

【经验分享】STM32F10x 学习笔记 1 (使用STM32F10x StdPeriph Driver)

[复制链接]
STMCU小助手 发布时间:2021-11-28 21:00
前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。
7 F9 p) ^  c( w4 u# [9 n/ ]
' x! S( _$ z: @$ v3 p7 Z) Q+ tSTM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道)( K; D0 P5 o& y! h+ y

. W" H! Y% |2 A! O/ U  ^首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。
6 l) X$ Q7 S) \: u5 _! }7 Y
' n( J4 W! d  ]+ l: i# G4 ^IDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。
4 f7 s) K4 [) T% }3 U
" y/ I) S* g. M  d/ a0 ?$ @* k' S总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。
: c  U: m. N* |5 l  Q7 v& z! V/ f- E* B4 M4 c1 f
不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。
3 b" r1 C$ |( G. |2 B7 s8 m
/ r/ e/ r* H. e0 }  j(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。9 g  A7 b/ {4 ?3 R3 v- ^% M* ~

4 S) W9 \5 o) n8 i9 r/ e! b1 j(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。! c/ Z% v: c: B5 Q  P

; X! e& `' B- e: [6 L
1349530026_8394.png

' t  z" D' m1 ]- S# D4 p- n1 M/ f% G6 ]3 h
(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。
0 X; q; d& d4 @; K4 C2 u8 E$ \6 E0 N+ y( l- U& E0 B
1349530056_9517.png

: t! B/ @- e3 ~# N
( ?# G# l5 G: {. u$ e9 H6 q5 G(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。
9 ?4 ~3 O& G- V2 @# N8 [: Q
) Y! K8 L8 r& p(5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。! F& J' y- B- C. k1 \& A
: @$ A) {1 f. S7 N6 `5 `; p
1349530114_2653.png
+ ]! z* U+ |8 _4 T- H/ G3 G' v0 x
3 h* K3 g( ]# _8 `! X0 p
(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):' I1 P, W3 P# R+ `% b

, k9 X, X4 W& C" s5 B1 x0 _ CMSIS
4 Q2 x/ a+ C0 T. @# ]& y1 z& ?1 B- }
) M( w8 J  i) j2 }* p7 P  | Source
  i! P5 K: @. w
. O$ J/ n% @! e+ @% ?, g9 E# T StdPeriphDriver
: {  r% E6 Q4 S8 `9 ^0 P2 H8 e% [
" [% M, b$ U" f1 r6 R9 O. b  f test.plg
0 l6 l1 e+ w: ^3 a) T! d) [4 G) O
+ y; F4 r. X( C. V5 ?' e test.uvopt9 j) W! z0 X) d1 q  p" G& o' k3 g

- t5 E2 o. u  q: ^. n0 F7 b test.uvproj
2 [% I( d3 t" S5 j# w( S) E1 z' x1 a! G
test_STM32F107.dep
  v# a5 t9 A2 G3 J. |: K8 H
8 ^7 Z7 L$ g' ]" U+ I- C test_Target 1.dep' c  ~. P2 q  |) k2 y
& V( ?* }7 }2 [9 B* h! _
(7)网上下载的STM32F10x_StdPeriph_Lib_V3.5.0,解压缩后“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\CoreSupport”和“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x”目录中的c文件和h文件都拷贝到 CMSIS 目录中。“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm”目录中 “startup_stm32f10x_cl.s”也拷贝到CMSIS 目录中。这里多说一句,startup_stm32f10x_cl.s 是 STM32F105和STM32F107系列的启动文件,cl指的是Connectivity line。如果用的是其他类型的STM32,需要换用合适的启动文件。
7 ~& \) N7 C+ S1 i: @8 C; G4 s
0 m, d8 ^5 @7 A! y2 j(8)“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\inc”和“STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\STM32F10x_StdPeriph_Driver\src”文件中的内容都拷贝到StdPeriphDriver目录中。“STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\stm32f10x_conf.h”拷贝到StdPeriphDriver目录中。读者可能注意到我将c文件和头文件都混到了一个文件夹中了,之所以这样管理文件,是为了让项目的目录结构看起来尽量的简单。现在,CMSIS下的文件应该有这些:# l& B4 @6 Y8 v3 @3 ^3 V& {5 J

! T6 U  P3 ^' ?9 |* p/ F core_cm3.c
) }' m3 [) v2 [  e" `/ L, r7 B, c' Q8 @/ ^8 l1 [& u0 ^
core_cm3.h2 i; A" Y9 ~) ^' k2 s" W" Z+ h8 m
% d5 k0 h: \1 {& q$ V& t5 M! T
startup_stm32f10x_cl.s4 f$ u2 K, t* a2 [! p5 ~) N
3 r* _7 Y: j7 u' u* }
stm32f10x.h
7 @' }" X' V8 M2 C0 O3 f8 \2 k* r0 p) x# }0 X
system_stm32f10x.c! o/ C8 ?1 |% M; o% y4 ?: S
+ y# K5 |) u- ?3 k/ Z: b7 D- V7 C5 L. t8 Q
system_stm32f10x.h, |& ?  p7 I+ b# u- U9 x# V
+ C0 {! ~" R3 z) Z& D$ B
StdPeriphDriver目录中文件应该有这些:- Y" n# ]7 \8 B

6 I, A/ Y/ p4 W" U& E: X$ {8 X5 F misc.h) s5 N. ^2 T5 S& V  b

4 O2 v' P' G2 B! B5 [* a* o stm32f10x_adc.c- r0 G5 x( N, V& V

0 U: @4 R+ }6 ]& E stm32f10x_adc.h% B6 l. k' B6 @8 C) q- }/ [
, s3 M7 S8 }7 f
stm32f10x_bkp.c& }+ L" n0 D& W; E2 P

! {+ f  S$ ?# a! W' o; j5 T stm32f10x_bkp.h" p) W- z9 W, V
, {" P( p. C+ T7 j) @
stm32f10x_can.c
  p2 d' q# W& a  e8 B* n$ Z& n- O+ G+ _, M8 |! L' V- r/ S
stm32f10x_can.h! u. L' I  h9 c8 ?, h' G3 M

. T8 n- z4 f& o+ {8 c stm32f10x_cec.c" q/ B& {6 y; d  q1 T
7 Z! ~: g8 a# W
stm32f10x_cec.h
. r( R8 j3 n6 e& q* q) X
" K  `1 l" f+ c) f3 m stm32f10x_crc.c
- O/ }  R. M* t% v6 k
+ N8 D* p4 |  w1 g, o4 t$ Z: @0 C stm32f10x_crc.h0 f7 v- O. ?7 I: y! G5 ~. K
9 M3 h2 p7 y9 W
stm32f10x_dac.c
# a2 x+ S5 w; ?. y; p
" F6 j5 C, ~. k: W  v9 m* F2 i stm32f10x_dac.h
1 ]+ ~" C: n, b) B" m2 t" v
5 I' s6 V5 p( G# w% A stm32f10x_dbgmcu.c
7 N  V8 R7 s, g6 l- d: Q) h  a. ^- }* b8 [7 y" H
stm32f10x_dbgmcu.h, Y/ v% R, o1 i& @% b
$ r) M# ]. Z6 j$ `$ O" w( h) ^
stm32f10x_dma.c
, F& o( P  H# B, f! L. c7 c4 X: T" c; {' \4 U6 g
stm32f10x_dma.h
+ A, C; h9 p( k5 q. y: B: _, f" q
. x- |& `3 i$ }( u9 k, F stm32f10x_exti.c* G) T& o  }; |1 s( m) D

+ e5 F" x+ t0 _0 \ stm32f10x_exti.h
+ P! P, k" P. i8 V5 m; s
% K/ m& ?5 U3 ?% v# y4 ~ stm32f10x_flash.c) K# W4 m8 N; s5 I- r

" U% q/ i$ B/ G' w% T& t, l stm32f10x_flash.h
9 q; D9 w* H' T. M% m
! [) t9 ]7 d, s4 O' Z3 l stm32f10x_fsmc.c
( l$ C* f8 ~% p) i8 S! Q. }( w$ z' l8 M  {3 X
stm32f10x_fsmc.h+ P8 V! z" f# F! m( M' y: J
2 k+ _$ }2 V. Q# \" Q
stm32f10x_gpio.c8 A9 q4 ?/ H# Q! V3 j0 }

5 o1 y) J" ?5 W0 g/ B5 ^# d7 S- ]/ j stm32f10x_gpio.h$ [+ Z9 ?0 i; u. m

6 v2 B' r. `5 S- Y/ P: {& r stm32f10x_i2c.c2 w; {5 C6 b+ s1 O' S
8 u1 X0 m6 [( ?2 N8 L- u1 z' N
stm32f10x_i2c.h" C6 [9 [6 \! e3 m, D0 ?1 c
6 h8 V9 b' ?7 z% X- Q; h' u2 X- b# s
stm32f10x_iwdg.c
3 v3 F3 d- W# ?& P( }8 s4 I
8 ~$ N  g  c4 D( q stm32f10x_iwdg.h
6 _4 U3 y  ?' j1 d9 ^) B# ^& C2 ~) p" ^
stm32f10x_pwr.c& |6 n5 Y2 i) ?' V9 Z9 k2 N7 d

7 A$ _: k8 g" Q5 _/ D stm32f10x_pwr.h4 m. A* H, f+ Z# m  D9 |5 `$ g
4 b6 o- p1 {: s+ x( H! x& ^
stm32f10x_rcc.c
/ m3 z: x3 L# ?7 E; w
, \  h) V5 F3 M/ M4 M! c: \$ Z( L stm32f10x_rcc.h
4 w1 ^* D0 r9 @/ a
$ w4 ^: j* N$ m; C! H stm32f10x_rtc.c6 p. |7 A: G! ]3 i# G! J; w

9 g- S) M) Q3 i( b) `+ E3 W9 r stm32f10x_rtc.h
9 [* V  P( ?1 `9 R- w4 C# F
: `6 [' E0 }" u1 z& y; X* t stm32f10x_sdio.c. {( z4 L" l/ u# J% \

4 X! q' p! o9 Q5 b: ^: e5 ~  ~# L stm32f10x_sdio.h' W# g! C6 r5 y; |

" r8 k$ ]0 B: J$ q2 G. ?' M stm32f10x_spi.c
# @: _, p1 x, E( z2 {7 [. _; i: i: m2 |& r, L  w5 F
stm32f10x_spi.h8 \/ n  v; g7 S, J1 M

% c" A. \0 _! D5 X9 K stm32f10x_tim.c
9 S: ^7 x  N* g. K3 \2 o
) c2 ^, F" ?* a  u+ L. w stm32f10x_tim.h
+ l' J5 Q) |, ?9 V- i+ ]5 O8 `* Y3 Y$ d+ z$ M0 f% W, X. w
stm32f10x_usart.c( |( i. f+ p* }7 H0 f6 K
4 B0 w: _) Y  I! C) O
stm32f10x_usart.h
3 Y2 H! g2 t+ _) w( C
, I9 Z5 @. P* \' f, [, ]4 C. k stm32f10x_wwdg.c
& W- _1 a2 R6 y1 Q5 S; U3 [! f( G$ d+ u7 O
stm32f10x_wwdg.h, b; k8 U# M1 j8 y8 M1 u
/ t% a4 R, S# G9 K! X, L
stm32f10x_conf.h
+ t3 B+ \+ b% f+ v& F3 \2 ~1 ], t  E( s  j$ R# d8 P$ ]
对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。: X1 R# B: I8 c# H

! A& X0 S1 V  p" z: e* k! m( s+ ~(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。
( x! ?9 i: P' e& L: N$ q5 g6 O+ F$ \
1 f! `: ]# d3 G; E2 r6 U
1349530228_6018.png
' S/ S+ {/ n/ P4 P% ]5 T
7 ~4 ^1 L, o3 |9 \- H5 c9 v, F
(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。
" z6 K+ m) m# e* I  N! t6 y/ y; q3 X; o
(11)修改“stm32f10x.h”文件。在文件中找到这一段:. b7 ~& l' r1 O
  1. #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) 2 I/ d' M. L7 N) B+ Y( u
  2.   /* #define STM32F10X_LD */          /*!< STM32F10X_LD: STM32 Low density devices */, s5 k# R6 l/ v; F
  3.   /* #define STM32F10X_LD_VL */    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
    8 J& I9 p/ p6 @4 q* y
  4.   /* #define STM32F10X_MD */         /*!< STM32F10X_MD: STM32 Medium density devices */
    ( o2 O, B7 u! e* W' U' [
  5.   /* #define STM32F10X_MD_VL */   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  + I! I8 z/ Z: a$ k( Z/ D+ }1 p
  6. ) E8 e7 P4 J7 j

  7. % h" u2 k7 y6 ?# `( x/ y
  8.   /* #define STM32F10X_HD_VL */          /*!< STM32F10X_HD: STM32 High density Value line devices */5 K7 U' L! [3 [
  9.   /* #define STM32F10X_HD */          /*!< STM32F10X_HD: STM32 High density devices */
    9 H  ?+ o- G0 m$ r
  10.   /* #define STM32F10X_XL  */               /*!< STM32F10X_CL: STM32 XL-density devices */
    3 L2 v' q( ]; {) I6 B9 {2 x
  11.   /* #define STM32F10X_CL */           /*!< STM32F10X_CL: STM32 Connectivity line devices */
    ' q4 O9 _6 V: N! `! j& v) _
  12. #endif
复制代码

3 J2 v" W( S8 B% L将对 “#define STM32F10X_CL”的注释去掉。* R6 u/ T; U, A8 x
: Y! ?4 M, V% F9 B- d! I, K' Y
找到“#define USE_PERIPH_LIBRARY ”将注释去掉。8 @3 E" K- U6 f' F1 A# }4 L

' ?4 T" M9 k, m(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:
* b# M8 U" M( E: ]( D" S9 P2 Z1 H1 Z
) s+ @, X: _0 ^# B
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
    6 a! u+ J$ N( w( B, y2 ~; U
  2. /* #define SYSCLK_FREQ_HSE    HSE_Value */" y8 A) B6 v, @2 C# n3 m# ^
  3. #define SYSCLK_FREQ_24MHz  24000000
    ; w% O; W3 I. v2 S
  4. #else
    1 v& L3 {+ h# W9 D( ^5 Q. l
  5. /* #define SYSCLK_FREQ_HSE    HSE_Value */
    2 N3 C1 f7 D7 u  T' S' E) B/ l
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */
    6 l7 x5 u; u: e  _; A, W  W4 y
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */! Z* o0 |* x9 _0 z% H
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */% r$ B# b6 z* j; v& n0 H. m; k/ @
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */5 a" S1 c- _0 D0 I
  10. #define SYSCLK_FREQ_72MHz  72000000$ M' y3 b' Y3 ^
  11. #endif
复制代码
' A$ P6 q0 p0 F, i8 D4 W1 s
根据板子上的使用的时钟系统来确定SYSCLK的频率。
8 d- @$ p7 c! W: M! J
4 v/ U( W% H( u( l至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。
+ _. h0 O/ Q3 P8 @8 _+ r% R/ n) K4 b( v
下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。
$ H2 B& G. U6 t6 V' Y
6 X4 O9 G$ z6 {7 d* _
  1. #include "stm32f10x.h"
    % p6 a4 E' M) w/ d" p5 z. W* I7 Y

  2. - }8 w6 F' r- e0 D+ g* ^8 P3 }1 t
  3. void delay(void)2 R- ?# m# z+ m
  4. {
    ' T/ ^3 S' E% ^5 `
  5.         uint32_t i;
    4 ^: S( q" |/ l" E9 d
  6.         for(i = 0; i < 3000000L; i++): E! s- }* j# w( C) H1 i! @
  7.         {7 v% _! g5 O0 g( |) r
  8.         }
    / C2 v7 {5 f" m
  9. }
    " U; @5 m* N0 Y
  10. int main(void)
    * V! P2 v( B2 H1 Q+ f
  11. {
    ( ?- }, {; v' [, T# d: t

  12. / ?. Z6 W# W. |$ ?( h. W
  13. - J0 J# C# |5 I1 m
  14.         RCC->APB2ENR  |=  0x00000020;        ) b( {% T2 f/ c2 ?5 n$ Z4 O  a5 a
  15.         GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode  
    : n8 w- z/ `  _- J% ^; ~6 G
  16.         for(;;)/ a9 c: Z& g! D  P+ g; u% D: b  D2 k
  17.         {
      M- s( u8 Q# P4 T" |+ C# D
  18.                 9 l: `* n. s+ v
  19.                 GPIOD->ODR = 0x00000000;+ j- R9 T9 G0 y
  20.                 delay();
    $ `0 k$ K; a; p0 E5 ]( w5 @4 j" g
  21.                 GPIOD->ODR = 0x0000009C;
    3 O: z3 B3 _4 z' q; t1 N
  22.                 delay();* Y& j5 e, F$ ?- S0 \
  23.         }        1 L( n: t  \9 C# o- p9 s
  24. }
复制代码
! h3 @9 U9 z! K' b3 u# \
下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。' u3 |9 ~  z7 u1 p; o
/ k  C6 ?7 J8 P: C3 u7 `
  1. #include "stm32f10x.h"
    ) M1 S* Q: u; Q" u

  2. ' m+ _+ j0 Q5 v9 |& S# X" d8 G5 W
  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD
    " e& p* k* j/ i, X4 \
  4. #define GPIO_LED_PORT                                GPIOD    . |6 Z% d. c+ n7 x' x. k* z$ a
  5. #define GPIO_LED1                                    GPIO_Pin_2   
    # N* G: {/ I& T( J7 A
  6. #define GPIO_LED2                                    GPIO_Pin_3    3 Z6 u/ X5 ^, J3 R5 ]! z
  7. #define GPIO_LED3                                    GPIO_Pin_4    0 J- m! o- O9 O: c, w
  8. #define GPIO_LED4                                    GPIO_Pin_7' a5 }3 T$ E. X" n( w
  9. #define GPIO_LED_ALL                        GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4 $ S+ c$ R2 U' ?, K( O
  10. void delay(void)
    7 ^1 I  z& i5 \( S& |+ y1 j1 s3 }/ U
  11. {
    * h: h2 _% @# h! K  J  m! D
  12.         uint32_t i;
    , Y! v5 j6 c8 j2 e# U4 Y2 a
  13.         for(i = 0; i < 3000000L; i++)! b2 I$ Q: G( ]. k6 p( j) y
  14.         {
    $ y/ |( t  s5 X! I- y/ ^! Y. U$ l
  15.         }, e6 ]; d4 V) }# b7 G: o- c
  16. }7 a8 h, R- O& b
  17. int main(void), C2 d5 B. E8 M, ]
  18. {
    " v7 p, |. }8 L8 D" u5 G. g/ q7 u
  19.         GPIO_InitTypeDef GPIO_InitStructure;# _4 G! }; H! E2 x
  20.         SystemInit();
    4 g5 ]: L1 ]( M* @
  21.         /* Enable GPIOB, GPIOC and AFIO clock */
    ! g2 G% O" K# m9 {$ @* J
  22.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);  
    # c8 Y) p0 m, t1 ]6 ]1 Q- v
  23.         
    : B' l& m+ \/ [4 B- o+ {
  24.         /* LEDs pins configuration */$ ?5 u; ?7 }) U: Z2 n% V
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
    $ d3 ?* ^3 G. g: c- @
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;" X2 H, X, ?" `+ F6 {) [
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    % b; q# t3 K5 a- }
  28.         GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
    5 w( J5 [5 z' v. S
  29.           ?( w. q) Z, _/ Q: D. ^
  30.         for(;;)
    % |4 b) L) D5 o8 X
  31.         {, {# x; Z! L" u+ g6 I$ j1 F- B
  32.                 GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    # _, j3 a, N% i& S0 G" Y* b+ A
  33.                 delay();
    ( _0 {0 K7 R2 F9 k
  34.                 GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    4 T' Q0 P$ {5 I9 c2 _
  35.         delay();
    " A7 J0 N. q: A/ \& q
  36.         }        / e& a# B1 x+ l
  37. }
复制代码

7 f% n+ l: ?+ R! h编译程序,在链接阶段报错了,错误信息如下:# b3 _5 h$ ?. X4 A* w' F

9 y, y& Q: _, C5 O8 D
  1. Build target 'STM32F107'0 U, w6 X3 Y* K1 a2 [
  2. linking.... `' P4 Z" D5 J
  3. test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).$ e4 r5 l" x6 f' Y) |4 N) L
  4. test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).3 s1 i: h+ e! ^+ M( _# N' \$ N
  5. test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).# Y: h5 l1 o- b
  6. test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o)., |" A( h$ T, K
  7. test.axf: Not enough information to list image symbols., \8 V2 Y9 D9 E
  8. test.axf: Finished: 1 information, 0 warning and 4 error messages.
    / j7 {1 |" W5 y2 T; }
  9. Target not created
复制代码
; E  o! \5 r4 r+ ~" o3 C
+ q- a) s+ A6 _5 \

3 U0 z1 h( M" Y4 ]  Y8 D& l" y( Q* `2 D) |
说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。
( v% i+ e0 v4 _3 ~8 a' _9 G
9 h1 P: t& U" O; ^" i上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。! v! j% y9 F9 F& C% M+ w8 j- u

) y+ m# Y$ c9 o
  Z1 V7 f) V' g' V& k. D
5 C( v# U- @3 |5 A
: a* N. R4 v0 _
收藏 评论0 发布时间:2021-11-28 21:00

举报

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