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

【经验分享】STM32f103之流水灯

[复制链接]
STMCU小助手 发布时间:2022-5-13 20:00
   这几天打算复**stm32有关的硬件资源,就想着从最开始做起,熟悉下当初所学的知识。学习stm32最初都基本是从流水灯开始的,今天就开始点亮流水灯。
$ K$ u4 b* P  F6 W5 [9 v5 ^# q" r% N9 @" i2 Q% d
首先,必须明白流水灯的硬件原理,以下是原理图:, V& s2 s& z& i) J1 r$ \
9 [. |% i9 W) `0 m. J5 q4 @/ V* R6 g
FGNL{IQB}Z8E2[)RS9T}%FI.png
$ H' }  p0 x$ @  n
( u" b* i+ ]) ^. I' e9 @它由8个管脚控制,因此首先必须进行初始化8个引脚。
1 `! V8 m/ ~7 g: l
5 v. f) U; q0 @( P
  1. //初始化PE8...PE15为输出口.并使能这八个口的时钟                    9 B$ G. l0 @9 A" T' J- r3 R, g2 P$ N. x
  2. //LED IO初始化
    2 A: Q1 O+ u+ n: o# }) C+ f5 o6 \
  3. void LED_Init(void)
    + ~( s4 x, D% z( g9 G5 W9 F0 M
  4. {8 F7 Y( e0 ?; n, U

  5. - S; G! @& x# H$ w0 O- O  p
  6.         GPIO_InitTypeDef  GPIO_InitStructure;
    / s( E$ }  {) |1 M, |

  7.   ~# u6 F) ^( F: r* Z. y: ]
  8.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);                        //使能PE端口时钟3 y; H9 h& M" N4 z% Y
  9. $ g4 H% k$ o8 K  o4 G* [
  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 端口配置
    * T' z6 K9 b$ G- i' Z
  11.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                                                    //推挽输出" {7 B" P% d' g5 i
  12.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                                                 //IO口速度为50MHz2 w7 T: C  {& o$ m5 Z2 c! v
  13.         GPIO_Init(GPIOE, &GPIO_InitStructure);                                                                         //根据设定参数初始化GPIOE
    1 T$ ]3 r: ~2 R* k1 L* G2 f! _( U
  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 输出低
    ' z% H7 ?& F, p) F: x

  15. 2 D! {8 o- ]& l) _- M
  16. }
复制代码

3 u8 u; U! I' g5 T0 t6 F# x! ^& D6 V4 U
这样就实现了流水灯管脚初始化的操作,剩下的操作只需要在主函数中进行相应的调用操作即可完成。9 F8 j! d; L; X# E
为了使程序更加完美,加入了蜂鸣器的初始化,流水灯亮的同时蜂鸣器响。
4 q4 r3 c* {5 I* G7 R) j5 R# d7 ?. z. ]5 O3 Y
  1. <span style="font-size:14px;"><strong>//初始化PB5为输出口.并使能这个口的时钟                    0 z8 ~8 C* `  U( w: c
  2. //蜂鸣器初始化
    , o( X8 a" \! w
  3. void BEEP_Init(void)$ y2 s. P5 w. F2 M2 t( ]
  4. {
      ]( g1 Z* L9 Z2 _4 l
  5.         GPIO_InitTypeDef  GPIO_InitStructure;. P7 _' r4 A9 S( w' u. ]

  6. ! ~" e+ R: N, o/ E, b
  7.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);         //使能GPIOB端口时钟
    ' B8 R/ s( p( Y" _

  8. 0 j2 k2 O4 p$ @6 `8 ]  ?
  9.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                 //BEEP-->PB.5 端口配置7 I% l# m" w# e& b& c
  10.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出, Q5 \) B7 n. [* d' H$ s
  11.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  //速度为50MHz
    # G, A" u- J* d+ D
  12.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         //根据参数初始化GPIOB.5" N9 o( `' M2 H7 ^( \8 L) X) V' r

  13. 1 x4 A3 |" K* o, n8 m
  14.         GPIO_ResetBits(GPIOB,GPIO_Pin_5);                                                //输出0,关闭蜂鸣器输出7 F5 b2 I" p$ N! `* G7 D
  15. }</strong></span>
复制代码
. C3 S# T( E- _3 o3 W1 b* r) ^
在流水灯操作中还有一个很关键的步骤,要想实现精确的延时,哪就要自己编写延时函数。延时有微妙、毫秒延时,可分别按自己的需求进行编写。
! N' J: ?- m9 K1 m' {: c) V
+ A1 d& d$ D" j" V
  1. <span style="font-size:14px;">//初始化延迟函数& T; Z1 y2 L( w" O# e1 L: u
  2. //SYSTICK的时钟固定为HCLK时钟的1/8
    ) g$ V# e" H4 s( _
  3. //SYSCLK:系统时钟. b" V2 ?8 d6 z( V
  4. void delay_init()         3 O- s* w  J# U' Y
  5. {
    ! v3 x- {) m2 y$ P* b2 f8 Z
  6.         SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);        //选择外部时钟  HCLK/8
    * {/ F3 Y8 [1 ]8 R
  7.         fac_us=SystemCoreClock/8000000;        //为系统时钟的1/8  
    2 i) p: f- f2 z$ Z! x# Y: R
  8.          
      g' r2 P) U# q6 D* O
  9.         fac_ms=(u16)fac_us*1000;//非ucos下,代表每个ms需要的systick时钟数   8 u( x0 y" e$ D8 G7 n" C( }. M
  10. }</span>
