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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 21:00
前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。# L* e- _. S- e0 z( R: W" g
, h! u: c, U1 t- T. N
STM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道), A+ \- x6 X* Q9 Z! I* ?

' U% f8 y, ~4 l  n. W. c! Q首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。# Q+ |/ C% H  p3 B0 r: \) Z& ?2 Z
* V; j( G* B. a, P( K& ~9 e
IDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。; U1 J. ~) `, M, b* A, j
, \7 m/ Y6 q' y
总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。
, O" f+ _8 |" G* R$ [2 V, Y
( o% Z; ?( m. T8 l" N8 Z不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。7 u. U( {# s# o6 F
' i5 r9 O9 F# u7 f. t+ j$ @6 b
(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。) o- j! u5 E% |5 ]  U& [2 `

/ x' T! Y( Y0 t1 n& @(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。. F/ G  A' j% @4 B5 |% o
6 M4 u7 b7 i* ^$ N% x3 N
1349530026_8394.png

! `, K7 l9 \$ U
! z4 i! _) j. Q/ K* L% Q(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。3 F: a0 \, c; h/ m1 t8 N

( K8 m# d2 d4 L
1349530056_9517.png

( L. T( t% L* X; a9 S* C6 M
. C, }+ K; n+ |& n' b* k- @' c" L(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。- S* q9 l) |3 h, z# X

1 a* F( o# r% [* t(5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。
* w5 i# t* U% ^5 J  x: [3 t+ d: m0 E4 n0 G3 f
1349530114_2653.png
6 _% f0 W# b( x; U( B6 i* e4 H
! @* k% x. T5 H0 D1 a2 T
(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):
  n+ Y" i/ z6 U6 D0 f% b
. q( G8 D! Y- V3 y' E" a  k$ b CMSIS: h% K5 F' |4 @/ F- R6 a

( G$ r' D' s. X( O0 i" U Source, ]9 K( w' q% x  X( \) X1 G

! I1 p5 W& {- ^) m5 w StdPeriphDriver+ T# J3 ?, g; a6 N, g

  k* D, m! r. s" F* J9 ] test.plg
% i) }1 ]. f1 G. z/ `  H3 m
; \6 [6 j( X* t) F test.uvopt$ w' [  t5 j* q5 L2 y1 b, Z( D
5 r) N5 t8 ]# I* K' H
test.uvproj. |! o( e+ \6 Y. F
$ u! U2 `! ^4 H# O& |
test_STM32F107.dep% T: _% N0 a% m3 j: x

" S- {; k0 ^5 L9 C" V# h  [% e+ h$ p test_Target 1.dep
! ?7 H* \2 G# E
0 k8 B/ B6 ?7 Y. O6 s$ g$ U(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,需要换用合适的启动文件。- q4 o) U. l  T/ g" L$ y6 [
. k2 X7 ?, n; 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下的文件应该有这些:
8 p" m" O( }; w$ C) v+ ~5 S2 J: `9 O
$ k7 K' X) a4 m# O+ k core_cm3.c
, J* k  l3 Q/ P5 e4 Y$ w2 t0 Q% O' k: F4 p$ D- ?1 F
core_cm3.h
2 L" x2 M4 M& G; s3 _7 Y+ D
1 t9 z- g8 P7 g( b0 K& v7 L$ ~ startup_stm32f10x_cl.s
" i2 v  ^3 b) I8 }7 x' V0 p0 A) w
) |2 M1 _  V2 w% u# B; _5 ]1 @ stm32f10x.h% l) L1 a- Y" H; H
5 r% u8 s( K. n- y: @% h
system_stm32f10x.c, ^2 m5 ]7 o* P3 [: L4 k5 T, s' J
" l- }+ U; b, k" A' o2 h: O
system_stm32f10x.h$ B9 K2 `$ U+ n6 X0 @5 ?! L

1 E& q% y4 G/ z$ M7 BStdPeriphDriver目录中文件应该有这些:
( C/ X$ {0 Q3 K7 a+ M9 G
# U, W7 Q+ Y1 v5 ?! D' T# | misc.h
' q- U8 e( ]  m% x3 U* \4 k2 o7 k; h2 E# ]3 X' p$ c/ O: f+ H  b
stm32f10x_adc.c! \9 k$ a/ p6 H$ Y/ K8 O; B
- ]5 T& h, X$ H) C4 s
stm32f10x_adc.h
- A0 d2 \' L. s' j0 I1 s3 e
6 [1 S  M( l( F1 }# A/ K stm32f10x_bkp.c2 @/ P& z+ X  I9 O6 ^4 k! b

, o# f( y5 C( O* Q% z( X stm32f10x_bkp.h
! d  q2 c9 j. C6 S! n# g9 ]7 c! p) Y- R0 u! F9 p& I
stm32f10x_can.c- V2 u: R0 D% s. ^+ r) b
) |! X0 p, r3 R  t& G
stm32f10x_can.h1 j% W3 d8 n# c$ I9 y% Q! d

$ {4 m# J+ G& H+ ^: @. U stm32f10x_cec.c
& H3 a. ^4 i  D# o. e' a: [8 x* M4 u5 I, f
stm32f10x_cec.h
* l% t* s/ Y* g6 o+ e1 a' _# ?( D& q  w2 ^
stm32f10x_crc.c
( C) \" J' i3 ^5 ]- v/ n, ]' Q+ V) I+ f
stm32f10x_crc.h
4 \: x; o; T3 R  Q3 t6 N5 M
+ m$ E+ ]2 g* \* `, [9 }( M6 B stm32f10x_dac.c. [: W' f8 }" u) [9 p& ]; `4 s
% ]' m+ A1 g* x) q6 @' {8 x! A
stm32f10x_dac.h
. ^/ X; ~5 O. ?& ?
( u% C  q' a$ o2 i  R( O# H stm32f10x_dbgmcu.c
6 u$ ^( G+ F" g' k( G1 W5 I
3 U/ P* E/ R% j stm32f10x_dbgmcu.h
% S6 Z" D. @+ Z' I7 g7 w
; P/ c6 P; c* T. g9 `9 C& x6 Q9 F stm32f10x_dma.c
; ]: k# Q6 w* L! M' g; t+ q
- M+ k/ q8 ?* F stm32f10x_dma.h8 P/ x0 p  Y7 N) `% ~
9 I2 s+ w. O: U
stm32f10x_exti.c+ W6 R9 \5 K$ O7 {
" B+ g+ U- H7 f* E4 b! w
stm32f10x_exti.h
% `) ^/ X  |" f0 ^/ h+ w! X1 H- X
stm32f10x_flash.c% s" W% _2 q$ o5 o$ p

7 M8 Z) i( |9 s* ?) T' w& L stm32f10x_flash.h$ r2 R9 c" ]' e  q5 G4 ?! D
4 B! V. Y5 d& b; x, o
stm32f10x_fsmc.c+ m9 x) ]7 j0 Q" `/ b4 t8 B0 k. R

3 N5 R  f( I+ N, ^. j4 [& C stm32f10x_fsmc.h8 g) ]. _* ~( ]! ^/ [# M+ T

! P( K& [8 O, d7 g' | stm32f10x_gpio.c
* e$ H0 X, U6 ^& d: D+ l1 N: j
- x! e- f& Z6 d& U4 ^+ u. `  h  k stm32f10x_gpio.h
! F4 x4 q7 Q1 A; F! U* z- T' w# V" S+ c# i( y6 R6 P
stm32f10x_i2c.c
" H0 ^: x0 d8 m* l5 ?& x7 T4 B' l( J1 {9 I5 [
stm32f10x_i2c.h
& ^' o( F/ d, u
# e( z9 X- o+ A/ j8 c5 T2 X" ] stm32f10x_iwdg.c
4 j$ l8 r2 e& k% A7 Y4 g2 y5 b! r: N9 \- t' [
stm32f10x_iwdg.h/ i% G0 M* l4 E1 f; z. V
. g% Y6 y2 K/ y' Q4 }; U# r
stm32f10x_pwr.c" G: J+ ^- G3 B. q+ a( d

1 K. Y& w2 V- Z' B/ _* F9 y stm32f10x_pwr.h3 Q( w/ f$ c5 n% K

# ~4 p  r) ^, T/ a stm32f10x_rcc.c# J6 T9 R" x5 n5 w& t
" U' z3 U4 c: I* V0 w" H
stm32f10x_rcc.h
# p8 e: d# S1 a* r! z7 a! _- v7 R8 u6 v
stm32f10x_rtc.c
: ^/ x3 J; a! }& O  t) C' B8 V& E( E2 q5 m
stm32f10x_rtc.h! `4 n6 ]" M$ h8 W) e1 P2 Q+ E' o! F

; r, _# ?( |# e2 c stm32f10x_sdio.c
2 W1 f/ }: p% H( w, I  R
% b- c: g' Y7 A; E+ p5 F, r' S stm32f10x_sdio.h
$ y$ u  n/ B$ q0 F, Y8 p6 W! b- h. ~" p! ~: v- a: a% b/ R' l
stm32f10x_spi.c) t/ |3 z4 A% |( V$ r' i

* e: m+ K$ a0 B; M' k! w  r7 z0 Q stm32f10x_spi.h4 x1 K) P( d* W( f4 }" M% \6 ?  _
' B0 o9 v& a) Z9 p0 h+ D( y
stm32f10x_tim.c
( E; l% l9 p4 n0 Z+ f: _2 Z  A" N
3 E4 V; X( H) e' p$ \ stm32f10x_tim.h
% }8 y/ w5 ~" G+ s# @2 n7 R- d3 h9 x* j, I+ ~
stm32f10x_usart.c
9 C, e6 o$ i" ~5 o
3 R$ m2 m. Q8 P& w$ ] stm32f10x_usart.h
+ M# y! A9 T- S6 X  b1 E+ H
; p% ^; }6 ?" R0 o stm32f10x_wwdg.c: @2 I0 U; u% L3 N+ c
4 I  @; z1 X$ T3 y6 ^9 g0 ^
stm32f10x_wwdg.h
$ e3 I5 q: b! y0 {+ @4 g; O# O- ^$ r! Q! A
stm32f10x_conf.h  U: C6 t+ u( T$ F4 q3 L

+ z$ K8 G# a; @3 h6 @% [2 N对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。/ V( Y  h8 s. P' R' ?* u" M8 X
) P% J% I+ E( {; q. b
(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。
3 o  s. _; T2 t2 n" N7 k& \% |7 m2 e- b) L2 U' H/ x
1349530228_6018.png
* I( X8 _% Z6 T: {& q- w! }/ T% l& W

  ]% p  ^8 h: Y0 i6 ^4 f, b7 y(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。
8 H$ x, ^5 U) L- e* N. o* @* J+ J7 I; e) E) j. O6 T
(11)修改“stm32f10x.h”文件。在文件中找到这一段:
/ M/ x$ N' m. P, ], }/ f, h
  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) . @4 k' A9 I/ P, r
  2.   /* #define STM32F10X_LD */          /*!< STM32F10X_LD: STM32 Low density devices */
    , }9 P, |5 X0 J% p4 B& r
  3.   /* #define STM32F10X_LD_VL */    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  " X# s3 z# }: L. r* o# w* }2 E' ^
  4.   /* #define STM32F10X_MD */         /*!< STM32F10X_MD: STM32 Medium density devices */9 O/ h5 U" w2 [: W9 W2 [
  5.   /* #define STM32F10X_MD_VL */   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
    - [4 Y+ F4 @- M+ `

  6. ' m( O" ~) Y9 a* t, m& q
  7. + A7 H- m* Z: D3 }* `
  8.   /* #define STM32F10X_HD_VL */          /*!< STM32F10X_HD: STM32 High density Value line devices */- q7 G  D; ?0 X, H  W9 z9 K
  9.   /* #define STM32F10X_HD */          /*!< STM32F10X_HD: STM32 High density devices */
    # c7 B. p, X4 u  n+ T8 M" J$ c
  10.   /* #define STM32F10X_XL  */               /*!< STM32F10X_CL: STM32 XL-density devices */' e& Q# Q8 U0 X7 C, p9 P
  11.   /* #define STM32F10X_CL */           /*!< STM32F10X_CL: STM32 Connectivity line devices */$ G# `- F  q- t. k* }, f+ E
  12. #endif
复制代码
# \" V/ v+ A. \* }' B. h3 b2 w2 V
将对 “#define STM32F10X_CL”的注释去掉。6 \6 O7 n2 _! m0 x

0 P- \& V. W0 K' B" {& ?/ k1 f: \找到“#define USE_PERIPH_LIBRARY ”将注释去掉。& l& I9 o5 }) z/ J1 e( G! K# S

* a, i) W' ~; n! d(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:5 i* r- v; K& c, Y: U# x7 u5 \

/ n8 B/ X) c- }1 w0 \8 d0 a0 A
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
    " ?, G2 S' p5 h7 i. D- a. j* Y
  2. /* #define SYSCLK_FREQ_HSE    HSE_Value */9 j' z" L4 m/ c$ D
  3. #define SYSCLK_FREQ_24MHz  240000004 @; F/ Y* Y: j& D) v
  4. #else: p1 R3 P; z; E% S
  5. /* #define SYSCLK_FREQ_HSE    HSE_Value */+ u  ^& c6 L2 v0 H. _. T
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */ # Y# [7 B/ ]! m
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */
    ) p6 `; W3 C5 x3 y( \
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */- u8 P7 v% u9 C5 ^
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */
    ; J: r- I  O1 z; k3 \1 b
  10. #define SYSCLK_FREQ_72MHz  72000000" E+ ]2 B0 F6 _( a6 j- T
  11. #endif
复制代码

, ^! j7 J3 m# {/ s7 d" p2 z根据板子上的使用的时钟系统来确定SYSCLK的频率。3 t- W# n( [7 [+ p- q8 w

- x% h( r3 }, Y$ o7 M/ C; r- c至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。
) N& c' j5 w3 G+ k0 |5 K" A3 u+ P2 s3 r$ F: X5 i2 D
下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。
' X3 `4 ^& Y" m7 a" v6 a9 U1 d
+ x5 h4 ?+ V2 d+ G) W/ _4 E  h
  1. #include "stm32f10x.h"
    % W* B9 n! G2 C$ u  H

  2. 1 E5 G9 y, i2 R
  3. void delay(void)
    1 H( ]' {' l3 V; v- C
  4. {
    4 R1 r. Q+ w5 `: r* S" J) _
  5.         uint32_t i;% R- d% U; x" _/ d% r
  6.         for(i = 0; i < 3000000L; i++)$ h8 q: B" W. ~; n9 I
  7.         {
    + u* p' T1 U( s- D% I* B
  8.         }
    - T5 K& L4 o* i+ O2 s
  9. }
    ! U# p5 g4 Q) _# N" p  Z  t
  10. int main(void)$ v  O# t& |: K( k, B/ K8 d
  11. {9 s  Y; J/ Q# L. _

  12. - `  h9 X5 `$ S. m. [. C8 z3 O
  13. ; X! N! a, q) z# b
  14.         RCC->APB2ENR  |=  0x00000020;        - Y- q5 q+ S9 U! M8 m
  15.         GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode  - B$ A* R- I- ?/ M
  16.         for(;;)2 j! d! q4 O, Y8 ]) @
  17.         {  S) u2 @' d( G- _+ N% V+ y1 F* b
  18.                 * J; s) Q2 ~! u& Y6 k. n
  19.                 GPIOD->ODR = 0x00000000;
    7 b1 @# f5 O4 y. c/ B( T
  20.                 delay();9 c+ O4 w# A4 X% I0 t
  21.                 GPIOD->ODR = 0x0000009C;+ A6 ^  M! s* \
  22.                 delay();9 O4 r; d) s6 M! q% a, E
  23.         }        # A3 _$ \7 y$ F' r1 G
  24. }
复制代码

2 F. t! l# I, @, u/ J$ Q7 A$ {下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。
( W& M+ F0 U0 P$ @
) X/ Z7 x  r' ~6 P3 s8 s, J1 \1 t) W
  1. #include "stm32f10x.h"; f3 L% m$ S. K' m/ J% \
  2. 6 |$ X$ Z! j6 l" R5 ^  T1 g7 _
  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD
    # k$ d! ^2 k# P6 c
  4. #define GPIO_LED_PORT                                GPIOD    ! z7 s) l" u. Q1 L8 [
  5. #define GPIO_LED1                                    GPIO_Pin_2    : M; z& l% ]; E( t  P$ |% _
  6. #define GPIO_LED2                                    GPIO_Pin_3   
    9 Q4 L  X6 F$ m8 m+ c
  7. #define GPIO_LED3                                    GPIO_Pin_4   
    7 X6 _0 X+ j  ?& F
  8. #define GPIO_LED4                                    GPIO_Pin_7
    3 g. K( H1 r: Z  x5 Y  ~! b1 m
  9. #define GPIO_LED_ALL                        GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4 5 ]  R' K4 j/ G1 W+ t- n
  10. void delay(void)0 L) D) }. N1 D% B  G5 t3 y
  11. {1 W& h( m; m* P; J
  12.         uint32_t i;
    * M' d; _' n9 d$ p! d  ?9 I
  13.         for(i = 0; i < 3000000L; i++)3 c$ h7 a- Z" @+ Y7 H% u6 L9 I  v7 v" |
  14.         {) ?5 U+ C7 ^  L) l/ {, s6 Y
  15.         }
    # o% T! g1 Q, g8 Z, h* |" y6 \' l
  16. }) j. K) p3 U  C' I
  17. int main(void)
    % u* q: J2 g7 N6 W* w
  18. {. F9 F: e" b% t6 ^& @/ \
  19.         GPIO_InitTypeDef GPIO_InitStructure;
    2 ], c# S- M$ {/ A# F7 P0 k
  20.         SystemInit();
    ; y$ B. t! @1 _# Q
  21.         /* Enable GPIOB, GPIOC and AFIO clock */# w2 y* V+ V% r- _9 |1 D/ q3 w5 o  k
  22.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);  
      _) H# J$ x% v, C6 R/ ^  A" I* m: a/ w
  23.         ) {' U- K/ L% w  R( f
  24.         /* LEDs pins configuration */
    " D! h, m! E4 Y5 E
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
    1 b3 a3 U4 U' {( r! h. R3 c5 S
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 B: h0 A; \# K' W/ f  C8 j
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    ! q1 O0 {, b2 E+ G" ?: C+ u5 `
  28.         GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
    9 d5 R# n8 P: E( p
  29.         
    # R- M, G( a( l+ w5 \& P
  30.         for(;;)
    - P6 a2 o. j* G" i" k- k* k0 s
  31.         {
    ! ^% a* }# B4 v) B. V9 Q: b
  32.                 GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);% Y) ]3 C9 W9 p8 h) U) E7 X& l
  33.                 delay();  x- E. \1 V2 j) E0 l: w
  34.                 GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);: X4 Y- R5 d% i& H0 \
  35.         delay();* g# t/ z: b3 l0 k8 T4 k) t
  36.         }        * j# Q# i+ |0 J& r7 `8 B
  37. }
