前段时间将 Cortex-M3 权威指南看完了,现在开始拿块开发板练手。
3 `2 H" d: B( G {: I- O! x& W! A7 Z1 A2 z @$ |0 t
STM32F1xx 本身并不难,不过因为第一次用 Keil MDK,还有想在程序中使用最新的stm32f10x_stdperiph_lib V3.5,最后让程序跑通也经历了一番周折。这里简单的记录一下,希望对刚刚开始学STM32的初学者有些帮助。(这篇的内容很初级,高手请绕道)
4 ]; M$ Z/ m( r2 I/ S3 U
; ]0 o/ k" F1 |+ t: g首先介绍一下我这里的实验环境,开发板是块便宜货“神舟IV号STM32F107VCT开发板”,听这个名字就挺山寨,不过便宜倒是真的。仿真器是国内山寨的J-Link V8,买开发板时送的。J-Link 用的是 V4.12 版的驱动程序,segger 网站上有新版的驱动,不过我试过了,新版的驱动添加了检测J-Link是否是山寨的功能,装上也不能用,在网上也没有找到解决办法,所以还是死心吧,4.12 版的驱动也能支持挺多的ARM 芯片型号了。, b3 Z0 g6 r3 G% `' ?; j, ~3 ^
: q$ t2 A1 b) M% B$ f3 i- K9 h
IDE环境是Keil uVersion V4.10,工具链的版本为:RealView MDK-ARM 4.12,当然是D版的。
) [ E+ W$ ~, V, U, d
8 @3 {0 Y+ u$ U. f总之,这一套从头到脚都挺山寨。不过我这是非商业用途,仅供个人学习,想来 ARM 和 segger 也不会来难为我。) @5 I3 C3 J! T P4 M
; B5 t0 I2 F7 n0 g _5 W9 z
不说废话了。首先讲一讲如何在程序中使用STM32F10x_StdPeriph_Driver。
w7 {; x' z' h& Y7 o; E3 W+ H# C: c2 |
(1)新建一个文件夹存放项目文件,要注意路径不能有中文,我这里目录名取为stm32-test1。' x+ V7 R( _ L) D- E
7 E7 X) F6 R1 @7 _! R( ?2 ]
(2)打开Keil uVersion,新建一个项目“test.uvproj”,CPU 选择STM32F107VC。
3 i8 h1 ?! f- [/ \/ l- j7 r; Q2 T9 x% S( I
% U( |/ R# Z/ I1 E% ]1 N9 C+ j
! q& H3 ?6 g8 g! U
(3)Keil uVersion会提示是否添加启动代码,选择否,因为我们要用STM32F10x_StdPeriph_Driver中提供的启动代码。. P0 l3 Z) v; s
. J/ A5 u; X3 D5 u( [% Q1 {. Q& P
1 d& l: V! _5 f) g
; L' r* J1 O$ P. @# s(4)给Project Targets 改名,我改的名为:STM32F107。这一步不是必须的,只是默认的名称“Target 1”太没个性了。5 p7 C" `% K, U4 F8 }; `5 |- V- A- ]* U
( } {" k& o/ E# w; O2 T% w
(5)Groups 中我建立了三个组:Source、CMSIS、StdPeriphDriver。Source中存放我写的代码,另外两个顾名思义存放相应的代码。$ J, H- m9 I( W6 S. m( l
) t$ N* O9 Y8 i; A9 b: R: O8 J C
y/ G: n) \5 s
(6)stm32-test1 目录中也添加相应的三个文件夹:Source、CMSIS、StdPeriphDriver。这时stm32-test1 目录中应该有这些文件(文件夹):
2 A. T6 H2 Y+ l8 P0 w4 }) g3 Z2 W! ]5 p4 w( z# x2 u1 W
CMSIS% k4 {8 m; H( @
+ B6 e( C1 s z+ f, B# N: Q7 I Source
3 Q# @; K' ^/ e0 y/ j( W0 J5 g+ D" j! s7 A
StdPeriphDriver
# f0 Y# `9 s# a# F4 Q* P4 x3 i" p0 x( H$ ^7 F% O
test.plg3 i. |/ k, a% n. H2 _2 U! ]" [8 N
5 l! P" O( f$ ~* c test.uvopt
. p3 X; a6 M7 X, f' O9 R2 }$ R" E# l% _0 d8 K& {, b
test.uvproj( y4 d1 w" c& W& _5 G
3 h7 T4 \, }1 d& p. F3 \; T" K test_STM32F107.dep$ }* |) V% _5 `
* p' \2 q4 h) O; A2 L, T8 C" ]9 p
test_Target 1.dep4 D& z6 w% I1 Y" e' [$ j2 z' C
. D! _6 Q- m' D$ G) ]6 |# [(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,需要换用合适的启动文件。
j: `. A- F- }1 s: I# C- u9 N( Q9 r, l; r3 u5 `+ w, S
(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下的文件应该有这些:: Y" X9 J9 L5 ]
) |5 P( B3 a( r8 r core_cm3.c
R+ ?( B. i; n4 ~. u _6 F6 @- A; N& y" E; S" @
core_cm3.h
! n) C7 f% W/ b
/ `9 x2 p1 u; p0 ?3 E startup_stm32f10x_cl.s
* r1 @8 I' M# @- ~+ [0 o9 ^+ U( G- ~9 I
stm32f10x.h! B J2 @( ~, i% e6 \6 G* K
- X1 x2 G$ z( ~ system_stm32f10x.c
* w6 j& h$ |2 }* @9 k* J w
8 X( Z {# w0 G3 ? system_stm32f10x.h; {: `2 A' ~, b4 s7 r9 i
& B" q- f5 @4 i6 ~8 c8 O: V
StdPeriphDriver目录中文件应该有这些:( X( p$ _. n# |4 y. P
0 G' m! n7 C' J* ]# u misc.h
1 Y7 M' N$ }: j
; u) B+ Y) l! w5 |$ h* T' | stm32f10x_adc.c
, {8 W, T# Z2 v C% e5 R
: H( T! d6 ]* [1 H6 B6 I0 c3 l* Q stm32f10x_adc.h- ~5 V f. } s+ f5 A2 W
! G1 |7 [2 O2 v" K
stm32f10x_bkp.c4 s- |' v6 k; l1 Z' y2 B1 \* M
, c1 O( M9 P3 m, W J X
stm32f10x_bkp.h
% u4 m k' u1 ~( e: p7 _1 |' j# ^9 q4 y0 \' s- M+ l1 u
stm32f10x_can.c
" a5 f$ I* E0 v2 r: q. g
& T2 i9 d& z- j6 x9 b stm32f10x_can.h
$ ~& `4 @$ |( f3 X9 C* M* ?( O0 M; z6 a0 n$ E: E# A
stm32f10x_cec.c
; u9 c6 S! M$ a9 X& G
4 d+ Y- \- d; L; m( R stm32f10x_cec.h* O; o2 [" @ Y. w# ]! v
% J. q b# M( H; v$ ]+ P
stm32f10x_crc.c/ o* i$ `, f* x8 k2 ~: n! J" p
* d4 ^8 C4 g* z# Z
stm32f10x_crc.h2 J: x: C5 Q+ n. G
+ u0 f0 ]8 r: z6 K' Z. N9 x
stm32f10x_dac.c1 q* D R3 O* o1 d7 Q
, _- B' A) p' ]( o+ ?! H stm32f10x_dac.h
2 {7 J7 Z8 a" @+ b: ]
$ I$ j3 @/ Q0 Z7 o' H* O- T( a stm32f10x_dbgmcu.c
* ]9 b) a2 B; R1 T- R4 J
: k- j6 {; E/ F stm32f10x_dbgmcu.h2 @# f9 m+ k! u$ f0 y" g2 N, C9 c, E/ H
, y% ~$ o# R/ r \9 T stm32f10x_dma.c: ?7 `0 E# `* ~
- v" k5 u4 J) ~2 G8 `
stm32f10x_dma.h: |! s: e1 d6 D9 M" R
; @) ^9 r2 |+ I; r
stm32f10x_exti.c
+ {2 a0 V5 z5 N
1 O/ g' {4 Z1 D+ Z, _9 \2 f9 t+ { stm32f10x_exti.h
" M5 c5 O4 M! f8 T6 ^$ j: {( j, e
stm32f10x_flash.c
( L# T8 w3 Q9 Q# P+ Q8 K" ?+ B4 L: ^ n. S% ?- E
stm32f10x_flash.h
, ^: e: ?- ~: h o
( a, M8 f& P v# g) M stm32f10x_fsmc.c
. c$ G1 W- E% L- z8 h( n" s# c- z5 b/ Z9 H" q2 u' u
stm32f10x_fsmc.h- N! | F2 J- V$ k
5 Z" W' I- }8 h1 k( B) U# _# f7 v+ u( m
stm32f10x_gpio.c
6 K, k% L6 h/ Q3 D! O2 S5 \6 u9 H+ P6 n4 m
stm32f10x_gpio.h
+ ^- k0 R4 t* f( v
' C8 A* e! {! ^, r stm32f10x_i2c.c4 R9 e0 H2 n2 A$ Z
& p; n: f3 ^8 l
stm32f10x_i2c.h# l0 d* F4 q+ q; U$ \9 l: L
) t0 [. M% B/ ^% |! Z
stm32f10x_iwdg.c' F1 W G# j7 W8 ~6 c; s
3 T7 Y; C; p% a+ N+ ~
stm32f10x_iwdg.h
* I1 ]* D; l1 X0 e) s) @
$ c! a- j; s! B. ~2 x: D stm32f10x_pwr.c
8 d# {$ M. E* E3 R) s/ l/ s
; B2 H1 M$ [+ J+ ^ r stm32f10x_pwr.h
. K9 p& f+ A @
. s. c+ p! @+ x9 ~ c! h9 T stm32f10x_rcc.c5 G3 i7 }) Y" K9 N4 l1 A7 M
, h( p1 m$ |# I; q/ C9 y* U stm32f10x_rcc.h
( X/ R+ G; B) C% \8 ~" k% |
$ v. z, K3 U& }( d stm32f10x_rtc.c! [7 I) o0 f1 z( f; r1 C4 ?
. v. P! {2 _7 `- d
stm32f10x_rtc.h
( e2 z; C8 I5 H8 s% [
2 H+ F2 D+ Z- |1 |- Q- m; \ stm32f10x_sdio.c
" g9 h, u2 D( P5 V; t. d
& P* W: i+ z! U L' A; v% z k stm32f10x_sdio.h
1 b4 \. U% i: u! e& E/ g
; k1 ~' T! t/ [ G1 Y- s stm32f10x_spi.c
# u8 X* a/ H" @8 U+ t4 F
, S7 G2 M8 T6 J* F) y& k" f+ H# ^ stm32f10x_spi.h
$ l* t* w6 p* V1 Q9 ]
, F% k6 I; i* g" K5 R7 d- G stm32f10x_tim.c) ~0 W; n: H5 p# p% R0 ]
8 Y3 m, p2 h9 r/ T0 T' M0 h stm32f10x_tim.h. `8 T+ ]9 {# \: z: }
0 c C; y$ Z, r2 u stm32f10x_usart.c! S2 _% J: [0 g: z5 @
) h. {6 Z" C# d. U& P, q4 Q' ^; R- F stm32f10x_usart.h @) ^) l+ J; z8 j! G
) q( A' ^( O/ {/ W) d @+ t
stm32f10x_wwdg.c# z0 Q" j$ l6 {1 t" P- U' m
( H5 q) ]) u! p/ W stm32f10x_wwdg.h1 ^6 |& n( O5 z
; [* O" l* {: [& e stm32f10x_conf.h
1 r0 ^5 m$ H" O7 G1 @& M) } C% X
1 N) R3 F2 }* b. _! G2 M对于某个具体的项目,这些文件不一定都会用到,不过放在这里也没什么坏处。. T/ n7 H+ H' c" n
O4 Q% t4 N9 i& r(9)将.\CMSIS;.\StdPeriphDriver 这两个目录加入到头文件的搜索目录中。
. X. [- |; u# v9 Y/ d
( a$ ~5 d7 r1 d7 g. \/ G# V0 D0 b9 `4 C$ [) A: e- }! |
: A/ N# l& R7 d/ y" U9 X) }8 T
(10)将 startup_stm32f10x_cl.s 添加到组 CMSIS 中,新建个main.c 文件,加入到组 Source 中。
3 V' X# X6 ]2 ?. p$ R' g J/ i4 s0 G( Z9 s+ v y' r
(11)修改“stm32f10x.h”文件。在文件中找到这一段:( D) d9 |5 i1 [) R" P1 m+ o* \
- #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
6 ~, J. i {! n, y6 ^! S" E5 P - /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
" J* l6 r5 L0 J/ ^ - /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */
$ C6 h3 i C: {- ^0 A& w - /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
$ f" V$ S9 {* k5 j# H: c$ Y6 K! M - /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
, R/ l' x0 ]# h4 @3 @8 X
" ?$ O2 J- A' \3 v* s. ?1 k: k- + T; w1 l P6 D/ q4 y6 X9 V
- /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD: STM32 High density Value line devices */
. l# }9 K+ Y$ u1 e - /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */8 z5 ^+ T* }; b& Y2 O- d$ Y
- /* #define STM32F10X_XL */ /*!< STM32F10X_CL: STM32 XL-density devices */
, i- X" q7 Z, m0 w9 \ - /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */
0 U5 i% J' R2 ^$ |. X& ^9 S9 X+ ` - #endif
复制代码 - q% M- j- m* S/ t$ h
将对 “#define STM32F10X_CL”的注释去掉。
! I- `& r* L: j3 W& X1 E% j: e( n; F
1 B# l* P$ B A找到“#define USE_PERIPH_LIBRARY ”将注释去掉。
/ V' T+ c3 J N) s9 ?& a2 B2 O+ ]& ]8 o4 E- U4 V
(12)将“system_stm32f10x.c”加入到组“CMSIS”中,找到如下代码:
( ]3 l4 a+ O. D4 O+ p! R2 ^ p& n. U- d: ]& Y9 A
- #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
* _7 z$ ^. {- l4 S - /* #define SYSCLK_FREQ_HSE HSE_Value */
4 E9 K4 ]* y% g" o - #define SYSCLK_FREQ_24MHz 24000000
* v- i2 B) ^2 u$ h6 F4 w2 K - #else
8 s2 b* R8 U& j; ] - /* #define SYSCLK_FREQ_HSE HSE_Value */
; Z* R( G$ @$ n# I$ j! |6 s - /* #define SYSCLK_FREQ_24MHz 24000000 */
$ B: q! T" L+ A+ F. U. \ - /* #define SYSCLK_FREQ_36MHz 36000000 */
8 y, D2 d4 A1 E( V( ~+ |5 Y - /* #define SYSCLK_FREQ_48MHz 48000000 */4 ?: m- A4 M: {: ^. `# ~) v
- /* #define SYSCLK_FREQ_56MHz 56000000 */. n/ S+ h* ~- o8 r) n; P( G) @& l
- #define SYSCLK_FREQ_72MHz 72000000
+ v9 O& k6 I( k3 u - #endif
复制代码 ! O% A) K5 x! [; A
根据板子上的使用的时钟系统来确定SYSCLK的频率。+ K( z( j/ Z; |9 ]
, R. @1 ^7 e$ {, N W至此,该设置的都设置的差不多了,可以开始写应用代码了。我这里以闪灯程序为例吧。我的开发板上有四个LED,分别对应的GPIO端口D 的 PD2、PD3、PD4和PD7。( ]. N0 k, s; L# |; B! I( a3 }
# t3 T: r7 W2 p5 H5 ?. Z
下面先给一个不利用STM32F10x_StdPeriph_Driver 中库函数,只利用STM32F10x_StdPeriph_Driver中给出的外设寄存器的定义。下面是main.c 的代码。+ }, S& F" Q/ O0 a* ~
/ E9 K, L+ u, ^+ T6 X' }& {8 e" q- #include "stm32f10x.h"0 H8 u U- u* _( O: U* \
- 3 A& T4 q( ~" ^$ L
- void delay(void)6 k- H6 s$ F" G, @# P$ Z7 Y9 j
- {( ?# N% j, r8 S" O
- uint32_t i;& R2 z+ C: @" k/ G! W& K Z( w# y
- for(i = 0; i < 3000000L; i++)0 s+ |2 l$ O o* M
- {
3 F0 k8 M5 T7 p+ y9 f3 o; Y- _ - }
1 E! o) v3 ~$ e' n5 c# A4 S4 Z9 v/ ? - }3 [: k: n9 o0 _4 E
- int main(void)
& n# ?5 `* C/ u' F- H" q - {
- v0 O; J, R3 c t/ F
: p, M8 a' j6 M: g( G( C9 L z* Q- 3 W. X% U7 ]+ H: n5 t( l
- RCC->APB2ENR |= 0x00000020; $ W, y6 G9 o O* z5 e& y# U
- GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode * y# E( V0 S, e6 n
- for(;;)/ ~) ^5 S8 L" ^# T" G% @
- {9 H4 B( b0 n% D
- z9 h$ e: |. f/ c, ?, q1 \
- GPIOD->ODR = 0x00000000;
+ A6 o# H1 F. X, Q0 o6 z" \, L4 w3 T - delay();1 Y& E) R6 h5 V6 f. |
- GPIOD->ODR = 0x0000009C;
7 L: P5 f$ l$ b' T; m3 M - delay();6 }. z: `! w7 B5 _% \- [# ]
- }
7 W* d& F: b+ C" p - }
复制代码 9 @& [( K9 W4 C6 U+ |0 B% |
下面再给个利用TM32F10x_StdPeriph_Driver 中库函数的代码。3 R" L8 D7 x, L, @: }
) Z# V. W% [" L5 `0 X- b
- #include "stm32f10x.h"
3 ], k9 j& l: R7 N5 b- z - 4 J* t9 T3 k! J$ @' K5 i- ]- [6 |
- #define RCC_GPIO_LED RCC_APB2Periph_GPIOD
7 ]0 l/ q! R: q - #define GPIO_LED_PORT GPIOD 1 b1 W6 j- j1 p% d( s
- #define GPIO_LED1 GPIO_Pin_2
# h+ z8 q7 o7 B! W& m - #define GPIO_LED2 GPIO_Pin_3 6 z2 {6 b0 L/ T9 f! V
- #define GPIO_LED3 GPIO_Pin_4 ; b. y1 w- {$ H# @* V5 }
- #define GPIO_LED4 GPIO_Pin_7. j6 _$ G. T. i$ h
- #define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4
3 ^; K* z* ]; x9 V3 z: @1 o+ b( K* {4 M - void delay(void)9 O3 E. P5 p' U% m2 ?1 l2 Y
- {
! c5 F) h o; G Y, S2 L - uint32_t i;; N+ g/ e) A( x3 _/ V) n
- for(i = 0; i < 3000000L; i++)! m8 ?& C; E+ J: L1 ^1 j, ?: [
- {0 p0 h2 U' _* p5 j6 ?4 n
- }
7 z9 _4 u0 A$ ~: D f' Q3 a - }
9 w' O( B) p9 Q" c2 |! e - int main(void)4 W) T, M8 Z3 g- N
- {# \- ]' y5 S% W+ H- K% W1 k! J
- GPIO_InitTypeDef GPIO_InitStructure;
+ b0 q! a2 [( e6 B0 M( ~ - SystemInit();
6 A/ n& v0 q1 f/ S5 d* W - /* Enable GPIOB, GPIOC and AFIO clock */
- ] u% v" N# z1 O - RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE); ! h& A4 U9 {1 ]3 U4 | O) H
- ! a' |" A, u3 z3 [. s5 i0 W: n
- /* LEDs pins configuration */; S$ Y( T0 H$ Q* N6 w+ n
- GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
& ^, `; J, i5 O/ g: k: D1 \" C! ]- { - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
1 j) n; g9 u; t$ y1 B+ F! o - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;' @& X: H, R, z! G
- GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);9 j3 X; A' b/ \% B
- - o8 P, j0 ?* W# r" Z
- for(;;)
* l5 v2 G! N$ g - {
/ u& O, r) g! Q5 k; J1 |: m0 J9 O) Q/ T - GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);( W3 O% R$ f3 b$ }& _6 E
- delay();& X- D' g% J; P' F1 h2 r
- GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);
# Z+ f+ J( k$ j0 `4 r: W1 y - delay();* w+ p; s0 l$ h. F
- } 2 K! A1 @8 E6 r) {, R& T
- }
复制代码
. U( k- J6 j' U' e' _. N编译程序,在链接阶段报错了,错误信息如下:
' T8 Y7 G2 V8 {7 Y4 A. Q& \! u; ?4 s/ k
- Build target 'STM32F107'
. U+ a3 T, ?0 Y7 \9 n7 x ~ - linking..., E' e$ K T, L8 w; o
- test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).! W5 U/ T5 k+ b* G: v+ c
- test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).- W" q/ Y2 z! m5 \ f" e7 Y
- test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).' |6 P% }; [% N8 M- e2 n% ^0 b0 ^0 a$ D
- test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o). m) M8 r |+ b: O6 N
- test.axf: Not enough information to list image symbols.4 }7 R: |3 C, i' s- M# I
- test.axf: Finished: 1 information, 0 warning and 4 error messages.
( T5 ^2 {0 H' |' L1 g+ d - Target not created
复制代码
l4 w8 M1 ^: q4 d; n. T( x, N; p7 Z' r( g6 B$ L
5 B. ^/ ~% r1 ~" {" Q4 a+ S
6 P* R' N4 i5 ]1 X8 G! {. J说的很明白,GPIO_Init、GPIO_ResetBits、GPIO_SetBits、RCC_APB2PeriphClockCmd 这几个函数的实现没有找到。解决的办法显而易见,将“stm32f10x_gpio.c”和 “stm32f10x_rcc.c”两个文件加入到组“StdPeriphDriver”中,再编译就通过了。将程序下载到板子上,一切正常。
* z# _3 t, f, p- N( L) ~9 _
- m/ u7 t7 V- k8 _- w8 g( k上面只说了个大概的流程,还有些如何设置J-Link 一类的都略去了,因为介绍这些的文章实在是太多了。
0 u+ D& h; m9 `% m
4 k r: e2 l7 S6 P+ q* H8 q+ ~& \
0 \7 X* s! ]* B0 _+ Y! ` D) P+ }5 `& R* v5 \" F* g
|