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

初识STM32与震动开灯

[复制链接]
STMCU小助手 发布时间:2022-10-27 14:10
初识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% ]
NMGWQ6XB(9}~B)QZ3{}Y_LT.png 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 }O4ZMKQIKD~3B@]MH[UYQFL.png
% |$ 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 20210401232102650.png
" 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 2021040123264790.png * i. k8 r! \# a' ]/ ?& `. g
, M: i6 G/ \4 P2 A6 O) K3 E% k- a& A/ O
20210401232802133.png ( k/ x8 r& _' ?9 b+ y. i

- E* q3 N7 `" p1 ]$ _ 20210401233313600.png
7 P% V; Z) R' E8 I; T2 P4 k4 ]
20210401233109607.png 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
20210401233720747.png ) \# 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 20210401234216328.png
( v: D4 O1 N: ^: P) }; i4 p4 m  k
2 v2 J% \/ i3 T4 d$ y4 q 20210401234403612.png 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 20210401234559532.png % |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 20210401234653817.png
+ 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
  1. #include "stm32f10x.h"
    * L6 f6 l: j  l0 P: r. l# V2 j1 D
  2. 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
  1. #include "led.h"
    0 z7 {* H* D: G: M4 T
  2. #include"stm32f10x.h"
    6 Q" k& a1 [5 a6 u
  3. void Led_Init(void)
    ( ?& L# b$ b& ?5 F
  4.         - i5 N9 O, t0 y: \3 K: ^7 G
  5. {: B% w& X$ R: T  W8 a
  6.         % i" u- |6 U; X2 a* V- j' P5 e) m4 s
  7.          GPIO_InitTypeDef  Led_init;
    " z4 C5 B6 M. p; S/ W$ ~
  8.          // 1.使能APB2的时钟
    ' L( _# a9 g! k6 Y
  9.          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);  }+ q  l& Q9 j: `' ^/ l' N
  10.         * @; f5 x5 o7 ?* u& b
  11.          //2.相关结构体配置
    " m  L4 o! ]) \+ \
  12.           Led_init.GPIO_Mode  =   GPIO_Mode_Out_PP ;
    ( s# W' {5 r4 n; I
  13.           Led_init.GPIO_Pin   =         GPIO_Pin_13 ;  
    8 k  Q1 h! Y- {
  14.           Led_init.GPIO_Speed =   GPIO_Speed_10MHz ;( k% r8 r1 S/ C, Z7 T+ e
  15.         
    9 w2 S) W( {$ s/ V) L, t! o0 A5 t5 d
  16.          GPIO_Init(GPIOC , &Led_init );
    + }. J2 l) w5 d, c: M! @: c% H! c
  17. }
    ! 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
  1. #include "stm32f10x.h"
    ( W/ l1 S; w' R4 r$ Q1 n
  2. 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
  1. #include "stm32f10x.h"% j* C% ~+ F" r0 m0 L
  2. #include "relay.h"
    ' w+ q' I. t+ q$ _) {9 |- N
  3. 7 ~6 P2 |1 L, U/ Y; i2 u, v
  4. : a9 u, V! [3 t- |" N
  5. void Relay_Init(void)
    ) _! C; a7 k3 e5 L; P
  6. {9 T' P% b# N1 z+ P; ^% C
  7.         + D/ T+ K- z8 D$ z' \3 u0 ]+ m
  8.         GPIO_InitTypeDef  Relay_Init;
    9 J/ R, C) g* {- B* R; ]
  9.         //1.配置时钟
    ) e9 v& [- o/ p! g; M# }8 i# }
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA   , ENABLE);( n; t: }+ o! H; M  U  }
  11.         : G+ V% ^, {  z4 |* t
  12.         //2.配置结构体* S9 l' B2 ]; z9 w  l5 C
  13.         Relay_Init.GPIO_Mode  =  GPIO_Mode_Out_PP;        ) P- ]. v- ~. [) |* d
  14.         Relay_Init.GPIO_Pin   =  GPIO_Pin_3 ;( Y! S0 T3 C9 i4 ~& O
  15.         Relay_Init.GPIO_Speed =  GPIO_Speed_10MHz ;
    % C% g9 j3 s- L9 A1 k, A
  16.         //初始化函数/ P( W2 o5 e/ T% {
  17.         GPIO_Init(GPIOA , &Relay_Init );
    8 s( x3 l; X# y( k: ^
  18.         2 v5 X; d  Y- r8 f! A
  19. }
复制代码
. 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
  1. #include "stm32f10x.h"
    " e& i# x& y$ Y8 `, y, L
  2. 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
  1. #include "shake.h"% H* I  a. [$ j3 ?' @3 A6 v- s
  2. #include "stm32f10x.h"
    : D, p) L& j7 e4 z* J* W- J3 h

  3. # S9 b0 c: u# x, M

  4. ' C3 _0 ]; E3 o2 M# g4 y' y, V4 b, v
  5. void Shake_Init(void)! P( D" u$ R! g9 t1 \. @
  6. {* s# b& u- G3 G
  7.         3 z% _4 a8 C, ]6 ?
  8.         GPIO_InitTypeDef  shake_init;4 {. \) Q( ?  Q* Y5 j
  9.         //打开GPIOA时钟  A1
    # f) l2 a* _2 M' J
  10.         . s/ K) W2 e9 Q
  11.         //2.配置GPIO结构体/ r  ]5 v! d0 Y
  12.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA  , ENABLE);
    8 e& X3 v, Z+ O5 f& ^4 u  H
  13.         
    $ I( W; K8 [( B& }2 @
  14.         shake_init.GPIO_Mode  =   GPIO_Mode_IPD  ;//ÏÂÀ­µÍµçƽÕð¶¯
    * _4 g, {4 }/ e8 t- v; K
  15.         shake_init.GPIO_Pin   =   GPIO_Pin_1 ;
    2 S0 [# r+ m7 ~8 O2 r1 l+ G
  16.         shake_init.GPIO_Speed =   GPIO_Speed_10MHz ;6 v7 U% n% f( H, |. n  D
  17.         
    4 k; f% V; D/ n4 A5 |
  18.         GPIO_Init(GPIOA ,&shake_init );  V3 }! Y* L  c, O
  19. }
复制代码
! 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
  1. #include "stm32f10x.h"  |1 F* H) i% ?2 r( p
  2. #include "main.h"' p' C/ }6 N/ {" m
  3. #include "led.h"( _, x6 S' J, Z' k
  4. #include "relay.h"2 ?0 x4 k- t' l
  5. #include "shake.h"
    2 g1 W6 y; ?2 l8 }6 J

  6. 9 Z) b9 R: k9 I
  7. 3 H. c4 p/ R% P1 G, i3 d4 P0 C! K
  8. //延时函数
    ) V& f  ?4 D2 ~& t6 u8 G
  9. void Delay(uint16_t time)
    ! q, K; i# J3 Z7 g( B
  10. {
    8 e4 d- a1 ^, v( G/ V  p8 R. }
  11.         uint16_t i=0;
    * `8 ]$ U3 `; W: C* e5 s5 `" w
  12.         while(time--)+ ~7 E# ]7 R5 ]! l
  13.         {6 A# Q% Y5 t) n" @7 x6 F0 j* `- l
  14.                 i=12000;
    : @% r" H* p! b' l. ]) j1 A5 ?
  15.                 while(i--);
    * i) Y4 w% l) Y9 k
  16.         }
    * t% f6 r1 U+ l7 `
  17.         ; [: @0 f% }# f# t9 e) A) \: R
  18. }7 }0 y2 p+ a1 p$ s1 m5 D; m# z
  19. ' m5 D, ^! n. l
  20.         
    $ \. O7 G  G2 u, `! I8 l
  21. int  main()
    2 m3 Q$ s3 m: K7 B6 e7 h- b, k
  22. {* z+ m. G+ h0 U* q% D% p8 X5 M
  23.         
    - U( Z. f+ \* U7 L' g0 W0 T1 `
  24.         Led_Init();    //led初始化  H2 M" [) {; V, }& K! Q
  25.         Relay_Init();  //继电器初始化2 I5 N2 j2 ~5 Q$ ^
  26.         Shake_Init();  //震动传感器初始化
    % O, z  Y5 e) C2 n1 m" s" N0 f7 x  h
  27.         GPIO_SetBits(GPIOA, GPIO_Pin_3 );   //初始化继电器为高电平
    ( g& I8 K2 w  Q5 e- w7 w5 R& N
  28.    while(1)
    8 l; E, M. m$ S$ i5 \0 n1 {
  29.          {" w- ]% D, u$ S3 U
  30. - T+ c: e3 X+ h) O4 x  w! @" z
  31.         /*        GPIO_ResetBits(GPIOC, GPIO_Pin_13);
    $ J* J$ }0 E& P
  32.                 Delay(1000);
    8 a! b2 V) w, _5 ~4 I) Y, e5 q- _
  33.                 GPIO_SetBits(GPIOC, GPIO_Pin_13);3 }: O4 b: m3 F7 l
  34.                 Delay(1000);; J' D1 A$ ~" `# g' j
  35.         */+ s* Z! R$ c; g- Z
  36.                 // GPIO_ResetBits(GPIOA,GPIO_Pin_3);  //À­µÍº¯Êý
    ; P, [6 D$ l+ t6 f( w4 C" c& {# t
  37.                  if(GPIO_ReadInputDataBit (GPIOA ,GPIO_Pin_1 ) == 0)- d8 S/ O' n( v7 r' y
  38.                  {
    6 c5 W! u  r. v, I
  39.                          GPIO_ResetBits(GPIOA, GPIO_Pin_3);  //拉低继电器1 l$ R+ d3 _$ \! Q% M, j0 K
  40.                          Delay(1000);                          //延时1s
    7 w  K, W6 @* p6 s
  41.                          GPIO_SetBits(GPIOA, GPIO_Pin_3);     //拉高继电器
    * p. t$ I( W" z! T
  42.                  }# t% L, X5 o  d  E3 V
  43.                  else
    * W  y% s# L" u+ f1 A) r* S
  44.                  {
    ) O! X" F2 Y! [. c/ i9 m
  45.                           GPIO_SetBits(GPIOA, GPIO_Pin_3);
    2 q% ^" C- X. j9 N8 B3 X& H
  46.                  }& a3 y( z) @! Y2 K0 C6 p

  47. ! T) i4 Y" U" b0 c4 Q. x; v
  48.          }9 g) e( a# s; l2 g( d9 k7 b
  49.                     5 O! [% C+ W9 a! d: k
  50. }
复制代码
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
20210402000934287.png
( A5 ?6 T; f+ x  [, k0 A  \2 ]3 i- Y0 q. h" f$ S
20210402001042928.png
  G& \/ x1 h4 W( Y: f0 e% F" I$ _2 A6 K1 m2 ?* u
20210402001119623.png
* 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
赞 收藏 评论0 发布时间:2022-10-27 14:10

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版