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

【经验分享】STM32f103之流水灯

[复制链接]
STMCU小助手 发布时间:2022-5-13 20:00
   这几天打算复**stm32有关的硬件资源,就想着从最开始做起,熟悉下当初所学的知识。学习stm32最初都基本是从流水灯开始的,今天就开始点亮流水灯。
: x- [1 Y: x1 P; s. }
) E( k1 l3 {. f' g/ e$ G首先,必须明白流水灯的硬件原理,以下是原理图:8 M' J4 X& T3 W' t/ x0 l

, L* F6 u8 U, O- j: X: ~, ^ FGNL{IQB}Z8E2[)RS9T}%FI.png
. x/ E: F8 f5 k7 p( \# H' |$ t. f, x% g5 m
它由8个管脚控制,因此首先必须进行初始化8个引脚。
. l7 h7 {3 g$ W" }9 u: y5 }
8 O- |1 P) m# N! t
  1. //初始化PE8...PE15为输出口.并使能这八个口的时钟                    
      q$ X  }8 o' M& O! O
  2. //LED IO初始化/ b+ i  w  ?: a  B+ y8 f
  3. void LED_Init(void)+ s1 @# o  v1 H* b. X$ _
  4. {# L; b1 h# p& W/ J- o

  5. 2 v- ~6 T; e+ ?" q
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
    + w+ b) D, Q8 _4 O

  7. * L. s" q# y6 T
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);                        //使能PE端口时钟
    2 M3 ?$ {2 ~1 R, F, n' U1 l# K
  9. * A1 C6 |! C0 f0 o( K
  10.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;                                         //LED1-->PE.8 ...  LED8-->PE.15 端口配置; B& B. r" L5 P9 `+ ~
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                    //推挽输出
    $ k7 `/ |' \0 }) q+ s& f  N
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                 //IO口速度为50MHz
    $ R: ^8 s9 p4 s5 p" E
  13.         GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                         //根据设定参数初始化GPIOE! ^* F0 Y3 H+ M
  14.         GPIO_SetBits(GPIOE,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                                                                                 //PE.8 输出低( [5 M) m0 e. B) X5 d/ K! g2 _

  15. ; c8 E/ w* o4 @. j
  16. }
复制代码

+ w2 Z1 b( _% R7 [! }" P# _9 X* u
这样就实现了流水灯管脚初始化的操作,剩下的操作只需要在主函数中进行相应的调用操作即可完成。, e* E9 D1 \# m- a) K
为了使程序更加完美,加入了蜂鸣器的初始化,流水灯亮的同时蜂鸣器响。
+ I6 t( |1 c3 }" ?& F" g  G7 q
! I" D5 L( J2 d- z
  1. <span style="font-size:14px;"><strong>//初始化PB5为输出口.并使能这个口的时钟                    " l- D  `- J! r5 o: I: J. G' i
  2. //蜂鸣器初始化, o& Q" L0 S" M* z+ d
  3. void BEEP_Init(void)' u/ k, ^! P9 l
  4. {5 Z, I+ b5 l5 n8 H- c  V5 b
  5.         GPIO_InitTypeDef  GPIO_InitStructure;8 y6 f0 U$ j8 S+ u1 f0 y

  6. ( J# ?$ G; C' Z3 `
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能GPIOB端口时钟$ j% {& e! h/ `* \! Z5 }
  8. ( B  Y' T* W) A# ~& ?8 W) x3 Y; W, _
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //BEEP-->PB.5 端口配置
    5 F! v: V0 z# s% C6 |
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
    8 U# N) ^6 U' R! K; v
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //速度为50MHz
    / K" J/ r! y6 C8 K7 x/ [8 p
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据参数初始化GPIOB.5
    - o  \9 s: y; P! G4 s

  13. ! v5 F8 ^  H" D- Z  T. I1 S
  14.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);                                                //输出0,关闭蜂鸣器输出
    * y2 _4 s) m) g7 K$ Q8 E
  15. }</strong></span>
复制代码

1 D8 ^. ~5 ^2 W" ?& e在流水灯操作中还有一个很关键的步骤,要想实现精确的延时,哪就要自己编写延时函数。延时有微妙、毫秒延时,可分别按自己的需求进行编写。# A- a* d  e% v: i% q1 m0 [2 U
- P- h/ H" O& `& I7 E/ m+ j# s* l
  1. <span style="font-size:14px;">//初始化延迟函数
    / N) [3 a9 [/ Y- i. m; \8 I
  2. //SYSTICK的时钟固定为HCLK时钟的1/8( v* P% Y# m" P+ i, {- ~
  3. //SYSCLK:系统时钟
    ' M2 p. |/ C$ h8 S8 ]% z" a+ y8 v
  4. void delay_init()         
    4 x: ?: O7 [% Z9 [3 u
  5. {
    ) E3 T* N% h* D  S0 U2 U8 {
  6.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
    9 M# ]+ E6 ^$ K2 ^8 M
  7.         fac_us=SystemCoreClock/8000000;        //为系统时钟的1/8  
    0 ]( U& j$ m1 a. I. K1 S
  8.          , M2 C# t& ]; I8 G: A
  9.         fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   
    4 C4 a/ H4 _7 H; G; O" ]' X$ j
  10. }</span>
复制代码
2 ~' q6 q0 O. C; v. [$ E+ Y
毫秒函数初始化* Q, w: A5 B! |4 I3 Z. ~
6 q$ k4 U1 M$ |) y; v' h9 x5 l2 F
  1. //延时nms
    4 e3 m, Z) R9 G" t
  2. //注意nms的范围
    ( n( S9 p8 M5 g* Z/ D, U% i# w
  3. //SysTick->LOAD为24位寄存器,所以,最大延时为:
    2 L7 v- R6 L0 Y. h& S7 t6 [2 h+ `
  4. //nms<=0xffffff*8*1000/SYSCLK: ^3 v  g5 @9 w6 [3 j8 U
  5. //SYSCLK单位为Hz,nms单位为ms
    $ w4 K& n1 A) ~6 b
  6. //对72M条件下,nms<=1864
    1 S* b. J, j/ b* j
  7. void delay_ms(u16 nms)1 F0 g8 c' S# C
  8. {                                     + L- a( s; A) Z* c5 H
  9.         u32 temp;                  
    " Y  Y8 S# B5 ?/ I9 f: K( W& [
  10.         SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)
    * h1 n! U' j& l) z9 N/ c' `0 d
  11.         SysTick->VAL =0x00;           //清空计数器
    & K4 x% D$ s$ I7 |+ ~3 c' j( K
  12.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  . ?+ L# d# H" R: n, V
  13.         do2 |+ d" o( b' s9 b
  14.         {7 I- \! Z0 {  H* A3 l
  15.                 temp=SysTick->CTRL;# A0 K& k- [2 c4 l
  16.         }( h: A& |! T* b+ P/ ~8 N+ _
  17.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   
    6 p$ [( w: K# E) f# T
  18.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器8 P& t" H2 D/ X+ @! Z) {
  19.         SysTick->VAL =0X00;       //清空计数器                     
    - S! S8 \4 Q. I' X5 G
  20. } . Y3 D9 E' z2 g
复制代码
& T( W. N4 G$ ]
在主函数中进行调用和初始化操作
- J! r/ d% t, }& [' H. t% N; m9 q) }3 _1 g  _* B) x; z& l/ F5 X9 w' ~
主函数的调用

  T" k/ P# j+ }
6 Y* M8 l6 C3 Y* Y7 u* O
  1. #include "stm32f10x.h"
    : s3 L* e: g5 Q( I2 i4 h  N
  2. #include "led.h", B0 V1 g- K2 j" Z+ A! i  k  {3 i8 R
  3. #include "beep.h"
    ! j- ?- `6 a. k5 h7 b( \- B
  4. #include "delay.h"* E* {& Z, d: j$ u6 [2 D( N% j
  5. #include "sys.h"
    ( @+ h0 O9 N# Z
  6. 1 Y7 X. p$ j9 g& t* G
  7. int main(void)- _7 Y5 R% G+ c4 A  v
  8. {
    ) U6 ?# C! h3 F+ L' |: Q, n
  9.         delay_init();                //延时函数初始化
    4 d. F8 V  ~6 \$ y
  10.          LED_Init();                        //LED端口初始化        
    2 d- D  T) d" D6 P
  11.         BEEP_Init();        //初始化蜂鸣器端口5 a" \& h4 Q. s  I# }! d5 _5 ^
  12.         4 G1 K+ U! Q' h4 y* |6 y# z7 a: M8 ^
  13.         while(1)
    / D" E+ M5 O+ G' j+ }
  14.         {
    + w# P  C' b; M" b9 r; v/ t1 N
  15.                 LED1 = LEDON;5 [- i$ x3 q  [6 k! K1 d  q/ Y: D
  16.                 LED2 = LEDOFF;
    1 u% B2 Q& f  s6 x0 g& N
  17.                 LED3 = LEDOFF;& E- r# E+ B' O  B' V) Z8 Q7 z
  18.                 LED4 = LEDOFF;5 M0 p  h0 b  Q
  19.                 LED5 = LEDOFF;
    2 s: A( _' q# g  y* Z. g  }' k
  20.                 LED6 = LEDOFF;
    , V9 D0 T5 Z# f( R+ A! X( j
  21.                 LED7 = LEDOFF;
    / e3 s! s* `# {8 d3 |5 u, h
  22.                 LED8 = LEDOFF;2 _. Q8 p" }/ W$ f
  23.                 BEEP = 1;( F0 a3 X# n: E" z" D
  24.                 delay_ms(100);
    , q: k+ ?5 N7 I9 h6 n6 m( p7 w+ m* `
  25.                
    4 n' Y8 K* h+ M( V% @
  26.                 LED1 = LEDOFF;( M3 z" u: `, A! ?& G; A+ k
  27.                 LED2 = LEDON;* B# u1 Q5 I3 G6 ~- |% L# K- D
  28.                 LED3 = LEDOFF;
    4 K* d6 C& `" v8 b& E
  29.                 LED4 = LEDOFF;
    2 H8 L& Y6 ^7 a4 Y! g, A# y9 A5 t
  30.                 BEEP = BEEPOFF;
    - n) F$ J8 e7 ^1 z7 m( r
  31.                 LED5 = LEDOFF;
    / x5 d1 ?+ j8 b# ?9 m' d( E
  32.                 LED6 = LEDOFF;# _3 `; G" q- G4 P* z0 ~8 {
  33.                 LED7 = LEDOFF;
    5 ~! O2 e6 l6 @
  34.                 LED8 = LEDOFF;+ n( O5 j0 W% u  b& C2 H, |4 s# R
  35.                 delay_ms(100);/ ^4 [5 w# X; [) m3 Y5 Y& {
  36.                
    2 \& ?6 v; Y8 N( G
  37.                 LED1 = LEDOFF;
    ) l6 p. {' q, h0 v: E
  38.                 LED2 = LEDOFF;: x8 ^/ a' g: b. G2 T: A
  39.                 LED3 = LEDON;
    # W  Q- m, s! V1 u3 X& x
  40.                 LED4 = LEDOFF;, q) C! _: e# x+ V6 M
  41.           LED5 = LEDOFF;0 G3 j5 K. O; V# A
  42.                 LED6 = LEDOFF;" M  N- N0 c2 ]" _' y
  43.                 LED7 = LEDOFF;
      R- T' h  c1 F" v0 s1 Z
  44.                 LED8 = LEDOFF;                ; A1 T+ V- {; C4 h) Y& n
  45.                 delay_ms(100);! j$ L5 b( n4 ^9 O; K5 Z. d/ }. C
  46.                 0 g* L" Q+ W$ @7 w, X
  47.                 LED1 = LEDOFF;1 F+ O+ V% d: j  t% O
  48.                 LED2 = LEDOFF;( ~- T- V, f1 s- p1 r
  49.                 LED3 = LEDOFF;4 p8 v! j: c% x
  50.                 LED4 = LEDON;
    7 d1 X2 [; C+ K7 d5 W! |
  51.                 LED5 = LEDOFF;& ?5 c- r) ~6 ^
  52.                 LED6 = LEDOFF;
    ! T- g( R" \; S% d9 q& a" y3 m
  53.                 LED7 = LEDOFF;7 V* R) U& R% F8 z  \* m$ l
  54.                 LED8 = LEDOFF;               
    ! O3 m% l8 |8 u6 R: q$ d
  55.                 delay_ms(100);- `: j1 O1 b- F5 V: V) }. t9 a
  56.                
    2 F! B  V; @- V& h
  57.                 LED1 = LEDOFF;# Q! j0 l0 G+ V, p
  58.                 LED2 = LEDOFF;( x' e* }+ R: ~& F
  59.                 LED3 = LEDOFF;
    0 a2 t& X6 b% x3 t: W1 m3 G" u% v* x
  60.                 LED4 = LEDOFF;
    ( ^1 e4 d4 D1 ?! l& g
  61.                 LED5 = LEDON;
    % T; S# v) @  {- p4 l; ~
  62.                 LED6 = LEDOFF;
    . e8 v8 `* G( k2 k7 W
  63.                 LED7 = LEDOFF;/ A1 K3 j3 H, X2 b
  64.                 LED8 = LEDOFF;5 }1 {* }- n) V
  65.                 delay_ms(100);
    - t5 O  y5 i$ k: F1 j
  66.                 ' Y+ m/ S+ Y# L# ]; z$ u' A
  67.                 LED1 = LEDOFF;+ ]: s. B2 ?2 d/ n+ U
  68.                 LED2 = LEDOFF;
    % I$ b4 l( v" j+ o
  69.                 LED3 = LEDOFF;7 u$ C  x' d' x# s3 W
  70.                 LED4 = LEDOFF;
    9 `5 n8 [" [7 K4 {1 k: V
  71.                 LED5 = LEDOFF;
      Q& ]$ K2 I* y( o4 N( O
  72.                 LED6 = LEDON;
    + p' Y% ?: X: \7 B% Q6 D) y  H
  73.                 LED7 = LEDOFF;
    # w9 B" ]4 Y" a& K' l2 w, Y0 z: B4 J
  74.                 LED8 = LEDOFF;
    # [) H5 H0 I' O" A3 |
  75.                 delay_ms(100);2 E- D- f+ K: J  }, K3 D
  76.                 5 z0 T3 U4 e* Y+ t7 S, k
  77.                 LED1 = LEDOFF;; G( f; y# m, R  r
  78.                 LED2 = LEDOFF;; ?9 p0 e9 n: R6 @
  79.                 LED3 = LEDOFF;- k+ ]$ Q8 Q" Q  @4 k4 f
  80.                 LED4 = LEDOFF;) ]% t' a! i& }5 T/ k1 r
  81.                 LED5 = LEDOFF;( N- b2 m2 r/ v6 e  [" D
  82.                 LED6 = LEDOFF;2 n4 `7 C* a, @8 m( y8 X1 W
  83.                 LED7 = LEDON;
    $ n) v  f" h  ^' A/ l& [5 O- `3 |! C
  84.                 LED8 = LEDOFF;
    / P) l) h4 d, ~2 W3 M% z5 G3 G
  85.                 delay_ms(100);
    3 q- d) F. }4 U8 T" d8 \5 k8 u
  86.                
    5 y+ R/ t- J0 u2 F
  87.                 LED1 = LEDOFF;
    ' _* }5 f8 E( M* v8 Z
  88.                 LED2 = LEDOFF;
      a' e' E4 `7 s0 x/ D- G& i
  89.                 LED3 = LEDOFF;( o& r. n* i2 e2 A1 e3 W
  90.                 LED4 = LEDOFF;
    4 Y  b& l' t# Y3 V) D# W" {. [
  91.                 LED5 = LEDOFF;
    ) r- G/ R% }! \7 }- z; u7 {+ O$ w
  92.                 LED6 = LEDOFF;
    ( ~- S6 g0 j$ A) E( x9 m6 R  N
  93.                 LED7 = LEDOFF;
    * h& }6 D; E# C
  94.                 LED8 = LEDON;
    + X. X1 b& k6 T; S' \. J
  95.                 delay_ms(100);
    0 U- F& {) k$ m  O8 {' g4 P5 H
  96.                
    4 Y# ~: P0 M3 Y8 ]  u" v
  97.         }         $ H1 M& x2 @* h% Q. O- P# M) I
  98. }
复制代码

- I. j4 ~  \6 p1 J' d5 }       主函数中写的其实是最简单理解的程序,也是很多初学者很容易编写出的程序。原理是依次让每个灯亮,每个灯之间添加延时函数,以实现流水的效果,具体延时多少看自己的个人爱好,想让它变化多快在延时函数里面实现。
# @% S' N6 u* j7 g) z8 T) E4 n一下是实验的最终结果。其实还很好看。(在以后做东西的时候可以将流水灯加上去,效果很好看的,比如加在小车上,或者四轴飞行器上,这样的话看起来挺酷的!)" _: N$ c3 z+ Q% o+ \9 o, k: v. F
8 D% e6 L4 i7 C0 d
一切都得从最基础开始,小的实验室为了以后做更大项目。
  N4 V6 `  R& q9 c) T9 m* V: `' d6 U7 T% Y  L
20140920114510038.jpg
6 Q+ }, I( P- j! q9 J, _* ~5 A5 Y& t0 S7 S6 X' |

4 \# f! C  i8 e4 A* `; Y
4 a! e! t4 a5 k% F  G$ \6 Y/ B1 |1 m4 }5 S

! h4 E2 V. I8 |) p- e- [2 H2 y
赞 收藏 评论0 发布时间:2022-5-13 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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