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

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

[复制链接]
STMCU小助手 发布时间:2021-11-28 21:00
前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。
+ c0 @  X/ }  E" n5 I9 A! h9 J- Q" T
STM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道)/ c. [7 G/ k1 i) b$ u4 ]

$ {7 Q2 D1 S& U+ a首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。
, o$ q, N! a( d2 e" R' P" R- y# P9 q. L( m
IDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。. r8 F/ N/ G4 V
) z" ~0 l! Y2 E! C
总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。
  p+ C: Q0 }6 |. W; u, U9 T% c( w$ N# n# n2 X$ h" Z; u7 \8 t" J
不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。
+ a5 c9 A4 `2 {1 v9 l& k7 f, S/ J( \/ O% e1 c
(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。3 G1 ^( E6 z0 X. C5 a

/ s7 V7 b' n/ z6 u' b(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。
& |% U. z/ J5 L9 w) P- m
$ E& F+ R  [* c
1349530026_8394.png

9 ]! @& I1 d7 H5 T7 e  K' B! M' j* R% x7 L
(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。
3 Y% _0 l1 |, j5 [
0 R, |1 i* U7 s) V9 z7 S- v4 P2 B( I
1349530056_9517.png

0 {8 D/ J9 `5 @- B$ N
. N1 T# t8 f7 _. s6 Q' l$ Y(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。6 g5 P1 B, f. C

/ {) V- O$ k7 M- v; i+ ?2 U) n(5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。7 q1 B+ i8 u/ e) @: V
8 s1 l* H' h5 Z1 L8 z. Y
1349530114_2653.png

  x- D* E4 S) s% _% ?, a8 E4 M: `) m
(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):
7 W- N0 K) {& _, [# P% x2 _
2 o1 y. @- \) m5 }- f8 a- v CMSIS
2 }0 i" w; C% h$ b" g7 p3 B& N& ]; P" `2 x& n, Q2 D& l
Source) q  S+ P* Q) O2 g$ V% Q: M

