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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 21:00
前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。
; v! b  ~+ H/ n8 {% }8 t6 k/ v; o2 V
STM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道)$ {" H; h" @, D6 i8 f7 a- k

6 @1 p: K7 ]& E首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。$ e1 u1 |1 ]6 o6 V* v  e

4 v4 B6 Q# K3 v5 y# hIDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。
* J8 l& H: F3 v5 @$ Y" K0 _& K0 F: w9 A- w2 E! i
总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。# ?+ h6 H# V( e0 Y& B1 Q

2 m' Q% E0 g% S. F1 n6 q不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。
% ]. w9 k4 D/ _) O% ?) R% m" @0 e6 W5 F4 X( _) b) [; P- ~3 \+ @# }5 t
(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。) y: q6 s; K; V/ B. p

+ W' A- z) x% G9 _+ R( V' r(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。
+ B/ v, b9 a+ h, J+ E9 O1 `9 {3 b' h! |$ Z) A1 t5 Q3 V
1349530026_8394.png
- m3 P' Z, e! y% `; \2 x4 h

! S1 o! `! h+ m(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。: {! e9 w2 p/ i. u! p
, _3 w+ p0 T% F7 ?8 c
1349530056_9517.png

, R8 q3 p! t0 J! i* I
5 ?  W' h. H: q(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。$ _' J( @* J* F

/ A0 o% J, r+ _) `8 q  j- V' ](5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。
! P9 t- F" A' I: t+ V0 j0 @1 N) e8 U2 e2 u  x& R
1349530114_2653.png

: g+ ~) F3 @% s( Q& S4 ]" @+ T# X, b2 ]9 L4 ~
(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):* p  e( h- e# @) Y

# S3 }4 P. q, a* J, c CMSIS' f; Z1 _4 _* T. _5 Y; y9 {

* m( H; t0 b) D- F" z6 B9 c Source/ I+ U% W- L# @9 `3 q9 S: Y

( x2 D& m& W7 ^ StdPeriphDriver
( c+ a# M. J+ I: {4 M1 n$ M
# n/ |, D1 ^( p test.plg
# v* h$ f5 R  ]# ^/ d0 i
" H% y& X8 Q  j/ h, A4 l$ E5 ^' _ test.uvopt% D! L" _- l! O, h0 _
( `; P0 G9 p4 O# u: z
test.uvproj; P! B6 l* _" y2 ?! I' y

# M; @3 B% Z  n test_STM32F107.dep9 g' B3 A6 v( {: L" z/ u

3 V( }% u2 I) \2 U7 H  U4 T& v7 v  O test_Target 1.dep
9 t; y! j" u& w9 v9 k
6 y! D7 g, j5 u0 G8 [5 ?2 s(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,需要换用合适的启动文件。4 u& n, S; x9 _& X; I" e
1 G4 [! k( |8 M, m+ H; r+ V
(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下的文件应该有这些:4 I+ Q$ {" z8 M7 L) x
7 a  ^6 ^& T0 o* N2 r
core_cm3.c
  T! G5 \0 o% n! \5 H
& g2 C' Y8 v- ^+ e0 ]2 }, Z core_cm3.h0 N5 W4 M) K, p% G8 Q: ~  y
8 g; u$ C0 ~% ^0 p, @6 z% `
startup_stm32f10x_cl.s
/ M  f% J% g- Y. `  o; d6 X
. @0 `* G6 E* b4 ~ stm32f10x.h
7 Z6 z. a$ n+ g, {4 u& Z/ ]; n; z0 D! |9 g4 ]9 S/ P* C
system_stm32f10x.c
4 T/ O, k1 y2 Y, l/ O$ ~& a" h8 u6 Z6 c7 k9 U
system_stm32f10x.h0 |9 F5 m1 g; E/ x+ q( \  t

3 G/ z, {/ X7 B2 SStdPeriphDriver目录中文件应该有这些:9 z6 J8 f' C: d0 p; y

( H" g: C/ D  |8 D misc.h2 C1 f$ p2 p4 J: i! @' z8 P$ ^

/ c2 E. {- n' _$ \ stm32f10x_adc.c# ^$ ]: `8 F/ M4 S% A

. `, Y/ t& c+ v9 b stm32f10x_adc.h/ A1 b4 N0 E+ i* l# |! Z# p: M9 y
/ D, H' i: b1 ]# v
stm32f10x_bkp.c. f( ?( x4 K- R# L' J; p7 _0 g
  O0 s) A: A& i8 a% ]
stm32f10x_bkp.h
5 M' U* h3 t6 u6 ~8 U, v8 C& H8 b4 I' s% l- \+ U
stm32f10x_can.c
+ q! p; h8 {( A6 `
3 l# _4 d, C: h2 c: N stm32f10x_can.h' B# b# Z' M& D: _" Q9 H
3 f+ Z/ U: W( s$ I" v! `- a
stm32f10x_cec.c& m/ B: B) N3 P; R, K/ z* D) N
4 i, L+ D# ]+ k8 ^- \! j- g
stm32f10x_cec.h7 M. M8 }! h  d* E8 f

- G/ g; c- a+ k/ Z2 O0 ` stm32f10x_crc.c
+ U: j8 L5 H" H& M/ f. y; s* \  z, A, S. Q- R3 ~4 K$ ~
stm32f10x_crc.h4 ]. ^# u$ a- M% \  W  ~
9 ^8 E, D/ D6 J; w9 y* J
stm32f10x_dac.c! G4 o4 [+ d* i0 _% s/ _6 V
0 g* b$ E# f# R- ^$ J& \' d- K
stm32f10x_dac.h
6 {+ H6 F# c5 o) v3 C6 k. Q5 x" w! l/ M/ d' K. T% @
stm32f10x_dbgmcu.c
. G0 `; p; N. k; K+ n1 d  `' ^9 m
7 F, Y8 e& W" r; H0 h; J: w' F stm32f10x_dbgmcu.h5 |+ U* c) r& ?9 G- I" t. L

! g/ y/ `$ c  A% Q stm32f10x_dma.c8 k: O: j, @1 I

" P. C7 J. J9 ~( T! W/ L: ? stm32f10x_dma.h+ ~( ~/ U/ k( X; ?' X! U

5 Y& \1 L- r* ^# I1 M stm32f10x_exti.c
' H" ?3 Q- @. t8 F' L- O0 l
( r& x: }+ J: ^' h( T stm32f10x_exti.h
" F* t' [4 O( P& w# E. F2 G  {9 y- G  l9 `  W3 {6 v
stm32f10x_flash.c# d6 p4 H+ ]5 f" E
2 U) v# v1 P  m$ G
stm32f10x_flash.h- n9 a: g: T1 A' ^
& A, v1 v# h. A0 c% N- B
stm32f10x_fsmc.c3 d0 a$ ?' T3 J2 o5 N

3 C5 v0 i, @5 q( G stm32f10x_fsmc.h
# o5 g0 J  w8 m5 R! }% v' c
2 s2 G. g, H# K. U stm32f10x_gpio.c* o) ?2 o0 U: W* ^
- k* W; V1 L0 Q* Z3 v; d
stm32f10x_gpio.h# R0 K, O4 s3 T
& K8 }" b7 ~7 X0 K
stm32f10x_i2c.c
- {/ ?( K( q  I4 ^
- [1 K$ Z. C( E) h  U1 f stm32f10x_i2c.h# J$ P: w: A0 x+ {3 \+ {
+ d% _% D0 T3 j3 m' e3 ?6 v
stm32f10x_iwdg.c8 _* P/ N: b% R  P% H- c
" o: m9 D6 v5 j! K# W! H/ P6 y+ e9 E
stm32f10x_iwdg.h
. m$ u9 r/ W' i7 E: z$ g# d  Q* i% j# E1 M, Z5 p2 L0 l# U6 U2 U
stm32f10x_pwr.c) T6 R8 {7 p* z6 l4 d: u

) L+ M) e. T3 v: y3 t- O stm32f10x_pwr.h
; T3 o7 ]. f- k
7 F; u& {. R7 V6 w8 M4 ]# [# } stm32f10x_rcc.c
9 U' g: E7 }3 X" X' ~" t3 z( M' J$ o0 Y5 p. E
stm32f10x_rcc.h0 L# I# t7 t9 K( z- E+ L( ?
$ o7 X+ |0 f7 Q2 b3 z$ b- L; Y9 V
stm32f10x_rtc.c8 u/ X0 p/ D; @" A& f- R

! _& n+ F6 ~: D" ]5 _1 S# | stm32f10x_rtc.h5 j3 y% E5 d8 y5 f+ E1 {
) ^  `8 P) A& ]2 K
stm32f10x_sdio.c
& P1 \+ l5 F. c" g6 c
5 f' o  A7 c3 r2 L1 s# ]8 w stm32f10x_sdio.h8 T  L' T& i5 ?3 M) Z- ]; t

4 f: N5 I3 o( a' O# s7 K stm32f10x_spi.c
; m2 E  i" s$ h; S# }1 ?/ L" ~% S0 [
stm32f10x_spi.h" n- f, f  }4 U+ A4 t7 P
1 g# x" c+ }- ^4 R; O1 ^
stm32f10x_tim.c
0 ^. Z7 A) ]9 L# ]; G1 q& W5 ]3 ^$ }6 Z/ }2 x
stm32f10x_tim.h
; Q  T+ E+ b3 {1 ~1 W1 ~9 V) Q5 i5 [& a# _3 ~
stm32f10x_usart.c* c) l3 i3 x. |, K

$ b3 s4 a" f- T/ j: a1 b stm32f10x_usart.h. D# F* h# o; y3 ~% w9 s! `2 ~! H

: d* X& O5 g$ Z4 H2 ~5 M% e5 U6 ` stm32f10x_wwdg.c2 w- v; m6 h  n4 E' X4 N, i+ c

/ h8 M* ^) M% a% p stm32f10x_wwdg.h- D- c6 Z+ Z/ j2 U
# v* l5 z$ v0 s0 Y
stm32f10x_conf.h) t% h' V& n( w( N6 w* p# v9 }) |6 F

* g8 M+ I' H  J. D  ~' v对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。
- N# y7 q7 J/ ~* t- [% `+ j8 K. W, _3 a& d9 R" _
(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。" }7 V- b! I" v

) y* d; t( S' T6 V: V
1349530228_6018.png

) {& x0 x$ f  I& R+ l. U! ]& G& Y2 w$ I  P3 T) t
(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。9 ]5 O6 S) `  y0 _! b. E

  g3 U) W- X7 g3 v! |8 t(11)修改“stm32f10x.h”文件。在文件中找到这一段:
& H" w- u, q$ N( z
  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)
    " w# s7 r4 M/ ]( K4 E9 u
  2.   /* #define STM32F10X_LD */          /*!< STM32F10X_LD: STM32 Low density devices */5 F2 V/ m+ J$ u4 ?* M! `; s
  3.   /* #define STM32F10X_LD_VL */    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  6 y' m9 X* K) N5 r* h* w
  4.   /* #define STM32F10X_MD */         /*!< STM32F10X_MD: STM32 Medium density devices */
      G2 |* m- G' E
  5.   /* #define STM32F10X_MD_VL */   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
    # D0 K0 X4 C, O. m

  6. % S8 Z2 f8 r$ a( x
  7. # C) O! ~  b/ s% h0 d
  8.   /* #define STM32F10X_HD_VL */          /*!< STM32F10X_HD: STM32 High density Value line devices */# M! `. P/ Y" u' l9 @0 z& @
  9.   /* #define STM32F10X_HD */          /*!< STM32F10X_HD: STM32 High density devices */  O+ i; K7 s+ \( ?3 ?: O: f. }$ X
  10.   /* #define STM32F10X_XL  */               /*!< STM32F10X_CL: STM32 XL-density devices */
    % f  L" K6 z7 R
  11.   /* #define STM32F10X_CL */           /*!< STM32F10X_CL: STM32 Connectivity line devices */
    & ^6 ^2 c, z; {8 H% R4 V
  12. #endif
复制代码

1 ?8 j! _8 `9 ^7 Y: E2 v0 N将对 “#define STM32F10X_CL”的注释去掉。
6 D1 g4 b: c9 j# Z( N7 Z
: k5 r/ B: c' M8 Z- h: E$ M  p1 u找到“#define USE_PERIPH_LIBRARY ”将注释去掉。
1 o0 }( V# ]& n6 P: k
% d, V4 t/ i8 C; J. z3 K(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:8 A- q( a% t) P& e
9 R: ]* d" V4 q3 W. `1 K
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) ) {# x9 p: ]* G+ L
  2. /* #define SYSCLK_FREQ_HSE    HSE_Value */
    , S& w# }3 y6 ~0 e+ w( t
  3. #define SYSCLK_FREQ_24MHz  24000000
    2 e( K9 P- u% Q( R
  4. #else
    ' ~8 T' Z) V/ p/ O7 i
  5. /* #define SYSCLK_FREQ_HSE    HSE_Value */! p6 A+ |( v) x
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */ 4 b5 |; [, \; N3 G. d
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */
    ( D7 M2 R  s- K* k2 _/ K4 G- }6 H1 F) `
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */% L  @) o) v$ {, E$ H, ?8 F4 T
  9. /* #define SYSCLK_FREQ_56MHz  56000000 *// N7 E5 ~0 j6 `. w: a# C& H
  10. #define SYSCLK_FREQ_72MHz  72000000
    2 A: G- {. A1 B3 }* A' P
  11. #endif
复制代码

+ E7 w! n: @, L3 u根据板子上的使用的时钟系统来确定SYSCLK的频率。( b! l) u2 x2 u  v% ^1 r

% b2 R, z8 L( u. {" n9 R至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。
8 C1 k/ ]3 G  f$ G6 X* F7 ~5 e0 v5 D) L0 |3 V" V
下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。% v# |2 W- B8 j5 K+ x

6 _* d9 a- Q6 f/ b! P  \
  1. #include "stm32f10x.h"
    2 I6 N3 z" P/ w5 M" i  V

  2. ' k' R% J: v2 _0 j
  3. void delay(void)
    / q$ E1 w& p5 O3 Y7 n+ o
  4. {
    ; |, ~% ]" Y) G9 u; p8 P  S
  5.         uint32_t i;
    ' p" D& _( ?9 E! N
  6.         for(i = 0; i < 3000000L; i++). w& E7 X# ]! u1 b  Y0 s. K: B
  7.         {
    # y* V) w* T8 x1 g' Q. `* ^) W
  8.         }
    # e% S8 t* q- E4 E$ Q% H4 ~
  9. }
    , v; L: ]% @2 H3 P- \; p2 F
  10. int main(void)
    5 i( ]$ P# U* \# e
  11. {' x1 ~- k, j. a" c

  12. & _2 a) N% K: q8 Y7 `6 D9 o' S
  13. 2 I0 Z$ T1 z$ g* ]% U2 o
  14.         RCC->APB2ENR  |=  0x00000020;        
    8 ^+ I4 N7 E( _6 D4 _; u! e
  15.         GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode  
    " t1 A% w2 h( `: E! R$ S
  16.         for(;;)& ]; o: C) }1 V3 N5 D) m
  17.         {
    9 Z+ H2 \; C" S
  18.                 7 k% A. e) @. e$ S0 J# _
  19.                 GPIOD->ODR = 0x00000000;. W3 [: E- ^7 c  }% |  K
  20.                 delay();; y& p! G6 q2 `% h
  21.                 GPIOD->ODR = 0x0000009C;% r# I9 i' u) I) M5 ~
  22.                 delay();' d$ p5 h7 D* N% N+ h& K" P
  23.         }        & \3 u* _% \9 Y7 F# i
  24. }
复制代码

4 X7 c$ a2 F2 l6 Q下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。
( \! g. p7 s8 `! f% L8 U- X1 ^2 G3 ?* U& R9 y. }/ Z4 E
  1. #include "stm32f10x.h", V! [3 y. ^9 i( ?
  2. 4 T/ m, h6 u0 e  s0 f
  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD
    : P% h" O7 ~, t  v  ?8 ~/ K
  4. #define GPIO_LED_PORT                                GPIOD    / c. `- g* k% ~  v
  5. #define GPIO_LED1                                    GPIO_Pin_2    2 @1 Q" e6 |0 F7 \$ d, F; t
  6. #define GPIO_LED2                                    GPIO_Pin_3   
    * ~- d7 t6 ]7 z2 `. H# p
  7. #define GPIO_LED3                                    GPIO_Pin_4   
    . b1 A0 a. Q5 O; ^/ e( @% {
  8. #define GPIO_LED4                                    GPIO_Pin_7
    / G/ ?8 e* x$ Z+ ~; R
  9. #define GPIO_LED_ALL                        GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
    ) ^+ g) H9 n& `* _/ |. T/ s2 K
  10. void delay(void)
    # G7 I' b9 a1 l# S
  11. {
    / c% `6 B2 ~- ?" H0 m8 e! @- n: G
  12.         uint32_t i;9 X8 M5 {8 [8 x' F( i3 ^7 M
  13.         for(i = 0; i < 3000000L; i++)
    # D& i* j3 O: E
  14.         {
    & K4 L2 A0 ^' q; x) D$ d( h5 a
  15.         }
    5 }/ ]; i' [) u# S7 p# g/ ~4 N; }
  16. }; K0 I& h, y- z  p
  17. int main(void)
    8 }* w1 {# d) M' R6 ?4 O
  18. {
    4 A0 m! C+ i. V( ]. ]9 Q9 C0 I
  19.         GPIO_InitTypeDef GPIO_InitStructure;7 ~( B" i9 g% d% {0 K( _$ \1 W
  20.         SystemInit();
    5 }% b7 \, O0 ~9 o# E  `: F
  21.         /* Enable GPIOB, GPIOC and AFIO clock */% t. K9 [7 S% A
  22.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);  
    , K: M- D& B, X, y% t
  23.         
    0 H( `7 G- s0 J0 `/ v5 M3 V
  24.         /* LEDs pins configuration */7 Z! ^: M- n0 s3 _
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
    2 x1 q: r/ p5 o7 H' Z0 W/ Z
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    , b3 Y) c; g1 M0 Y
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;; s+ z2 C% l) k) ]8 |4 v
  28.         GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
      ?$ S6 {# v- t8 n0 W
  29.         * g# i+ G5 J0 h% Y1 i
  30.         for(;;)+ u( c4 f- X/ ?7 x( w" {) O9 C
  31.         {8 |( _( e( P3 @$ a3 s5 r3 D8 x
  32.                 GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    4 ^/ C! A& G: _/ g
  33.                 delay();
    9 t4 }! j3 T6 g" {. }) w
  34.                 GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);5 N3 |1 z3 z6 t: \
  35.         delay();1 P4 a/ v1 ?8 J: f% o
  36.         }        
    3 P/ C  B& r" m* N! B
  37. }
复制代码
( ]" a, l. g6 G5 {! X7 q
编译程序,在链接阶段报错了,错误信息如下:+ ?" p# ^. W) n3 ~6 T0 g
- T+ T: C5 q4 s! z' c( u# A6 Z
  1. Build target 'STM32F107'* d8 J" R  J* F, g# S" z- t
  2. linking...
    3 w# N2 E" P% T) V
  3. test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).
    ; W6 }5 {- z$ ~1 C$ R6 m
  4. test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).1 e4 V* t8 Z: b2 g, y) j
  5. test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).
    9 o$ e1 {5 M$ E' S
  6. test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).
    " Q& u3 o$ C9 R+ O, A
  7. test.axf: Not enough information to list image symbols.% z# v: U  X# e# {2 [$ K; _$ G
  8. test.axf: Finished: 1 information, 0 warning and 4 error messages.' J/ w+ L2 K5 ^6 r; y+ @, S
  9. Target not created
复制代码
% |4 v) V# n" C
5 l5 P  t+ h  I! n

* m0 U. @% Z) |; [. Q6 C8 y2 j
7 u! F( o- G5 ?! w: g说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。! l$ D/ B3 M! f8 K5 K
1 P! i' r$ F& ~" E. h
上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。
9 t, K3 |+ T9 O/ g% \4 }0 n) F$ q8 v1 l+ c! b1 H% d

9 s/ q+ S+ o! m: M2 j9 _
- ~8 d. M. f9 z$ k" u
* }. k5 {& F/ I0 ^/ e
收藏 评论0 发布时间:2021-11-28 21:00

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版