前段时间将 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
! `, 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
( 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
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
* 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- #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
- /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
, }9 P, |5 X0 J% p4 B& r - /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ " X# s3 z# }: L. r* o# w* }2 E' ^
- /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */9 O/ h5 U" w2 [: W9 W2 [
- /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
- [4 Y+ F4 @- M+ `
' m( O" ~) Y9 a* t, m& q- + A7 H- m* Z: D3 }* `
- /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD: STM32 High density Value line devices */- q7 G D; ?0 X, H W9 z9 K
- /* #define STM32F10X_HD */ /*!< STM32F10X_HD: STM32 High density devices */
# c7 B. p, X4 u n+ T8 M" J$ c - /* #define STM32F10X_XL */ /*!< STM32F10X_CL: STM32 XL-density devices */' e& Q# Q8 U0 X7 C, p9 P
- /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */$ G# `- F q- t. k* }, f+ E
- #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- #if defined (STM32F10X_LD_VL) || (defined STM32F10X_MD_VL) || (defined STM32F10X_HD_VL)
" ?, G2 S' p5 h7 i. D- a. j* Y - /* #define SYSCLK_FREQ_HSE HSE_Value */9 j' z" L4 m/ c$ D
- #define SYSCLK_FREQ_24MHz 240000004 @; F/ Y* Y: j& D) v
- #else: p1 R3 P; z; E% S
- /* #define SYSCLK_FREQ_HSE HSE_Value */+ u ^& c6 L2 v0 H. _. T
- /* #define SYSCLK_FREQ_24MHz 24000000 */ # Y# [7 B/ ]! m
- /* #define SYSCLK_FREQ_36MHz 36000000 */
) p6 `; W3 C5 x3 y( \ - /* #define SYSCLK_FREQ_48MHz 48000000 */- u8 P7 v% u9 C5 ^
- /* #define SYSCLK_FREQ_56MHz 56000000 */
; J: r- I O1 z; k3 \1 b - #define SYSCLK_FREQ_72MHz 72000000" E+ ]2 B0 F6 _( a6 j- T
- #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- #include "stm32f10x.h"
% W* B9 n! G2 C$ u H
1 E5 G9 y, i2 R- void delay(void)
1 H( ]' {' l3 V; v- C - {
4 R1 r. Q+ w5 `: r* S" J) _ - uint32_t i;% R- d% U; x" _/ d% r
- for(i = 0; i < 3000000L; i++)$ h8 q: B" W. ~; n9 I
- {
+ u* p' T1 U( s- D% I* B - }
- T5 K& L4 o* i+ O2 s - }
! U# p5 g4 Q) _# N" p Z t - int main(void)$ v O# t& |: K( k, B/ K8 d
- {9 s Y; J/ Q# L. _
- ` h9 X5 `$ S. m. [. C8 z3 O- ; X! N! a, q) z# b
- RCC->APB2ENR |= 0x00000020; - Y- q5 q+ S9 U! M8 m
- GPIOD->CRL = 0x24422244; //PD2 PD3 PD4 PD7 Set to Output mode - B$ A* R- I- ?/ M
- for(;;)2 j! d! q4 O, Y8 ]) @
- { S) u2 @' d( G- _+ N% V+ y1 F* b
- * J; s) Q2 ~! u& Y6 k. n
- GPIOD->ODR = 0x00000000;
7 b1 @# f5 O4 y. c/ B( T - delay();9 c+ O4 w# A4 X% I0 t
- GPIOD->ODR = 0x0000009C;+ A6 ^ M! s* \
- delay();9 O4 r; d) s6 M! q% a, E
- } # A3 _$ \7 y$ F' r1 G
- }
复制代码
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- #include "stm32f10x.h"; f3 L% m$ S. K' m/ J% \
- 6 |$ X$ Z! j6 l" R5 ^ T1 g7 _
- #define RCC_GPIO_LED RCC_APB2Periph_GPIOD
# k$ d! ^2 k# P6 c - #define GPIO_LED_PORT GPIOD ! z7 s) l" u. Q1 L8 [
- #define GPIO_LED1 GPIO_Pin_2 : M; z& l% ]; E( t P$ |% _
- #define GPIO_LED2 GPIO_Pin_3
9 Q4 L X6 F$ m8 m+ c - #define GPIO_LED3 GPIO_Pin_4
7 X6 _0 X+ j ?& F - #define GPIO_LED4 GPIO_Pin_7
3 g. K( H1 r: Z x5 Y ~! b1 m - #define GPIO_LED_ALL GPIO_LED1 |GPIO_LED2 |GPIO_LED3 |GPIO_LED4 5 ] R' K4 j/ G1 W+ t- n
- void delay(void)0 L) D) }. N1 D% B G5 t3 y
- {1 W& h( m; m* P; J
- uint32_t i;
* M' d; _' n9 d$ p! d ?9 I - for(i = 0; i < 3000000L; i++)3 c$ h7 a- Z" @+ Y7 H% u6 L9 I v7 v" |
- {) ?5 U+ C7 ^ L) l/ {, s6 Y
- }
# o% T! g1 Q, g8 Z, h* |" y6 \' l - }) j. K) p3 U C' I
- int main(void)
% u* q: J2 g7 N6 W* w - {. F9 F: e" b% t6 ^& @/ \
- GPIO_InitTypeDef GPIO_InitStructure;
2 ], c# S- M$ {/ A# F7 P0 k - SystemInit();
; y$ B. t! @1 _# Q - /* Enable GPIOB, GPIOC and AFIO clock */# w2 y* V+ V% r- _9 |1 D/ q3 w5 o k
- RCC_APB2PeriphClockCmd(RCC_GPIO_LED | RCC_APB2Periph_AFIO , ENABLE);
_) H# J$ x% v, C6 R/ ^ A" I* m: a/ w - ) {' U- K/ L% w R( f
- /* LEDs pins configuration */
" D! h, m! E4 Y5 E - GPIO_InitStructure.GPIO_Pin = GPIO_LED_ALL;
1 b3 a3 U4 U' {( r! h. R3 c5 S - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;6 B: h0 A; \# K' W/ f C8 j
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
! q1 O0 {, b2 E+ G" ?: C+ u5 ` - GPIO_Init(GPIO_LED_PORT, &GPIO_InitStructure);
9 d5 R# n8 P: E( p -
# R- M, G( a( l+ w5 \& P - for(;;)
- P6 a2 o. j* G" i" k- k* k0 s - {
! ^% a* }# B4 v) B. V9 Q: b - GPIO_SetBits(GPIO_LED_PORT, GPIO_LED_ALL);% Y) ]3 C9 W9 p8 h) U) E7 X& l
- delay(); x- E. \1 V2 j) E0 l: w
- GPIO_ResetBits(GPIO_LED_PORT, GPIO_LED_ALL);: X4 Y- R5 d% i& H0 \
- delay();* g# t/ z: b3 l0 k8 T4 k) t
- } * j# Q# i+ |0 J& r7 `8 B
- }
复制代码
2 K6 s, Y* Z) I; N! W编译程序,在链接阶段报错了,错误信息如下:
9 g* M* K- N8 ]% E3 C/ v: D+ I
6 I2 b3 Q) w& I- Build target 'STM32F107'
. n" O" h0 Y7 i - linking...) E, w7 W& E: Q$ L
- test.axf: Error: L6218E: Undefined symbol GPIO_Init (referred from main.o).
% K- k0 V2 F5 A% u) O2 ~1 A - test.axf: Error: L6218E: Undefined symbol GPIO_ResetBits (referred from main.o).; e$ e" Y. p [+ V) n8 y0 z$ M q% D% @
- test.axf: Error: L6218E: Undefined symbol GPIO_SetBits (referred from main.o).; y' h% h7 z/ q! B3 f( c- Y6 X8 l
- test.axf: Error: L6218E: Undefined symbol RCC_APB2PeriphClockCmd (referred from main.o).# i5 P# g [' N2 D2 B! d
- test.axf: Not enough information to list image symbols.: O5 L0 b( h3 K2 b6 i- k/ p+ Q
- test.axf: Finished: 1 information, 0 warning and 4 error messages.
4 z! K* \- X/ {* R8 P! Q - 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. }
|