复制代码

2 K6 s, Y* Z) I; N! W编译程序,在链接阶段报错了,错误信息如下:
9 g* M* K- N8 ]% E3 C/ v: D+ I
6 I2 b3 Q) w& I
  1. Build target 'STM32F107'
    . n" O" h0 Y7 i
  2. linking...) E, w7 W& E: Q$ L
  3. test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).
    % K- k0 V2 F5 A% u) O2 ~1 A
  4. test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).; e$ e" Y. p  [+ V) n8 y0 z$ M  q% D% @
  5. test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).; y' h% h7 z/ q! B3 f( c- Y6 X8 l
  6. test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).# i5 P# g  [' N2 D2 B! d
  7. test.axf: Not enough information to list image symbols.: O5 L0 b( h3 K2 b6 i- k/ p+ Q
  8. test.axf: Finished: 1 information, 0 warning and 4 error messages.
    4 z! K* \- X/ {* R8 P! Q
  9. Target not created
复制代码
& N0 g5 ^3 Y6 H* \

+ D- V; c9 t8 U) \* H8 t) K3 H5 G/ ]2 U
$ h- N. N! l2 i+ P) A& a
说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。
9 N$ K# Q% c5 h) q* Q% m' D  a8 ]/ H( a- E4 H+ C. P
上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。
6 A& {4 y: n, ?, W; w* z. k) }
( J4 w% _+ k! L& _1 a) R# `- x2 K, m; H# z4 a

% \) i6 U( x+ Y9 f; m6 U/ n6 U8 I: X  p: }5 N( Z/ R. }
收藏 评论0 发布时间:2021-11-28 21:00

举报

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