复制代码
1 m2 {% d5 Q/ f' z
毫秒函数初始化5 c1 J7 {8 W. S6 N, ~- u  L

" r  C, a1 [3 k2 t* P. o
  1. //延时nms
      o: q  r0 ~* ~8 w: Q( @
  2. //注意nms的范围
    0 T& C# @& I. W
  3. //SysTick->LOAD为24位寄存器,所以,最大延时为:
    & f$ p6 C. V& ^: f, F* V  {8 Z
  4. //nms<=0xffffff*8*1000/SYSCLK
    8 H+ z' X" |$ }
  5. //SYSCLK单位为Hz,nms单位为ms
    ' d0 i  G$ l3 z2 \6 K0 X
  6. //对72M条件下,nms<=1864 ' g' k1 j- T( j* Z) x
  7. void delay_ms(u16 nms)
    4 A: z/ l- x  F; a+ e2 Y: n
  8. {                                    
    7 O8 j% p' D% J2 C
  9.         u32 temp;                   3 A7 j. H& \, g7 m* P( n( w
  10.         SysTick->LOAD=(u32)nms*fac_ms;//时间加载(SysTick->LOAD为24bit)& l" h) p9 k; F  @5 v. s1 ~% }& x
  11.         SysTick->VAL =0x00;           //清空计数器
    8 Y9 h, w' l5 W- e" z, ~+ a5 j% C
  12.         SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk ;          //开始倒数  
    1 c2 |5 A/ h& t7 M- c. P0 O
  13.         do
    ' n" S5 o, V2 j2 I
  14.         {8 b! ~; |1 l6 e2 Q! g: g
  15.                 temp=SysTick->CTRL;
    ; |" V( F: v/ L
  16.         }
    6 X" b2 m' }1 [3 C' i6 c
  17.         while(temp&0x01&&!(temp&(1<<16)));//等待时间到达   5 R  H6 u2 s" |  D6 t, V$ s
  18.         SysTick->CTRL&=~SysTick_CTRL_ENABLE_Msk;       //关闭计数器" D6 n2 S+ [; g( V# k( D
  19.         SysTick->VAL =0X00;       //清空计数器                     
    6 t6 R4 {! ]4 _+ F7 \( d
  20. } 5 L6 `  p4 M: M' Q; B0 ?1 P. s# w4 b
复制代码
8 p/ r+ j3 [  |) L& M0 ^
在主函数中进行调用和初始化操作
" E0 T  f7 J8 |9 N* u# N% e, k/ Y! N% n3 P3 Y  ?  n
主函数的调用
* @1 e, Q" J- i4 D+ r

4 V! \- E0 R0 L& K! Z
  1. #include "stm32f10x.h"4 \/ b! I+ r; T3 ^  X; Y. B" [; E
  2. #include "led.h"! E: A6 B" h# d% `" I) F
  3. #include "beep.h"
    + K* E: x9 q- t- v6 Q
  4. #include "delay.h"
    : s# V/ H6 v! j1 j7 o
  5. #include "sys.h"
    5 n2 T4 b. v- }7 J/ J: S

  6. + d  M" V9 E- s% s* u
  7. int main(void)
    3 {6 Z5 o4 b# `* G! o
  8. {
    $ J/ P" G2 H! x
  9.         delay_init();                //延时函数初始化
    , H4 w9 f2 h1 m
  10.          LED_Init();                        //LED端口初始化        ' k/ m* s* k2 L5 h) K7 [6 a' q
  11.         BEEP_Init();        //初始化蜂鸣器端口$ u! h6 V! @( K. ^8 h
  12.         
    & x( k3 O: D2 @5 @5 y
  13.         while(1)( d( \2 ~1 z, M& K* m2 w* F3 V6 t
  14.         {
    + S, K6 L* R  \2 B* k
  15.                 LED1 = LEDON;
    5 c# g, f8 I  Z0 M& _/ d" w6 W. D
  16.                 LED2 = LEDOFF;
    ! C3 W/ S/ ~5 B3 A6 y
  17.                 LED3 = LEDOFF;/ W+ S. |) r0 {" F1 t, y) ^
  18.                 LED4 = LEDOFF;. _9 Z# N0 `2 Z+ y/ G. O; P/ P
  19.                 LED5 = LEDOFF;
    & m; C5 G  }! L, v( N# N5 {
  20.                 LED6 = LEDOFF;
    . O, H, {: \6 Q; |; _& `
  21.                 LED7 = LEDOFF;- S8 a9 D& X' F2 Z: ?% k5 O# K
  22.                 LED8 = LEDOFF;! r/ @) N% K$ V" \
  23.                 BEEP = 1;' L2 E2 g! ?4 g7 ]* Q
  24.                 delay_ms(100);8 N/ x* j2 Z: R3 x  v9 d$ G
  25.                
    / |/ Z' Q9 T2 S' S9 D3 Y- p8 V* ?
  26.                 LED1 = LEDOFF;
    & y6 N* B( T8 E" |% f# @/ S* b
  27.                 LED2 = LEDON;
    4 G6 J3 r- ~2 G6 [
  28.                 LED3 = LEDOFF;
    - L  W3 y" ^! M: [3 F
  29.                 LED4 = LEDOFF;5 {0 ^- x% J( T; V
  30.                 BEEP = BEEPOFF;/ i. V6 E' @9 C/ F8 f8 H+ @- m
  31.                 LED5 = LEDOFF;* q; L( @; h' R; t2 h4 C6 S
  32.                 LED6 = LEDOFF;
    4 ^1 T' f' t( ~& ?  V
  33.                 LED7 = LEDOFF;
    . I; a; v1 \+ S$ |
  34.                 LED8 = LEDOFF;
    3 O' b7 h6 I1 D9 f
  35.                 delay_ms(100);( }5 Q% A) u0 c! J) [2 A, P
  36.                
    ( r2 ~, K6 }7 C4 g2 O
  37.                 LED1 = LEDOFF;6 S: a  |: i/ s  ~! }  D( a. ]" d
  38.                 LED2 = LEDOFF;' d( d7 f6 a: N0 V" l
  39.                 LED3 = LEDON;$ {7 W7 `+ F! ]6 ]+ R5 j) T
  40.                 LED4 = LEDOFF;- r8 h2 L  Q; z* p
  41.           LED5 = LEDOFF;
    " J/ Z- o5 V! y+ H& N) q) v& t6 Z' t$ L
  42.                 LED6 = LEDOFF;
    + ?, p; [) C# Z+ O  ~9 F
  43.                 LED7 = LEDOFF;
    + K- C& j0 w& Y7 V- y7 S
  44.                 LED8 = LEDOFF;               
    ! P; f* N% x* y3 n
  45.                 delay_ms(100);
    3 f7 n, s9 a  N& ]  R. ^
  46.                 + x5 k7 X, X$ }6 ]0 T
  47.                 LED1 = LEDOFF;( l% w7 u5 u3 I0 f, n: b% G5 |  d& @
  48.                 LED2 = LEDOFF;
      P* o4 ^  V2 G! I
  49.                 LED3 = LEDOFF;
    % t& A( T/ ]$ X
  50.                 LED4 = LEDON;. j3 l9 F5 L# s+ q5 K! p+ Z
  51.                 LED5 = LEDOFF;7 c" `& J" a8 X
  52.                 LED6 = LEDOFF;8 n- B& E% m0 i
  53.                 LED7 = LEDOFF;% t; l! @3 @. E1 t
  54.                 LED8 = LEDOFF;                1 P: _4 \' t% D0 K1 c( w  G
  55.                 delay_ms(100);' I2 u/ l" b- u+ t
  56.                 2 C. z4 R9 ?4 ^  Z
  57.                 LED1 = LEDOFF;2 f' m, _# ]! w* ^
  58.                 LED2 = LEDOFF;0 \* U0 T9 ?. _7 U* ^! O
  59.                 LED3 = LEDOFF;
    4 w! K/ f) P5 o8 M
  60.                 LED4 = LEDOFF;
    ) j8 y0 F) n- ~% H) b* t4 P+ W
  61.                 LED5 = LEDON;  e, w& ^& Y" |! \/ r
  62.                 LED6 = LEDOFF;8 l1 R* A5 W: O* Z
  63.                 LED7 = LEDOFF;
    4 S' p3 P; {9 X
  64.                 LED8 = LEDOFF;; W+ |) i- G+ A2 n+ I
  65.                 delay_ms(100);7 l1 Y5 ?$ T3 R6 I
  66.                
    , g% Q' h- ~2 g
  67.                 LED1 = LEDOFF;  ]1 G. I* c0 n$ ]( J
  68.                 LED2 = LEDOFF;
    , _& {* L* d$ `7 ^! ?4 \0 P
  69.                 LED3 = LEDOFF;* m6 ^# W+ {# e, j$ [( b
  70.                 LED4 = LEDOFF;
    2 C3 \$ E' t3 n/ M5 {& ?0 }
  71.                 LED5 = LEDOFF;: L: o# c& v' l4 `
  72.                 LED6 = LEDON;- C7 U* V- b  }, X" s% K
  73.                 LED7 = LEDOFF;
    9 B: Y; a$ ^% p- Q) K
  74.                 LED8 = LEDOFF;
    % s* T% `4 K4 A4 V: T9 M& a( b. I, b: r$ y
  75.                 delay_ms(100);4 ^& K1 ^+ Q- I+ y" y
  76.                 1 m6 }8 ^2 R) j# ?  o3 k9 @5 z2 w* t# \
  77.                 LED1 = LEDOFF;6 h, ~5 S& @# X
  78.                 LED2 = LEDOFF;/ V7 x+ i% v, V. z
  79.                 LED3 = LEDOFF;
    ) H! c* C, q2 a/ y, C* p$ Q
  80.                 LED4 = LEDOFF;
    9 e0 x; P1 D& u: U* T3 D, m$ m
  81.                 LED5 = LEDOFF;
    2 Q5 b7 H- x" E# L2 }/ T
  82.                 LED6 = LEDOFF;; H. ~) n) Z' |6 n9 E
  83.                 LED7 = LEDON;
    8 N1 ~3 _, S( H" G" f) b) [
  84.                 LED8 = LEDOFF;6 k( q4 k1 Y* K/ ?. a* t  v5 d
  85.                 delay_ms(100);
    2 J2 `8 y$ ]4 t) P( Q4 k
  86.                 , L( \- K" D' p) w
  87.                 LED1 = LEDOFF;: x1 r% v5 g* {7 u. F8 ^
  88.                 LED2 = LEDOFF;
    ) y. l; R0 G: ^$ w
  89.                 LED3 = LEDOFF;1 e5 z9 D/ S  [% D9 r5 c2 \: N) U# |! n
  90.                 LED4 = LEDOFF;
    ' ^9 P+ t7 _) f5 e, q
  91.                 LED5 = LEDOFF;
    , ?5 |% x4 ]; O. |
  92.                 LED6 = LEDOFF;
    / x7 N7 L, W8 a9 w( o+ m5 J  k
  93.                 LED7 = LEDOFF;
    % }2 i+ A6 R8 Y% D
  94.                 LED8 = LEDON;
    0 O! v2 w' h1 w% [+ `8 U# A7 r" W
  95.                 delay_ms(100);2 N7 }( g' v% k  s* t$ }! ]
  96.                
    ) j6 s5 R3 t- Q; F7 `4 u5 @' H
  97.         }         
    4 W/ [+ h8 i4 }
  98. }
复制代码
2 O6 ^* e2 e# H* }8 z
       主函数中写的其实是最简单理解的程序,也是很多初学者很容易编写出的程序。原理是依次让每个灯亮,每个灯之间添加延时函数,以实现流水的效果,具体延时多少看自己的个人爱好,想让它变化多快在延时函数里面实现。
4 E$ {1 L  F3 K3 [# u- d- p一下是实验的最终结果。其实还很好看。(在以后做东西的时候可以将流水灯加上去,效果很好看的,比如加在小车上,或者四轴飞行器上,这样的话看起来挺酷的!)
- U( j2 x1 ^1 N' }! O0 _& M8 h# a0 m" J6 [7 r
一切都得从最基础开始,小的实验室为了以后做更大项目。
( G8 \8 n9 U: n  b2 I; S2 h
: h5 ]) Q. e. y! e 20140920114510038.jpg
; \; L0 B+ t: x* I$ t. e' s) S& e
8 c- A# Y" t" ^; R
6 Z4 Q7 A+ V; M) `* `$ Z5 [; H: Y2 \* i4 b! _; Q! R) |' |

. Z" ?& y* W/ S. `" Y- o1 J; e! Z
收藏 评论0 发布时间:2022-5-13 20:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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