前段时间将 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
+ 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
) 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* ]( 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
) 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- #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 `
- /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */2 v, x0 L- D! N; \+ C6 k3 @! R
- /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ 1 B' g r* ~1 A9 m6 x
- /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
6 H1 A9 i- O9 x - /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */ + ?- _! I) j# w' E
- 7 E$ _$ |! W8 w0 L7 O% X N$ w5 v
- : ~2 k4 U" W8 a( e' Z
- /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD: STM32 High density Value line devices */3 H/ {2 j. O6 v/ ~3 s
- /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */2 A7 ^- B2 \, t9 \ E
- /* #define STM32F10X_XL */ /*!< STM32F10X_CL: STM32 XL-density devices */
1 | N0 b3 ^2 _ - /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
- U, a" t1 ^9 D6 B3 N5 V9 G - #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
- #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
$ p* [* F5 n3 u% t% | - /* #define SYSCLK_FREQ_HSE HSE_Value */
, o$ g& B" p# m- q3 J6 e - #define SYSCLK_FREQ_24MHz 24000000$ W+ p5 b9 Q3 I* w9 q
- #else4 m6 \4 e0 N7 e
- /* #define SYSCLK_FREQ_HSE HSE_Value *// z+ A* X6 C3 |9 m6 Y# n6 }6 U
- /* #define SYSCLK_FREQ_24MHz 24000000 */
* P0 j1 t' P0 d/ @- _3 D - /* #define SYSCLK_FREQ_36MHz 36000000 */
/ U$ g! [" A7 |, d1 P - /* #define SYSCLK_FREQ_48MHz 48000000 */
9 l, z( m4 n$ q - /* #define SYSCLK_FREQ_56MHz 56000000 */% X! \8 F' p C- I$ e' ^+ ]' q
- #define SYSCLK_FREQ_72MHz 72000000
( T+ B" y( p3 L1 w4 _# r: N - #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- #include "stm32f10x.h"$ c; ]6 x5 P% Z( z
- ; D/ h% N, D; g: y7 f
- void delay(void)
! [2 R2 p1 {9 ]0 Y9 y - {
k9 n( N3 S- H# m8 ]" \* N3 g - uint32_t i;
u* A0 Z U! z* u8 _8 w/ l - for(i = 0; i < 3000000L; i++)
2 E+ a. n; }( U - {
1 u# G6 D; l7 h# L. G* r - }" M6 w8 K/ F* [
- }
- ^! j+ m- X/ f7 z! c7 ^; W% p - int main(void)
8 a# S. o4 r. {6 U- Z - {
, c2 S" R7 K* J) ~. Q# Q - % ^: c. H1 x9 |: q
* Z: v/ P* u7 U- RCC->APB2ENR |= 0x00000020; . k& d8 _9 I, `7 z9 V
- GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode ; m$ @! v: s6 H8 L/ R# n3 Z0 v
- for(;;)
/ H: V( F* q I; H/ c - {
: o l, i" u) y# n# s3 T0 z -
/ f" h! o* E+ h, B. a% ?9 d - GPIOD->ODR = 0x00000000;
% C; N" k1 U- g `4 t - delay();5 F8 Q! V; |4 Z# X# \+ A
- GPIOD->ODR = 0x0000009C;
, ?+ v0 O0 `9 e4 ?" R7 @7 I6 S - delay();
$ Y6 h4 j# X+ \, q - }
; V7 a" `* V& a0 @6 Z - }
复制代码 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- #include "stm32f10x.h"( o! U1 F2 R) X
- 6 F2 }) @0 f6 z5 x
- #define RCC_GPIO_LED RCC_APB2Periph_GPIOD8 L, x* s' i6 l& N
- #define GPIO_LED_PORT GPIOD ! C" d: P9 q# o+ w% Q$ Q2 I# o% c
- #define GPIO_LED1 GPIO_Pin_2 * |: E& Q- l) w y/ C7 E
- #define GPIO_LED2 GPIO_Pin_3 9 V& E8 ~& Q. j8 I
- #define GPIO_LED3 GPIO_Pin_4 , K) \2 c2 m2 f
- #define GPIO_LED4 GPIO_Pin_7
' Y# f4 ?: b# g1 Z+ ?( Y - #define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
& ] o7 R( { t# o" N% Y - void delay(void)
/ O* \' `/ a, @5 h+ O8 O. B - {$ t- V# g$ J: t2 f
- uint32_t i;
" J3 P4 H: `) a5 l! s - for(i = 0; i < 3000000L; i++)
]3 ^' U' v% g3 S - {: O1 J6 }) t" M0 d# W
- }
8 ?" u0 z9 |+ M; Y0 p - }
+ u1 b! s# n7 G: y0 F6 j- l - int main(void)3 e7 \+ Y! e. J8 H3 j
- {
' b u! Q C1 A% j' L3 H - GPIO_InitTypeDef GPIO_InitStructure;
3 n& T; G5 [- a0 @8 e3 D/ V5 @( J - SystemInit();
) V5 X! q) d7 L/ } ~5 W7 D7 P/ T5 R( g - /* Enable GPIOB, GPIOC and AFIO clock */: D/ l; x0 E) ^4 C# f) o7 @9 R
- RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);
. ~4 M/ F0 H. `6 P7 h - ( s5 p3 T3 F2 C4 M) F
- /* LEDs pins configuration */
2 A/ U7 o$ a0 R - GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
% E) Y" M3 I: b5 B8 ~% Y2 Z" { - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- o: ]1 A6 g( `( m( F$ {. K! u. V - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
& q( x, s& u! o v, ^ - GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
) L8 n5 o' b3 K8 w -
# `- g, g; g! D4 f2 p# Y8 E - for(;;)
9 u' g. f0 }1 u2 f/ H+ y - {+ y- n0 ~1 Z; w* `
- GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);
; ^$ H% H* d! y7 s& l, p - delay();; i( A; A, j/ K) I- O
- GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);
7 o1 X9 R! X! E0 K) _+ { h - delay();+ p' p, M; \3 V( K& A3 @
- }
3 r# I2 l9 N9 k - }
复制代码
- 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
- Build target 'STM32F107'
, L8 G N0 ]' o- a. [ - linking...- ]; b+ z! p$ |% O1 J
- test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).7 T+ }* b, Q0 U, d
- test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).
7 q5 Y% \; ]! m9 [% i5 g6 y - test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).
( f" Y! C- o% m; c - test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).9 d# J4 C7 t* t. z/ s
- test.axf: Not enough information to list image symbols." R/ H9 E4 y" u) u" R
- test.axf: Finished: 1 information, 0 warning and 4 error messages.
0 W; E8 h; Z" t& r! _2 z3 e" x - 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 |