" R) K( a: A+ N4 c  D1 O2 r StdPeriphDriver
7 v+ ?1 l! G: h. c' @- {
6 D( W2 O6 e1 Q' d: B$ H2 d test.plg" t" Q9 S. B* |
( ?5 c) M# o# H! k
test.uvopt) L: ]( n: W9 r, Y
5 |: {5 \' J- {8 o1 z6 v0 B/ f: P
test.uvproj& B6 Z  ]( R* |; a0 E
2 g7 `! D4 x) X) @( k
test_STM32F107.dep
2 G2 x5 C) S8 H' O$ G. p
/ x9 g# H0 w$ T4 R* e+ x3 x test_Target 1.dep
3 g- Q) v' b2 h! A* D
# L% f" u, g) z# ?6 R(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,需要换用合适的启动文件。
3 d- k+ M0 p' X  u# i9 v, A0 q; D5 h6 g* u, {& Q7 L$ ]& k, h
(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下的文件应该有这些:
5 }" k% N8 @  E4 v  ^, H- u; T  t, V* c% q. ]1 z* D+ i
core_cm3.c3 J1 w$ v3 P& l( r6 i

8 |* X8 m! }' }: `$ ^8 {" d; l core_cm3.h
4 @& B6 E! W! \# G3 f3 ?7 y7 O- ?1 D( N0 F$ U2 h, I/ I" q8 Q. T) {& _
startup_stm32f10x_cl.s. k8 ~7 M# B8 {' z

( `! `  w1 b& M2 b% Z stm32f10x.h
9 r1 ^0 r+ q# Z+ V, a& j
( C* `' j- g  h% e% a; |6 f system_stm32f10x.c% K, X) r0 s: L+ i" m( l

8 G) }8 f! U$ s" ^( H5 o system_stm32f10x.h
  u8 W; S" ?  P% h- S  D+ F6 p
8 Y8 ?" o4 B  ?! J, b0 H; n7 H8 sStdPeriphDriver目录中文件应该有这些:
% X9 C2 |5 I5 Z, }( @1 d
2 Z; I' }1 }1 c$ `1 o; V/ A misc.h
! }6 Q9 p( n) R# N8 h, n& l8 H& c, r0 T. y: n
stm32f10x_adc.c
/ M8 C+ h( b$ e6 y- F3 `* r3 N$ v; v7 B
stm32f10x_adc.h8 _' x! \4 I4 _$ h

, W$ n  U7 q0 O  o9 O# F9 j stm32f10x_bkp.c$ V( x8 _; t  R- I) G
, m7 M" t& T3 l6 @5 w! s
stm32f10x_bkp.h
+ Z! J# |( v& C- R# Z
% O) H4 L& H" X  K& ] stm32f10x_can.c* @6 A4 R) Y/ t, G3 w8 J3 a6 F
/ @! l# A/ {$ D, p. \' w
stm32f10x_can.h
% m8 u; r( K7 Y  o( K( L& T- ~: X/ j/ V3 N+ q& Q  U; S
stm32f10x_cec.c6 t1 Z% `9 d% G& R# |1 n

& h7 Q6 f- \3 A9 U stm32f10x_cec.h' a* D8 f' P. [1 j) o  }! z- H

0 _% D+ P& p$ o# T stm32f10x_crc.c9 W* ~. \* d+ _6 i& ^  K
1 B1 d8 {" d. C3 _5 p: p- B
stm32f10x_crc.h
: f3 a! s. v0 |7 Y/ ?
9 P; A( `, u6 J$ H0 r0 @2 a stm32f10x_dac.c4 W& p$ b  l2 J

; g0 d, l7 e6 J7 F+ l stm32f10x_dac.h! K, e8 O' s7 D$ c+ I2 |3 Q

4 }$ i$ b0 F/ W4 |% y stm32f10x_dbgmcu.c
, t& N) \/ g% h' d" f7 z
9 _- Q6 q) ?" [* d4 g9 r stm32f10x_dbgmcu.h
4 w- q9 u4 M: E8 [% k( |. V, y% e/ M- _
stm32f10x_dma.c. R+ b5 }3 e, w  R' Z

4 X+ k, ~* f# t1 `$ Y stm32f10x_dma.h! w3 v) R. W: P; K9 p

; K6 Q) G* L- z) V6 O stm32f10x_exti.c
( d7 ~/ ~8 O( N! R, ^  |( T$ ~- |' r3 d) _
stm32f10x_exti.h; \$ J7 f  C: u- L
9 {) ]' _3 o* x, L8 i, O
stm32f10x_flash.c5 _' L+ U6 ?5 M1 a0 f$ l" U
9 Q# \/ Q; I; h2 O* _; I9 n/ ^
stm32f10x_flash.h4 g' f- s! _0 E4 j9 l0 O+ e2 s0 p
% E, {5 P1 @1 r& L4 w4 I
stm32f10x_fsmc.c
: R) m) W. M4 H1 `0 e. N) l" U: E& \% i  I, y1 R- w% ?
stm32f10x_fsmc.h* [' }) p; L6 k4 D* U
8 S' J4 l4 ~' r+ U
stm32f10x_gpio.c* q  g% y9 @) G; t5 \$ p

- l) T7 C7 }; @% k1 P stm32f10x_gpio.h
, d* e- N% }/ k! m4 L+ W9 M
. v8 u0 _' ?: l  A: r8 p$ N$ @ stm32f10x_i2c.c5 ?! c8 G8 L( Q4 a* w. l  e" Y

% q% J8 L# `$ `' i' X3 H stm32f10x_i2c.h1 ?: \6 G3 f- Q( ^

9 }, S5 q' x" G$ y: N stm32f10x_iwdg.c5 T  j. s' K9 E4 _, @; o

& R: O+ p/ D0 I+ U1 q% |, u stm32f10x_iwdg.h
* q: ~7 N; F- D! x, m- @+ R4 H- H9 A
stm32f10x_pwr.c/ k1 W& g7 M* e& ]7 ?% A

4 A9 r: [/ H4 l0 I2 D stm32f10x_pwr.h2 r9 ^0 z% q, j9 C$ e

) R: g" m$ j% V4 o/ I, {. w stm32f10x_rcc.c& c8 a; C" `: x  m
; L3 J9 s2 B$ b8 S" V1 y( {  y
stm32f10x_rcc.h1 l; c% g$ Y9 c4 v. G

/ n* b6 p2 O0 j* w. V* a$ o stm32f10x_rtc.c
/ L% B2 U8 t& |) l' ~7 }0 S* m$ R* D; ?0 c- Q
stm32f10x_rtc.h
- H) b* I, O+ b( V( ^3 U' f1 y
7 T1 i) V! T; C. j3 G; `2 }. z stm32f10x_sdio.c( p& z& K( T, p2 c* T, i0 |
* ~! _8 X! ]2 h) n6 J! J) [3 p
stm32f10x_sdio.h- I2 ~2 ]1 g0 T1 Y0 t6 X; h) F4 l- i
. j- ~. C' `# R" \! d+ {% S
stm32f10x_spi.c
- c$ O7 [( S5 L) w3 l. J6 K- {5 m2 ~$ k; f  r. d/ }2 }
stm32f10x_spi.h" Z& B; Z: j* C0 c! B

5 J' `# r3 K1 r" Z stm32f10x_tim.c4 K$ B- ]& c& Z
+ s' p! }$ @$ M# `1 I7 f& j5 U
stm32f10x_tim.h
$ e! L$ b: U2 [& t2 d1 z0 |7 B/ x# S. ?
stm32f10x_usart.c
: |0 N7 R- \" c) D  |% x3 [2 U. `- u1 ~1 T- M+ g+ Y
stm32f10x_usart.h3 {; Q! x4 X& ~2 i6 y
3 A  [# C6 F: K- ?
stm32f10x_wwdg.c
, {% B1 O4 D1 R' y$ h( e3 n
, T! x1 r, k9 z  d9 ^2 }& @# N stm32f10x_wwdg.h
& Q: v# @- i) q5 H1 T3 w6 |# O4 {
stm32f10x_conf.h
: ~  B/ x* w* O7 t6 \2 F
/ I/ w7 U1 @9 P7 f对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。' |. j! |7 r1 m/ ]  g1 e
6 f# Y" e- J8 ]/ }. R( o) O
(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。, ~6 z& g0 X* G# _

* N* b9 N, e. z5 Z
1349530228_6018.png

  R1 }: G1 k6 \6 z0 C
! A! U% e4 C2 f' f; U* h(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。
9 _# v2 N% C& v" {' s; p2 B7 e& s3 _0 _3 x) f2 b. A9 m& T4 K0 M; h- y
(11)修改“stm32f10x.h”文件。在文件中找到这一段:
, `8 z# [5 F5 a; Y
  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)
    7 ~# q' |( ?' v4 S( g0 J# X1 u
  2.   /* #define STM32F10X_LD */          /*!< STM32F10X_LD: STM32 Low density devices */2 L+ c3 v# X# n; A/ x  y! N" @
  3.   /* #define STM32F10X_LD_VL */    /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  
    7 L  ~- K0 A( z
  4.   /* #define STM32F10X_MD */         /*!< STM32F10X_MD: STM32 Medium density devices */
    " z' U& J1 \: y1 o1 d7 v
  5.   /* #define STM32F10X_MD_VL */   /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  % j9 K1 k7 S& G% X

  6. . i4 `9 |* I9 H6 I
  7. 3 s7 I4 T$ l  C  g. x
  8.   /* #define STM32F10X_HD_VL */          /*!< STM32F10X_HD: STM32 High density Value line devices */1 H+ G3 P7 i( Z
  9.   /* #define STM32F10X_HD */          /*!< STM32F10X_HD: STM32 High density devices */
    , ^& Q9 b- X+ k, `- X, R
  10.   /* #define STM32F10X_XL  */               /*!< STM32F10X_CL: STM32 XL-density devices */( S1 O- H: r/ f2 N% c
  11.   /* #define STM32F10X_CL */           /*!< STM32F10X_CL: STM32 Connectivity line devices */7 }$ v6 R/ x7 D+ _- k
  12. #endif
复制代码

" p- z- v0 Z- Z, {1 ]3 i将对 “#define STM32F10X_CL”的注释去掉。4 K: w- ]: D  C
# n$ {/ L0 T3 D9 ?  e
找到“#define USE_PERIPH_LIBRARY ”将注释去掉。
9 G# K" u- f0 S
8 R8 a( F0 |0 t9 }(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:2 g2 c" \) T. p9 N1 y; p  i. z
0 _) ]/ J. X; |0 o$ v- }
  1. #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL) 4 X8 x+ ~4 G. J: z  V
  2. /* #define SYSCLK_FREQ_HSE    HSE_Value */" {1 c' _# i8 p
  3. #define SYSCLK_FREQ_24MHz  24000000% U/ s* B" E. X7 x# D9 ^
  4. #else
    3 w: _& i4 V6 t- C3 ~1 @( S
  5. /* #define SYSCLK_FREQ_HSE    HSE_Value */
    * u: I  [# o9 [" R7 N! W7 P3 G
  6. /* #define SYSCLK_FREQ_24MHz  24000000 */
    & p8 g& B" d) g% R
  7. /* #define SYSCLK_FREQ_36MHz  36000000 */
    ( |+ X( w0 H# F" v8 C+ g. I
  8. /* #define SYSCLK_FREQ_48MHz  48000000 */
    ' g; n; ?( ~; I
  9. /* #define SYSCLK_FREQ_56MHz  56000000 */7 e; n; @2 Z9 z# W% h
  10. #define SYSCLK_FREQ_72MHz  72000000
    + o. j8 Q! j( I9 _- @
  11. #endif
复制代码
  ]6 \, o+ O: o$ I! u" |# W
根据板子上的使用的时钟系统来确定SYSCLK的频率。
+ L( M9 ^# O( Z
( R" d! I! I: @+ h- J4 T. f至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。
- ?  s; Q0 H& b) D1 ^! M# d) Z8 l+ q' U$ N9 w6 f9 E) b4 f
下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。
% f) L2 V: G9 ?; g1 o- ~) X0 B4 z" p, H% [! o  s/ h
  1. #include "stm32f10x.h"
    , X5 w- N! j! U- _, A
  2. , K( b0 g& c+ v3 z
  3. void delay(void)/ P/ v, c9 \( r* I6 e' T
  4. {
    ! }/ C% f$ z6 l/ |& i7 |
  5.         uint32_t i;
    1 ?' Z" U* ?3 C# k! c+ X
  6.         for(i = 0; i < 3000000L; i++)1 a# V, L6 f, q2 P
  7.         {- |+ m1 H' a* H1 ?0 b
  8.         }
    ! |+ w# t' e. U( _
  9. }
    & p" Q8 E8 i( t+ P
  10. int main(void)9 T2 e8 e; v1 }6 P' ~% l
  11. {4 r% o: }$ Z* T

  12. * w4 O, m& z9 f: e

  13. ; m( v& F# d, b, {
  14.         RCC->APB2ENR  |=  0x00000020;        7 k/ ?, H* v, e- F# {
  15.         GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode  
    / E& Y, L7 H/ S% ^
  16.         for(;;)
    * a; I3 m7 r3 I- [+ Z
  17.         {
    " }5 L  R( p% ^% q6 D  X- f; f
  18.                
    : `7 F' D: V$ a: ?" H( {
  19.                 GPIOD->ODR = 0x00000000;( ?6 v) s8 }. |7 T+ q$ O9 Y
  20.                 delay();+ K: M; n7 W3 T7 ^+ ^! G
  21.                 GPIOD->ODR = 0x0000009C;0 i/ ~$ o5 ^, B
  22.                 delay();; F: \! r+ k( u: N0 m3 y
  23.         }        0 E" M8 p- Q8 A
  24. }
复制代码
; w+ \* i6 m+ T4 M
下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。+ W! L& C( J6 i- G3 z
: C- m) ~$ b. U( x4 u% v% M
  1. #include "stm32f10x.h"
    5 d) @5 _3 Y/ x1 F% U5 a

  2. 4 D( H: o: E* v5 g! J$ q
  3. #define RCC_GPIO_LED                                 RCC_APB2Periph_GPIOD
    / n3 }; |: c% o& [8 l# g
  4. #define GPIO_LED_PORT                                GPIOD    9 d* [, j+ @8 T% Y/ G) @
  5. #define GPIO_LED1                                    GPIO_Pin_2   
    9 M( U$ k2 w+ \9 @- ?
  6. #define GPIO_LED2                                    GPIO_Pin_3   
    2 C8 n9 L3 e. C# n) C1 O
  7. #define GPIO_LED3                                    GPIO_Pin_4    . t4 J: a3 h% O3 u2 f
  8. #define GPIO_LED4                                    GPIO_Pin_7
    + @1 n6 G7 D3 ?( |! N) e. X
  9. #define GPIO_LED_ALL                        GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4   g) D5 C, f" s% G7 g+ z, f
  10. void delay(void)
    . @# u" a& @- j, u" D. h
  11. {8 G- O6 C4 Z% `9 \9 K+ E+ H
  12.         uint32_t i;* M6 k3 N+ q: F* u# Y) ?( l% ^/ G5 M+ B7 a
  13.         for(i = 0; i < 3000000L; i++)3 Z4 a8 }" R; G
  14.         {: y, Z( f# }/ B
  15.         }
    7 @& W6 P0 z9 \7 Q7 U
  16. }
    ( N) e3 [3 M+ n- Y+ P4 s' T+ }
  17. int main(void)
    3 J" B. `5 P8 ?
  18. {3 _( k6 E, k7 h9 z- `5 x- I3 i, t: b! x
  19.         GPIO_InitTypeDef GPIO_InitStructure;) [$ ~/ y  h  k1 R" r  j
  20.         SystemInit();
    . {# k+ V$ V! d! _
  21.         /* Enable GPIOB, GPIOC and AFIO clock */9 L0 Z5 U4 m1 a; ?3 r
  22.         RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);  
    ; Q& O- f7 `0 p' B
  23.         ; S7 D( q- L5 J$ A6 g* p; o. k5 g
  24.         /* LEDs pins configuration *// k* _, ~+ v) [# v/ K( [  Z9 ~- w
  25.         GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;' o! J* I# [) ^! V# U0 h; U
  26.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;2 B% U9 Q3 r( _8 i/ ^  t9 s0 D3 M! R
  27.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    * X. p1 m. n- y2 u8 N
  28.         GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);: S: g+ E+ N6 C" X7 @6 i: C
  29.         1 [2 k  _) Z' m# r* \/ T
  30.         for(;;)8 }& D: Z$ S. i+ f" K$ O3 L
  31.         {
    7 n* e) X& S! a$ x- `' w
  32.                 GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
    * N( y% U8 e: s5 Z# N8 \+ q7 u# Y
  33.                 delay();& J/ t; V4 L: Z8 g$ J
  34.                 GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);$ F/ c2 ~; o/ y/ i8 }4 E7 i
  35.         delay();
      N, l0 G5 |- K- `! \; A" q. W7 K
  36.         }        / C7 q! D/ K7 U2 V+ F
  37. }
复制代码
5 g3 r6 V" P" C( e
编译程序,在链接阶段报错了,错误信息如下:
- e  H4 W' Q( O0 a) k! p
/ E4 p- p8 t/ _" N) b, P" ~
  1. Build target 'STM32F107': s, n8 n5 D. N2 {6 n3 B$ t6 [
  2. linking.... H7 K0 f& g. D. ^0 m# J( {
  3. test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).
    & q* c1 P- {% i0 m1 a
  4. test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).
    - Q0 F! z# d0 ^4 y- b
  5. test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).' A1 x9 C0 D* w6 F! R3 z
  6. test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).
    9 R8 Y0 A, F6 M. e; u$ P: N) q4 M
  7. test.axf: Not enough information to list image symbols.
    . A7 Z; C8 k& b* x( K3 y% _& P# d
  8. test.axf: Finished: 1 information, 0 warning and 4 error messages.% B% B: w9 n+ A, ]  S
  9. Target not created
复制代码

3 R% S/ O1 V: E  W* J
! F. m: b- N) d& l0 ?+ u2 J& t/ D, B" E; q
0 F+ Q. \; y  A4 c3 |4 a
说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。; p+ O  x8 k; P( F

8 B" U; B/ Y3 s+ V) x& h上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。* A$ P( M1 @& {
0 ^) R' H6 W5 h; A6 a8 y

* ~$ P0 Q: E: Q6 v$ D
* G( d; b$ J3 ^
" {4 {  H. i6 M6 V
收藏 评论0 发布时间:2021-11-28 21:00

举报

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