初识STM32与震动开灯
% R: E! M1 d, v% ]之前听我朋友说STM32就是调库,很简单 最近也突然想学一下STM32基础知识,就买了一些相关硬件跟着视频做一些简单的小项目,不竟然(虽然在操作过程中都是配置固件库里面的函数)真正想掌握一点也不简单。不管学什么都需要自己多花时间,慢慢积累才是最重要的。作为一种兴趣学习希望自己也能坚持
/ o! r8 v% S3 o4 x8 B5 p
" F* W6 @, V& k* X" r. _; N下面就用迷你版STM32开发板从最简单的点灯开始学习吧
2 ]" a! `( U H
9 t: ]+ Y% d! X7 u一、准备工作% q" `6 {1 T1 a' Z) Y# g) O% _
1.所用软件
4 [) S7 E: [/ a# A7 G+ O9 ?" X& Q; @' S5 z% ]
1 E- B5 s. a" I! n. _5 {% w I* w
5 Y2 O, W% N7 n6 M1 Y/ D5 Y5 Y2.所用硬件
7 w- \: Y" _* I7 ]2 ~' o& n2 a
% |$ Y( T' r& @% v! G. G下面的学习过程中都采用了模块化的编程思想,以及建立自己的固件库,由浅入深 慢慢熟悉STM32相关寄存器的配置
' | V, R5 Q: H% ^1 G
0 \9 {0 f4 D$ k* j% w2 |二、环境搭建( H( t0 C; Z" x; p) c
1.先建立一个存放文件的文件夹,将我们所需要用的软件放在一起2 F: E# n! C* u" O
% a* y; M" T4 [" X# @$ x7 w$ l3 M
" f- [0 Z+ ?$ I1 e7 Y- I* l- n3 Q
) g% i5 Y- [$ }) [0 s( p5 R2.先后双击下面两个文件8 i: x+ L) h( Z
" c( F4 P4 d' O* _- B: C
* i. k8 r! \# a' ]/ ?& `. g
, M: i6 G/ \4 P2 A6 O) K3 E% k- a& A/ O
( k/ x8 r& _' ?9 b+ y. i
- E* q3 N7 `" p1 ]$ _
7 P% V; Z) R' E8 I; T2 P4 k4 ]
3 r9 m4 o3 K, k) F& g6 |8 C
4 g C" M- F6 l
上面KEIL5安装完成后再加入我们所需要的包,双击安装就可以了8 ]/ g2 w8 D5 {2 e' R+ ^$ `
接着把所需要的一些串口和烧入程序的软件对应安装就可以开始我们的第一个工程了6 N9 u6 M! O4 x8 b
1 z7 n; X; E" l
) \# y7 B0 t: H: M- k
: A9 g# @& v6 N% e2 D* N三、建立第一个工程
8 Q5 }8 v$ U& X
2 Z) g n7 O: h3 w5 F8 u8 R
( v: D4 O1 N: ^: P) }; i4 p4 m k
2 v2 J% \/ i3 T4 d$ y4 q
3 f3 n) G- F# ^6 x, l
7 @0 I/ d6 p5 P" F& v这里我选择的是STM32F103下面的C8芯片
& E9 L; @7 g+ I% B8 @+ {7 R$ Y; _
; C1 q8 J" G6 c" D' o# ~! m
% |9 M5 }/ X+ C$ _! X* k
7 T6 i8 Z% y/ j% P上面点击保存后,我们命名为.c文件在添加进去就可以开始编写程序了9 L8 Y8 w! a$ H
& }3 e9 O2 ^4 D( r) Q# U
+ O" J; j& A5 D/ S, ]
$ D6 p2 r0 Y3 z# Z四、开始第一个小项目,震动开灯) ^: I& t$ J- f6 k3 [0 X
(一)led函数编写( C. D) W7 L& M! b
1.头文件led.h
% ]. ]" |$ @+ i4 j) |% i9 B" ?- h b v
- #include "stm32f10x.h"
* L6 f6 l: j l0 P: r. l# V2 j1 D - void Led_Init(void);
复制代码
5 n+ s: c4 G5 |- j2 v7 t2 u' X2.源程序
6 I/ e! G2 ~, o! n3 T% E' F" H. ?+ A: X K& X6 B
- #include "led.h"
0 z7 {* H* D: G: M4 T - #include"stm32f10x.h"
6 Q" k& a1 [5 a6 u - void Led_Init(void)
( ?& L# b$ b& ?5 F - - i5 N9 O, t0 y: \3 K: ^7 G
- {: B% w& X$ R: T W8 a
- % i" u- |6 U; X2 a* V- j' P5 e) m4 s
- GPIO_InitTypeDef Led_init;
" z4 C5 B6 M. p; S/ W$ ~ - // 1.使能APB2的时钟
' L( _# a9 g! k6 Y - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); }+ q l& Q9 j: `' ^/ l' N
- * @; f5 x5 o7 ?* u& b
- //2.相关结构体配置
" m L4 o! ]) \+ \ - Led_init.GPIO_Mode = GPIO_Mode_Out_PP ;
( s# W' {5 r4 n; I - Led_init.GPIO_Pin = GPIO_Pin_13 ;
8 k Q1 h! Y- { - Led_init.GPIO_Speed = GPIO_Speed_10MHz ;( k% r8 r1 S/ C, Z7 T+ e
-
9 w2 S) W( {$ s/ V) L, t! o0 A5 t5 d - GPIO_Init(GPIOC , &Led_init );
+ }. J2 l) w5 d, c: M! @: c% H! c - }
! l. ?3 m. e- ~, K
复制代码
p# @' Q6 U# N8 H(二)继电器配置# C8 r. ^* s/ q, g$ i, l. p
0 a; c9 [- z0 A1 n
1.头文件relay.h/ \2 M/ ?$ l& h" x7 D
' a/ \8 a! x/ _# _, a h2 W- #include "stm32f10x.h"
( W/ l1 S; w' R4 r$ Q1 n - void Relay_Init(void);
复制代码
9 B4 C, m m P6 W' @$ }6 w2.源程序
# S/ x- O% z2 ?- g+ X2 E- E( O& b6 [5 Q- g B5 w+ W
- #include "stm32f10x.h"% j* C% ~+ F" r0 m0 L
- #include "relay.h"
' w+ q' I. t+ q$ _) {9 |- N - 7 ~6 P2 |1 L, U/ Y; i2 u, v
- : a9 u, V! [3 t- |" N
- void Relay_Init(void)
) _! C; a7 k3 e5 L; P - {9 T' P% b# N1 z+ P; ^% C
- + D/ T+ K- z8 D$ z' \3 u0 ]+ m
- GPIO_InitTypeDef Relay_Init;
9 J/ R, C) g* {- B* R; ] - //1.配置时钟
) e9 v& [- o/ p! g; M# }8 i# } - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);( n; t: }+ o! H; M U }
- : G+ V% ^, { z4 |* t
- //2.配置结构体* S9 l' B2 ]; z9 w l5 C
- Relay_Init.GPIO_Mode = GPIO_Mode_Out_PP; ) P- ]. v- ~. [) |* d
- Relay_Init.GPIO_Pin = GPIO_Pin_3 ;( Y! S0 T3 C9 i4 ~& O
- Relay_Init.GPIO_Speed = GPIO_Speed_10MHz ;
% C% g9 j3 s- L9 A1 k, A - //初始化函数/ P( W2 o5 e/ T% {
- GPIO_Init(GPIOA , &Relay_Init );
8 s( x3 l; X# y( k: ^ - 2 v5 X; d Y- r8 f! A
- }
复制代码 . F: G- ~& x# w3 f
(三)震动传感器( B# b- [- M2 K& ]1 z2 C7 F
3 f- ^- r) w! b7 ~1.头文件4 w5 i: j1 T" E. g" q
9 Y" g$ @$ r4 Y+ o* A1 ]8 ^3 N: D8 Q- #include "stm32f10x.h"
" e& i# x& y$ Y8 `, y, L - void Shake_Init(void);
复制代码
; a4 L L6 H8 J+ S. M+ y/ [2.源程序( {# C8 W' z6 F- z2 K
2 T* X% |8 C$ Q. x
- #include "shake.h"% H* I a. [$ j3 ?' @3 A6 v- s
- #include "stm32f10x.h"
: D, p) L& j7 e4 z* J* W- J3 h
# S9 b0 c: u# x, M
' C3 _0 ]; E3 o2 M# g4 y' y, V4 b, v- void Shake_Init(void)! P( D" u$ R! g9 t1 \. @
- {* s# b& u- G3 G
- 3 z% _4 a8 C, ]6 ?
- GPIO_InitTypeDef shake_init;4 {. \) Q( ? Q* Y5 j
- //打开GPIOA时钟 A1
# f) l2 a* _2 M' J - . s/ K) W2 e9 Q
- //2.配置GPIO结构体/ r ]5 v! d0 Y
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
8 e& X3 v, Z+ O5 f& ^4 u H -
$ I( W; K8 [( B& }2 @ - shake_init.GPIO_Mode = GPIO_Mode_IPD ;//ÏÂÀµÍµçƽÕð¶¯
* _4 g, {4 }/ e8 t- v; K - shake_init.GPIO_Pin = GPIO_Pin_1 ;
2 S0 [# r+ m7 ~8 O2 r1 l+ G - shake_init.GPIO_Speed = GPIO_Speed_10MHz ;6 v7 U% n% f( H, |. n D
-
4 k; f% V; D/ n4 A5 | - GPIO_Init(GPIOA ,&shake_init ); V3 }! Y* L c, O
- }
复制代码 ! a5 U! R( V; N: l! X; q! p4 j
五、代码整合主函数main.c; o0 g I* ?( I
0 G# Z% @. z i, ] ^7 g' L4 g- #include "stm32f10x.h" |1 F* H) i% ?2 r( p
- #include "main.h"' p' C/ }6 N/ {" m
- #include "led.h"( _, x6 S' J, Z' k
- #include "relay.h"2 ?0 x4 k- t' l
- #include "shake.h"
2 g1 W6 y; ?2 l8 }6 J
9 Z) b9 R: k9 I- 3 H. c4 p/ R% P1 G, i3 d4 P0 C! K
- //延时函数
) V& f ?4 D2 ~& t6 u8 G - void Delay(uint16_t time)
! q, K; i# J3 Z7 g( B - {
8 e4 d- a1 ^, v( G/ V p8 R. } - uint16_t i=0;
* `8 ]$ U3 `; W: C* e5 s5 `" w - while(time--)+ ~7 E# ]7 R5 ]! l
- {6 A# Q% Y5 t) n" @7 x6 F0 j* `- l
- i=12000;
: @% r" H* p! b' l. ]) j1 A5 ? - while(i--);
* i) Y4 w% l) Y9 k - }
* t% f6 r1 U+ l7 ` - ; [: @0 f% }# f# t9 e) A) \: R
- }7 }0 y2 p+ a1 p$ s1 m5 D; m# z
- ' m5 D, ^! n. l
-
$ \. O7 G G2 u, `! I8 l - int main()
2 m3 Q$ s3 m: K7 B6 e7 h- b, k - {* z+ m. G+ h0 U* q% D% p8 X5 M
-
- U( Z. f+ \* U7 L' g0 W0 T1 ` - Led_Init(); //led初始化 H2 M" [) {; V, }& K! Q
- Relay_Init(); //继电器初始化2 I5 N2 j2 ~5 Q$ ^
- Shake_Init(); //震动传感器初始化
% O, z Y5 e) C2 n1 m" s" N0 f7 x h - GPIO_SetBits(GPIOA, GPIO_Pin_3 ); //初始化继电器为高电平
( g& I8 K2 w Q5 e- w7 w5 R& N - while(1)
8 l; E, M. m$ S$ i5 \0 n1 { - {" w- ]% D, u$ S3 U
- - T+ c: e3 X+ h) O4 x w! @" z
- /* GPIO_ResetBits(GPIOC, GPIO_Pin_13);
$ J* J$ }0 E& P - Delay(1000);
8 a! b2 V) w, _5 ~4 I) Y, e5 q- _ - GPIO_SetBits(GPIOC, GPIO_Pin_13);3 }: O4 b: m3 F7 l
- Delay(1000);; J' D1 A$ ~" `# g' j
- */+ s* Z! R$ c; g- Z
- // GPIO_ResetBits(GPIOA,GPIO_Pin_3); //ÀµÍº¯Êý
; P, [6 D$ l+ t6 f( w4 C" c& {# t - if(GPIO_ReadInputDataBit (GPIOA ,GPIO_Pin_1 ) == 0)- d8 S/ O' n( v7 r' y
- {
6 c5 W! u r. v, I - GPIO_ResetBits(GPIOA, GPIO_Pin_3); //拉低继电器1 l$ R+ d3 _$ \! Q% M, j0 K
- Delay(1000); //延时1s
7 w K, W6 @* p6 s - GPIO_SetBits(GPIOA, GPIO_Pin_3); //拉高继电器
* p. t$ I( W" z! T - }# t% L, X5 o d E3 V
- else
* W y% s# L" u+ f1 A) r* S - {
) O! X" F2 Y! [. c/ i9 m - GPIO_SetBits(GPIOA, GPIO_Pin_3);
2 q% ^" C- X. j9 N8 B3 X& H - }& a3 y( z) @! Y2 K0 C6 p
! T) i4 Y" U" b0 c4 Q. x; v- }9 g) e( a# s; l2 g( d9 k7 b
- 5 O! [% C+ W9 a! d: k
- }
复制代码 0 B+ ?+ W- f( h( G2 J: ?8 ]. U
*注意因为在程序中有很多头文件是我们自己建立的,在编译的时候可能会出现警告,下面我们需要配置一下我们所放头文件的路径
, n- t% l* A0 D; [7 _1 b! {- K5 d' x9 y5 W0 z+ O5 h
( A5 ?6 T; f+ x [, k0 A \2 ]3 i- Y0 q. h" f$ S
G& \/ x1 h4 W( Y: f0 e% F" I$ _2 A6 K1 m2 ?* u
* G2 ~% m* L, J2 ?
; \: C' O A+ I- \. H+ @5 W6 T7 w, G根据上面的配置后再次编译后就不会出现问题了,然后我们在下载到开发板,将led通过杜邦线接好就可以实现我们的震动开灯了,具体的接线就不做介绍了% V( O6 [* T$ G2 [: w# g2 k+ `' h
————————————————1 t6 l8 F. n7 m( E0 r* `
版权声明:@slow-walker
9 o. h- O: V% M: n! f; Z+ m5 E. w& {4 r' M! R# O6 R+ C' a
. s0 m. p( f4 E- p u( p* N, E |