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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 21:00
前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。
* f2 w% f& Q# n% `2 S1 ]6 @4 ]& a9 J
STM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道)/ d0 S0 ?4 V: I) L! }8 u7 Q8 e& {2 m
7 o7 G7 v/ O% j) }. ^
首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。
* Z( a$ C/ N! e( B  _& Q, s4 b6 V* q5 {; h9 ^
IDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。/ V. W5 ?( j8 q1 A

; I3 A5 B+ z# o' E/ L- a; l; y总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。
8 a' H9 L7 Z& H1 m+ s8 g# I, Y8 s  N1 a( M( m; q4 v
不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。
6 j0 e5 [& f2 N% i
/ }1 R3 |* J8 Q- k0 ?(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。
) N, i" ~: N( |  U
/ x1 v, `* k6 y; L7 ^(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。
% c8 |6 q- {. Q8 H& S+ `# S) T  f, k( F; [2 l$ j
1349530026_8394.png

+ k0 p3 C9 e" g5 t4 r! N( D/ D" j" T; }9 z% c
(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。; J/ l( g! H% w& h5 O, Q( L
2 K. _1 Z! G  f
1349530056_9517.png

) h4 B1 [* ?* P9 T9 U/ y6 O1 y& ^+ C! a8 i) n3 O- I
(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。. u- m% U! I( t3 p; [7 ]0 S
. F6 W$ L" ^+ K
(5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。
# F# ?( c! ~1 m5 |
8 j7 E& O0 Y. J) H* s, z+ [* G* ]
1349530114_2653.png
( Z% t0 J7 e$ X) `6 F

+ J& j% @9 g3 B7 Y(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):" D2 n2 o8 b& m2 w4 Q
! q# n$ s, l- A2 T2 x) ?5 o5 }
CMSIS% p# B& b6 `0 \

! p4 x1 \0 ]/ C9 s Source" O2 O$ W( b; X5 {1 ?5 e0 `
: j$ W' O& K. u  Q; ]  r+ a
StdPeriphDriver, N" C4 x6 S1 s9 d% [+ Y; v0 [
5 a0 h4 j) N: F' j/ V0 b. b
test.plg5 k7 E; h- k9 n* K5 M. K+ D6 p
& m. X+ n# b8 P& f& z0 \6 \
test.uvopt, K& y1 l# `  y, }8 s8 z

5 c# R8 d, t% }) B( ] test.uvproj+ H! c" M& @! ^9 J0 n: C

' G+ p6 `" h/ ~. g test_STM32F107.dep
4 t* N. n' P8 w0 a7 n! k' R' }
! Z3 D# m7 S+ R test_Target 1.dep; Z( \* q8 `3 h
. Z1 G- V# Q7 p' 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,需要换用合适的启动文件。! l9 R2 N7 f- w$ q
  W9 ], H3 j! A" |; u1 O. p
(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下的文件应该有这些:. t: E0 d3 x8 p4 w: M

" V: A6 S+ _7 L* q2 t0 q core_cm3.c
$ T# w: A; D( U) n2 v: I- z( Z) N
% D3 [, B, h7 U3 I9 e2 r' n. D/ V4 r core_cm3.h
5 A  u0 C$ ~* M6 J
% Y5 L+ i" @9 M  V/ X; s startup_stm32f10x_cl.s
8 \8 z& U; _7 R1 X
6 L7 n0 f2 X5 s! J) w% u stm32f10x.h1 ]9 y, w7 e9 X4 [9 J8 m( Z

4 F! E( }( A7 I system_stm32f10x.c
% d9 s+ z! d/ b# l0 ]" B
0 C: |! ~/ }6 K" R  c% A, F7 E system_stm32f10x.h/ ~3 N( T# u$ c5 B! J% ?
6 w* k; B5 x$ a$ J2 ?/ C
StdPeriphDriver目录中文件应该有这些:9 ?+ P" X% v! I- G
3 a1 h/ m# y2 l! O
misc.h+ S7 W3 o6 K" `/ H

6 ?; p* K5 C6 \" F2 ^ stm32f10x_adc.c
8 C5 z$ n9 Q8 [/ t# L9 t. h" t; G( z- Q/ q
stm32f10x_adc.h
" b2 V1 H7 g- L* P. Z% Z% A- {7 x6 @' g; o8 k7 b5 l# w- X
stm32f10x_bkp.c8 b* q, m1 Z: d7 h
1 V* a: Y: z& D9 G0 `
stm32f10x_bkp.h! `0 M, T5 m( Z4 h# {
5 n0 _1 Y* v9 V! k% Z
stm32f10x_can.c6 v+ b) h; c4 `$ {7 U+ s( k
9 P$ S, g( T! C. Z9 `8 u& n* H
stm32f10x_can.h$ ~! R8 o/ ^& V7 E# y% U- [. ?  N

- [+ u6 z% c1 I( d2 g! ] stm32f10x_cec.c+ O# O* n9 |! C
- S3 l9 y$ J- K0 R- A+ P
stm32f10x_cec.h
; o$ K4 _& y1 z$ J# J$ I+ {3 P
# m( Q1 v/ _5 M stm32f10x_crc.c8 f% E1 }: l( S9 t" t% W. O% E

8 y( o, V' w( F3 d- N, f stm32f10x_crc.h) X% b8 B7 c# R1 c4 ]7 r& b
6 b: u% U# \& T9 V' p
stm32f10x_dac.c
9 w4 s  L, \. E/ d, z& I
! e: z2 H; _+ z4 ?& b* O' ^! N stm32f10x_dac.h
3 k# s6 Z/ U6 }2 b9 n, r! R' w+ i5 m5 W* X# E
stm32f10x_dbgmcu.c
1 y: A# ^3 r4 z( g( I2 }" N$ ~1 i: ]  G  h: k+ p# F- V* I2 T
stm32f10x_dbgmcu.h
* E4 m/ y1 ~. b/ v' Q1 J
9 D' T0 [; E+ n& U, z5 r; T; ]8 s stm32f10x_dma.c% \+ e* Q; w. I: Z% j) V2 h

' {: E; \# J8 s) e. z/ |4 R( d stm32f10x_dma.h& v+ Z' E9 V! K' w, O
2 P0 S. s1 _: V& q! {* O) ^
stm32f10x_exti.c
* s  k, m  ^1 e% g- ~" |; O% A" C1 l. a  J3 ^
stm32f10x_exti.h
! |0 Q* ^& u" o: B' w/ u4 f  _# Z, D9 D) G4 j0 }- K/ s3 y4 e
stm32f10x_flash.c/ e- @* q4 D5 h' X0 F
0 T" ]: [5 |9 M) p
stm32f10x_flash.h; m- `# I  x; A: f+ p5 |; o

+ W- v+ S5 B8 ?+ z) G4 ]9 I stm32f10x_fsmc.c+ \% S* M" j7 G$ U6 s' v$ Z

: G" ]  R3 z" [& @5 h  r stm32f10x_fsmc.h# A& l. T$ ^  t
2 x6 \4 s3 U+ W. X, z
stm32f10x_gpio.c: F) K5 w! }2 ?+ h8 ]" e0 o, e) U

( A8 ^) O1 G! t8 U* Y8 C' Q stm32f10x_gpio.h# g. v9 o4 [- |3 B, g) Z

; l, I8 J4 F* A+ ?9 Q# s+ u  R$ u6 F stm32f10x_i2c.c9 ~( R, U' d' t, w2 Z
0 ^4 G, c7 G1 s" x* X
stm32f10x_i2c.h
( |1 |, p( }8 y) r  t# P6 v9 E% C; D3 W! _% a2 y1 d$ o
stm32f10x_iwdg.c% H- f+ y4 {& L" h, j

% d9 ]6 r' u$ y3 ^  | stm32f10x_iwdg.h
# k/ m+ D8 ^. H1 S
1 t" n8 P" t, C  u# }6 D* y1 x stm32f10x_pwr.c
7 i' x9 a+ o& D$ f2 {# B, i+ b6 l! ^+ O( \- U
stm32f10x_pwr.h' p2 h8 }9 d8 X$ x7 B

( c  _7 J* C$ F! f, r5 i stm32f10x_rcc.c5 ~# x5 H2 `3 @% x9 y8 {8 H

2 X* [- s- R6 ~0 p+ |( `2 n. G" P stm32f10x_rcc.h
7 c' `/ T3 {/ @3 G* k$ R
$ D2 `4 ~# R% D( {* d) @) J/ [ stm32f10x_rtc.c2 S# O$ G. L- v$ L
1 S# ?! R0 b( D6 q. q; w6 Y. B$ D
stm32f10x_rtc.h
5 O5 c2 o4 h0 U1 n* \  h2 z- A$ u& o$ Y: _6 ^1 ^
stm32f10x_sdio.c) o- F  M! J3 g% O6 ~' s0 B" _9 v( D

) k% R0 Z8 Q# K5 p& Y stm32f10x_sdio.h
5 p( d$ D" \9 M4 m  ~/ w7 H" X& l0 W) j6 w# c; B
stm32f10x_spi.c0 _8 {$ d, W2 |. w$ W1 Z

) U, _$ c  C; L" C8 [: C stm32f10x_spi.h
( I/ O( P* u% [4 S+ w
8 `3 V6 |/ |& N& _ stm32f10x_tim.c8 m: I; S. w' L7 G: Q. q

" a* y8 I, F! x( u% ^7 w stm32f10x_tim.h0 B2 T: Z' r1 Z6 z

3 [9 C. f& [! O2 Z1 p: a stm32f10x_usart.c) ^1 r5 U" Q$ ?) {. v

$ _4 Q8 Z& f$ } stm32f10x_usart.h
; P8 G5 l3 Z( G- h1 ?) P: F5 Q4 J4 e- s8 f4 I% B& F
stm32f10x_wwdg.c3 E$ f$ ]1 D) @+ d8 {8 ~0 M
- ?) M& y" g% W! n8 @: ^4 _
stm32f10x_wwdg.h6 i) s* d' {% @6 [" o
/ ~; U4 P5 ?8 H/ m
stm32f10x_conf.h
. Y) _5 q, @3 D! W/ q1 K" H. Q% @' }' T# k7 u* W
对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。
' H6 _' \. [* Y* s" I
6 g5 Z1 ]1 F2 t1 P, _4 |(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。! d7 K! `2 e- V/ A
( B0 Y$ X  K( k3 }* p) S
1349530228_6018.png

) t# I) a! `" X: {% h! q. b( |" v- s3 W5 c, ]$ ]4 `6 E: h. o
(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。
9 o* a3 {5 }1 M* |5 X; t4 K: \4 J1 k4 o7 |# O3 h
(11)修改“stm32f10x.h”文件。在文件中找到这一段:
- w" U# S. B. S5 Z7 U, W  E
  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) $ O" p# E& e3 _% R2 `
  2.   /* #define STM32F10X_LD */          /*!< STM32F10X_LD: STM32 Low density devices */2 v, x0 L- D! N; \+ C6 k3 @! R
  3.   /* #define STM32F10X_LD_VL */    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  1 B' g  r* ~1 A9 m6 x
  4.   /* #define STM32F10X_MD */         /*!< STM32F10X_MD: STM32 Medium density devices */
    6 H1 A9 i- O9 x
  5.   /* #define STM32F10X_MD_VL */   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  + ?- _! I) j# w' E
  6. 7 E$ _$ |! W8 w0 L7 O% X  N$ w5 v
  7. : ~2 k4 U" W8 a( e' Z
  8.   /* #define STM32F10X_HD_VL */          /*!< STM32F10X_HD: STM32 High density Value line devices */3 H/ {2 j. O6 v/ ~3 s
  9.   /* #define STM32F10X_HD */          /*!< STM32F10X_HD: STM32 High density devices */2 A7 ^- B2 \, t9 \  E
  10.   /* #define STM32F10X_XL  */               /*!< STM32F10X_CL: STM32 XL-density devices */
    1 |  N0 b3 ^2 _
  11.   /* #define STM32F10X_CL */           /*!< STM32F10X_CL: STM32 Connectivity line devices */
    - U, a" t1 ^9 D6 B3 N5 V9 G
  12. #endif
复制代码
, I6 A" |. ~+ {0 h& s4 [
将对 “#define STM32F10X_CL”的注释去掉。% o* q7 z% R- H0 y3 D' @7 ~8 j

  D. X5 }! G3 J" }; f6 f找到“#define USE_PERIPH_LIBRARY ”将注释去掉。
% ?" v2 ?8 c+ W# o/ {: X1 `4 `$ D4 y$ h$ i  x
(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:. V5 T6 U& s' {8 C
' v( J8 ]" k  q1 _/ {6 y
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
    $ p* [* F5 n3 u% t% |
  2. /* #define SYSCLK_FREQ_HSE    HSE_Value */
    , o$ g& B" p# m- q3 J6 e
  3. #define SYSCLK_FREQ_24MHz  24000000$ W+ p5 b9 Q3 I* w9 q
  4. #else4 m6 \4 e0 N7 e
  5. /* #define SYSCLK_FREQ_HSE    HSE_Value *// z+ A* X6 C3 |9 m6 Y# n6 }6 U
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */
    * P0 j1 t' P0 d/ @- _3 D
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */
    / U$ g! [" A7 |, d1 P
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */
    9 l, z( m4 n$ q
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */% X! \8 F' p  C- I$ e' ^+ ]' q
  10. #define SYSCLK_FREQ_72MHz  72000000
    ( T+ B" y( p3 L1 w4 _# r: N
  11. #endif
复制代码
' Z, G" d1 e0 f% }* S2 T
根据板子上的使用的时钟系统来确定SYSCLK的频率。9 F6 h/ Y- k  z5 q) r& w7 x

: J! v$ Z; ]% Z1 \. k  B至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。
2 d2 T# C9 c. y. W8 U9 R+ s
) e' T8 I/ W( ^5 D下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。  R  U! b" A8 E

2 ~& g' F( N4 o# g' R" Q& Y8 R
  1. #include "stm32f10x.h"$ c; ]6 x5 P% Z( z
  2. ; D/ h% N, D; g: y7 f
  3. void delay(void)
    ! [2 R2 p1 {9 ]0 Y9 y
  4. {
      k9 n( N3 S- H# m8 ]" \* N3 g
  5.         uint32_t i;
      u* A0 Z  U! z* u8 _8 w/ l
  6.         for(i = 0; i < 3000000L; i++)
    2 E+ a. n; }( U
  7.         {
    1 u# G6 D; l7 h# L. G* r
  8.         }" M6 w8 K/ F* [
  9. }
    - ^! j+ m- X/ f7 z! c7 ^; W% p
  10. int main(void)
    8 a# S. o4 r. {6 U- Z
  11. {
    , c2 S" R7 K* J) ~. Q# Q
  12. % ^: c. H1 x9 |: q

  13. * Z: v/ P* u7 U
  14.         RCC->APB2ENR  |=  0x00000020;        . k& d8 _9 I, `7 z9 V
  15.         GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode  ; m$ @! v: s6 H8 L/ R# n3 Z0 v
  16.         for(;;)
    / H: V( F* q  I; H/ c
  17.         {
    : o  l, i" u) y# n# s3 T0 z
  18.                
    / f" h! o* E+ h, B. a% ?9 d
  19.                 GPIOD->ODR = 0x00000000;
    % C; N" k1 U- g  `4 t
  20.                 delay();5 F8 Q! V; |4 Z# X# \+ A
  21.                 GPIOD->ODR = 0x0000009C;
    , ?+ v0 O0 `9 e4 ?" R7 @7 I6 S
  22.                 delay();
    $ Y6 h4 j# X+ \, q
  23.         }        
    ; V7 a" `* V& a0 @6 Z
  24. }
复制代码
6 a, o# B2 |) h  v
下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。2 U$ m" \! t% v1 y2 a

* q/ x# u& Z  w: Z! P8 W7 K
  1. #include "stm32f10x.h"( o! U1 F2 R) X
  2. 6 F2 }) @0 f6 z5 x
  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD8 L, x* s' i6 l& N
  4. #define GPIO_LED_PORT                                GPIOD    ! C" d: P9 q# o+ w% Q$ Q2 I# o% c
  5. #define GPIO_LED1                                    GPIO_Pin_2    * |: E& Q- l) w  y/ C7 E
  6. #define GPIO_LED2                                    GPIO_Pin_3    9 V& E8 ~& Q. j8 I
  7. #define GPIO_LED3                                    GPIO_Pin_4    , K) \2 c2 m2 f
  8. #define GPIO_LED4                                    GPIO_Pin_7
    ' Y# f4 ?: b# g1 Z+ ?( Y
  9. #define GPIO_LED_ALL                        GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
    & ]  o7 R( {  t# o" N% Y
  10. void delay(void)
    / O* \' `/ a, @5 h+ O8 O. B
  11. {$ t- V# g$ J: t2 f
  12.         uint32_t i;
    " J3 P4 H: `) a5 l! s
  13.         for(i = 0; i < 3000000L; i++)
      ]3 ^' U' v% g3 S
  14.         {: O1 J6 }) t" M0 d# W
  15.         }
    8 ?" u0 z9 |+ M; Y0 p
  16. }
    + u1 b! s# n7 G: y0 F6 j- l
  17. int main(void)3 e7 \+ Y! e. J8 H3 j
  18. {
    ' b  u! Q  C1 A% j' L3 H
  19.         GPIO_InitTypeDef GPIO_InitStructure;
    3 n& T; G5 [- a0 @8 e3 D/ V5 @( J
  20.         SystemInit();
    ) V5 X! q) d7 L/ }  ~5 W7 D7 P/ T5 R( g
  21.         /* Enable GPIOB, GPIOC and AFIO clock */: D/ l; x0 E) ^4 C# f) o7 @9 R
  22.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);  
    . ~4 M/ F0 H. `6 P7 h
  23.         ( s5 p3 T3 F2 C4 M) F
  24.         /* LEDs pins configuration */
    2 A/ U7 o$ a0 R
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
    % E) Y" M3 I: b5 B8 ~% Y2 Z" {
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    - o: ]1 A6 g( `( m( F$ {. K! u. V
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    & q( x, s& u! o  v, ^
  28.         GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
    ) L8 n5 o' b3 K8 w
  29.         
    # `- g, g; g! D4 f2 p# Y8 E
  30.         for(;;)
    9 u' g. f0 }1 u2 f/ H+ y
  31.         {+ y- n0 ~1 Z; w* `
  32.                 GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    ; ^$ H% H* d! y7 s& l, p
  33.                 delay();; i( A; A, j/ K) I- O
  34.                 GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    7 o1 X9 R! X! E0 K) _+ {  h
  35.         delay();+ p' p, M; \3 V( K& A3 @
  36.         }        
    3 r# I2 l9 N9 k
  37. }
复制代码

- E1 a% v9 y' A- ~编译程序,在链接阶段报错了,错误信息如下:2 ]9 {0 F% E! h. F$ }+ Z$ l" o
2 J: A9 U2 [1 X: a' ?% X6 |4 \7 f4 h
  1. Build target 'STM32F107'
    , L8 G  N0 ]' o- a. [
  2. linking...- ]; b+ z! p$ |% O1 J
  3. test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).7 T+ }* b, Q0 U, d
  4. test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).
    7 q5 Y% \; ]! m9 [% i5 g6 y
  5. test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).
    ( f" Y! C- o% m; c
  6. test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).9 d# J4 C7 t* t. z/ s
  7. test.axf: Not enough information to list image symbols." R/ H9 E4 y" u) u" R
  8. test.axf: Finished: 1 information, 0 warning and 4 error messages.
    0 W; E8 h; Z" t& r! _2 z3 e" x
  9. Target not created
复制代码
# _! i, v" c! n. J# w2 b

+ R5 `. a6 g+ z2 C- R5 H, d, T
9 {9 }; m, C! O- M8 k& P
( G6 C' d" F9 A2 e说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。
( O1 c5 C) B5 o& i, e4 r0 `
. B# |" b# `. x, s' w- ^) E% `: J上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。" N& b, r* y) y( G+ Z" ]
7 L. F/ m  W, e# t

- C0 X5 G( @5 ~# X# g3 N
% {( |) ^* f# b9 ?1 M; e5 e
7 \# z. n- P7 F" c' J" g
收藏 评论0 发布时间:2021-11-28 21:00

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版