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

STM32MP1 M4裸机CubeIDE开发指南——蜂鸣器实验

[复制链接]
STMCU小助手 发布时间:2022-9-26 23:18
蜂鸣器实验3 D8 S1 s5 p* y8 r
上一章,我们介绍了STM32MP157的IO口作为输出的使用。本章,我们将通过另外一个例子继续巩固IO口作为输出使用的操作方法,不同的是本章讲的不是用IO口直接驱动器件,而是通过三极管间接驱动。我们将利用一个IO口来控制板载的有源蜂鸣器。* I9 R% P9 \% M$ |, g; ~
% ~7 z! ^, w! u# g! f) G
11.1 蜂鸣器简介
1 X7 I6 {( z  r+ r% \蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
. Y, W1 Q& N" |' h2 r3 m! @0 {正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图14.1.1所示:: }, M% ?1 P& _- B# t5 z$ h
2 j* g( Z( }/ c& A$ H, m8 x* \# n% U2 r
f0ca599573094e6791cd56d8473cb2d9.png
- L: e/ x  Y6 }4 n+ ]: ?
+ m' V1 K5 ]: u$ j$ P! i* c图11.1. 1有源蜂鸣器$ Q/ p: e* |+ L. w0 N
这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5KHz左右的方波驱动,才能发声。# i$ H" p5 h1 W6 ~4 g, a8 e
上一章,我们利用STM32MP1的IO口直接驱动LED灯,本章的蜂鸣器,我们能否直接用STM32MP157的IO口驱动呢?让我们来分析一下:( d7 B" J* p3 s6 Q' F7 t
①STM32MP157的单个IO最大可以提供20mA电流(来自数据手册,如下图),而蜂鸣器的驱动电流是30mA左右,如果直接将蜂鸣器接在IO口上,可能会烧毁IO。
9 f8 B2 W. J; k! C2 V: a②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。
* H0 z' F  g, R4 Z所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。
+ |) D+ |7 d- `" F! S7 ~9 ]IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。
6 ?$ x8 N4 D& e* a. e
8 x4 A9 }. q6 Z- D f06bcbaa85d6480c9295329eab95e288.png
3 k9 \) I) t; z* {% X6 t6 [6 v- G) j
图11.1. 2数据手册部分截图3 T/ s8 c) E( P9 R' W5 h
11.2 硬件设计
6 @  j( P: l3 j# s: q1.例程功能/ _9 O4 w' @4 ^* w% ~$ C3 H
控制蜂鸣器每隔1s响或者停一次,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器停的时候,LED0和LED1灭。0 L- ]% ?) |4 p$ K/ M
2.硬件资源/ A- @  d2 x- j8 a3 Y, H8 ?

: B# |9 z' S8 q' p  E 05bd57999137467cb8e0889c2c817b44.png - @& I( b# k. w7 I) ~

" X$ H$ t! L6 E. W5 P! g, T表11.2. 1硬件资源
4 \9 L9 e% n" D0 P) E: `* b! P3. 原理图5 \6 N7 D5 n; @: k  q$ w" e
STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示:
& G( k* P7 ^8 J, l6 U% I* Y* n" P) d8 f# x
b7e46a01b17a4eed90c5dff1ca201681.png 0 `( ^, J: J; j3 u3 E5 z* E5 |2 ^

- ]% k! p& q1 J# R: A) c" q& [. b% W图11.2. 1 LED与STM32MP157连接原理图
0 w$ G2 ~  J; H4 v' m+ o: ]% x/ ?" A. g. ^0 ^
df7fd3a647014c72883ab5911ff338fb.png ' t7 ?' X8 T3 J# C+ }
) h3 M' ~$ N2 X
图11.2. 2蜂鸣器与STM32MP157连接原理图
" `8 B% [3 m) ?) d; S& n: ?+ R图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。
' [% h6 L/ d9 w- j" v1 ?* m& U4 O9 b
/ P+ D& E) U2 A5 {4 V$ W11.3 软件设计
$ J  \7 F0 D0 I  _. _. \
本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘A-基础资料\1、程序源码\11、M4 CubeIDE裸机驱动例程\CubeIDE_project\ 4 BEEP。
; a" z% p. A  W11.3.1 程序设计流程
/ d4 F, Z* b  o' b7 X: {本章节我们通过HAL库的API函数来驱动LED和蜂鸣器,实现蜂鸣器、LED0和LED1以1s间隔交替开启和关闭。其中,我们会用到HAL库中的HAL_GPIO_WritePin和HAL_GPIO_TogglePin函数。实验程序的设计流程如下:) a& |" B& k+ A. K% G

& w' z. P4 b( X  Q7 ?( y 0dc4517c6cb247eda3c99aa9457c55cf.png - |% X+ m! J2 F+ ?

$ n! ]0 Y9 u6 O" U2 J图11.3.1. 1程序设计流程图
0 q4 z8 |% b8 f) S. d. v# i& M" b11.3.2 GPIO功能引脚配置
$ a1 |$ C1 @$ E7 s新建一个工程BEEP,进入STM32CubeMX插件配置界面后,在Pinout & Configuration处配置PI0、PF3和PC7为GPIO Output,并配置PI0、PF3和PC7给CM4内核使用,如下图所示。/ c' h8 w) k) d

$ Q$ o$ \, h' D9 @0 E' } 41b3e0c3f22f4906a1af4d549e4e5efd.png
" o1 q8 q4 J" J% d3 C( B0 H2 U( `" C
图11.3.1. 1配置PI0引脚复用功能
, b6 p; u, L1 t1 g" `接下来配置GPIO的工作模式,其中:& n+ `3 R; k" z& Y- @# g
PC7配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为BEEP;
6 e: Y3 k  t: R# CPI0配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED0;
; h/ B3 X% E! j$ o- F; |4 jPF3配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED1;8 w. n/ O8 |( f5 S: E: v% \
上面的配置,速度等级也可以选其它配置,PI0和PF3的User Label我们保持和上面LDE实验的一致,因为我们要用前面LED工程的实验代码。3 Q) ~. ]; M* A7 z

$ _2 r: A$ M* B4 E" Q f9db551b052a46778dcb864435e3a0b6.png
) @- [2 e$ Q: X8 }
, A7 @# r- I! e' L' p/ l: y# H图11.3.1. 2配置GPIO工作模式( o1 L2 n5 e' e: E; r0 s
11.3.3 时钟和工程配置! |7 v. ~8 y4 D5 b4 p- t
我们采用默认内部高速时钟HSI(64MHz)。同时在Project Manager窗口勾选此项,配置独立生成对应外设的初始化.h和.c 文件:
) G: T3 m' B" Y3 y
* B8 O, g) h: ?! u7 n, K& W b817dc078b464a96bd04666e691f7ae3.png
, p( V% K3 ]$ |2 m( ], B8 G5 }9 `# N9 x0 a7 P  v& `
图11.3.2. 1配置生成外设独立的初始化文件3 v/ {/ h6 o; S! j
11.3.4 生成工程6 m8 i8 n0 m9 R& }: K/ ?
配置好之后,按下键盘的“Ctrl+S”组合键保存保存 LED.ioc 文件,系统开始生成初始化代码。
+ M) w* q' q  y/ _' n2 ^) E! D% f8 c2 L; l
1b3b1952da6f4e94bde01f71d483104e.png
8 {& ], t0 w! U5 a  `9 @" O2 M6 J
图11.3.3. 1生成BEEP工程# g3 w' n  E; J4 k1 }8 b
' a, K2 w4 X5 D! a+ W" ~- @( _
11.3.5 控制逻辑代码实现* a0 ^9 H: y) o" T
1.新建用户文件
' L5 |5 x4 {/ W5 _) l2 |$ S1 e将上一章LED工程的BSP文件夹直接复制粘贴到本工程的CM4工程根目录下。如果还不太熟悉在工程中拷贝文件和新建文件的操作,也可以回头看看我们前面第4.2.3小节,如下图:' F% |, m3 m8 T+ L, v$ }$ P
0 N5 l" Q2 W: M# K
eba9acfe83a34a0a90ec4b6bb181173a.png / u+ H# A7 \( e! h$ ^

& t* ]- \4 j( `1 n, z图11.3.4. 1拷贝BSP文件夹9 w* X" J, @( _* m3 f5 }5 e0 i
在BSP的Include目录下新建beep.h头文件,在BSP的根目录下新建beep.c源文件,如下图:& C& C, ]4 y! B+ g% [
, Z- t" X/ S- b- @/ t0 D
7ce86024c1564aa1a6d9aeed549049ca.png
6 {! t- n3 v4 t7 l& @1 m# s& W: `$ S% d
图11.3.4. 2新建beep.h和beep.c文件" f: O# E" A; p- X) _1 ?" R
最后记得在工程中设置源文件的路径,否则编译的时候会找不到beep.c和led.c文件里的函数。如果把BSP文件夹放在Core目录下的话,就不需要进行这步设置:0 i; Q& m7 j3 v% h3 x1 W! G

8 L; ?8 t: Y$ A+ {/ H6 D( e 8a81bc8a0b464b6f8b3b222118d98524.png 1 E# G( C7 b. x6 R2 B

5 t6 q7 J. B# n  Q图11.3.4. 3工程关联添加的源文件& d$ ~% K- ?1 R8 T# N- @
2. 添加用户驱动代码
3 q# C, `! o7 [+ k+ c在beep.h文件中添加如下代码:) U' D1 D- m/ P) j+ l) E# {' C! S
beep.h文件内容8 A2 |4 G, f- M/ I4 F: [: F, s! W2 J
  1. 1   #ifndef __BEEP_H
    8 ?$ u7 z" U7 N- D( V% s
  2. 2   #define __BEEP_H0 |- b. J7 r0 Y' k. B# @1 `' `
  3. 3 ; W: |+ N* i: B8 |7 G
  4. 4   #include"gpio.h"# Y) I7 e) V! \
  5. 5   /* 蜂鸣器控制 */- v, e& K1 M/ o' _+ T
  6. 6   #define BEEP(x)   do{ x ? \3 q, k% x6 L7 Y+ l1 e$ I7 S+ G' U
  7. 7    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET) : \
    ' l- [4 O& N7 d; D6 o
  8. 8    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET); \ 9                           }while(0)       + r" j1 V! A4 j/ r4 Z5 q
  9. 10
    $ J; r% T& E( O! w8 w# A6 e0 Y
  10. 11  /* 蜂鸣器取反控制 */7 p3 V$ m) B. R
  11. 12  #define BEEP_TOGGLE() \  
    8 [- m. |* r" P9 ?  j8 {
  12. 13  do{ \6 }0 U: _2 s3 v+ j' Z) d0 y
  13. 14      HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); \+ ]+ T" \" u( ~: f4 D
  14. 15    }while(0)                                  /* BEEP = !BEEP */  j- {. e6 o- m$ R5 F  m4 V4 P
  15. 16
    2 y+ u) `3 ~* M! Q) o3 @
  16. 17  void beep_init(void);         /* BEEP初始化函数 */. J2 d+ y3 P7 W2 r& P" A
  17. 18- ^2 M0 ?: S& S6 S" @5 s$ R$ }
  18. 19  #endif  
复制代码

! u5 O$ Y) r" Z; v) P/ vbeep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。
' i) q2 Q5 n5 W: }第6~9行,当x大于0的时候,设置端口位为0,蜂鸣器响;当x小于0的时候,设置端口位为1,蜂鸣器不响。
6 J7 U% j( Z3 @0 N: c第12~15行,对GPIO端口位取反,如果蜂鸣器开启,执行这段语句后蜂鸣器关闭;如果此时蜂鸣器关闭,执行这段语句后打开蜂鸣器。0 @* Z$ W+ l4 o7 k! D8 o: ?
在beep.c文件中添加如下代码,默认关闭蜂鸣器。3 ^8 F! Y! T! s7 U
. A5 T# o- _3 w) w5 h% Y1 |: F
beep.c文件内容
/ _$ i6 r' `5 s# @% {6 m
3 A4 C" O4 k# c. l
  1. 1   #include "./Include/beep.h"5 V/ c( Y8 {. J) V* S9 w
  2. 2
    8 P; l8 ^; j, L, o
  3. 3   void beep_init(void)% T; A' n$ j5 `" `% _' P  Y0 Q
  4. 4   {, R) P. U4 l3 r5 t* G" T
  5. 5           BEEP(0);                            /* 关闭 蜂鸣器 */
    , C+ E! {% i, _. _
  6. 6   }$ A4 i5 T( {* D8 t' z
  7.         main.c文件代码如下:
    5 x: t- [5 E( y7 d/ v
  8. main.c文件内容5 N) F, B/ G$ }' b" x! I4 U/ |
  9. 1   #include "main.h"! h0 N. X+ j( K4 U- w6 N' h+ |6 U
  10. 2   #include "gpio.h"* D* e" w. M# l/ ]0 R8 {; F8 ~
  11. 3   #include "../../BSP/Include/beep.h"( j  Y* }$ |* ]
  12. 4   #include "../../BSP/Include/led.h"/ f. n6 _+ ]* |  Q
  13. 5
    , @: Y( X: j6 ~0 t
  14. 6   void SystemClock_Config(void);
    # |/ v! J  i1 W$ ~6 n2 u$ _
  15. 7 $ L; r# M- ^! l
  16. 8   int main(void)% t" ]9 r+ P8 `. P$ T- Q9 P( {2 B: W
  17. 9   {
    - D% O* V  J2 q4 p7 n- w& }
  18. 10    /* 初始化HAL库 */ 2 a% ]( F/ b7 k+ Z
  19. 11    HAL_Init();2 N  N& O$ h5 D, t' k1 Y+ a
  20. 12   
    5 K. j/ X2 H9 [6 k
  21. 13    if(IS_ENGINEERING_BOOT_MODE())" X3 d, V/ {  C4 v2 {4 h1 K+ F+ R
  22. 14    {
    2 T/ ]* O6 o) Z
  23. 15     /* 配置系统时钟 */$ N- m* ?  y: {% g
  24. 16      SystemClock_Config();8 `, b( _8 l( n3 E1 L) c: g' `
  25. 17    }
    ) ^- w5 k; c7 l  {' m
  26. 18
    , ^" |! o/ p" p0 d
  27. 19    /* 初始化所有已经配置的外设 */" @! n  }( \4 ~
  28. 20    MX_GPIO_Init();
      s6 h+ Y2 h: u# |% V
  29. 21    led_init();                           /* 关闭 LED0,打开LED1  */
    4 v4 G; x: m6 _4 \4 b3 w& X' ~' V
  30. 22    beep_init();                         /* 关闭BEEP */  J2 y( l; p& `
  31. 23    ( X! b. ?2 P' R+ d4 b2 z; ]
  32. 24    while (1)
    . S3 M5 x& z4 j" a- _# }0 @
  33. 25    {
    7 r0 t) t1 u5 q) }! A9 A
  34. 26      BEEP(1);                            /* 打开蜂鸣器 */
    7 V3 v0 Z4 ^$ ]  a1 J7 P$ X
  35. 27      LED0(0);                            /* 打开LED0 */
    6 o9 F( W" t7 |: W8 [
  36. 28      LED1(0);                            /* 打开LED1 */" q* X. G5 A' G* ]
  37. 29      HAL_Delay(1000);" T6 u  Z/ o4 n0 ^
  38. 30      BEEP(0);                            /* 关闭蜂鸣器 */
    # f+ x* B5 i) _" J/ ?
  39. 31      LED0(1);                            /* 关闭LED0 */
    ( t8 r2 a5 a9 {% Z+ q2 ?% f
  40. 32      LED1(1);                            /* 关闭LED1 */
    - r% C: v. O# @( O$ y5 _
  41. 33      HAL_Delay(1000);
    0 e% r) N- `- |! E
  42. 34    }
    & |; W/ F& i3 R- c# Z) B  |
  43. 35  }+ I; X6 o4 s; G# O
  44. 36
    ) E; @' @- _) ]5 x5 q& d
  45. 37  /*系统时钟配置*/4 y/ y0 Y5 o0 ?: P) j# {
  46. 38  void SystemClock_Config(void)5 a! ^1 D* z7 `' B5 X
  47. 39  {
    0 w# O1 u( k/ f2 @: U8 {
  48. 40    /*此处省略时钟初始化代码*/2 `$ X8 Z6 y+ G) v& k( v
  49. 41  }5 h. f+ a+ A) x
  50. 42
    % f; B" T% a! e7 ]2 q
  51. 43  void Error_Handler(void)
    " }7 w: T1 ^7 A- t7 k4 e9 ]
  52. 44  {6 P8 s9 Z1 }: ~
  53. 45   
    % b) Q( [! a; g2 Q, _
  54. 46  }
    8 C* e5 A+ ?" V& r+ K$ \  X4 }! U
复制代码

. I$ t( \- i/ T# D/ G0 V1 pmain.c文件中的初始化代码我们在前面的第10.5.5小节有分析过,这里不再赘述。在while循环中,蜂鸣器以1秒的间隔发声,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器不响的时候,LED0和LED1灭。3 b/ E+ I8 ?" Z8 B( n
& }/ N+ r4 p1 Z5 E
11.3.6 编译和调试
0 i- Q7 ?. N; s7 H& E/ _% ^* e工程编译不报错后,进入Debug模式调试工程,点击运行以后实验现象和我们上面分析的一致。
( [( ?- C2 c& Q( M+ E5 e5 j4 M————————————————% s& t2 |8 y# \5 e
版权声明:正点原子
2 p# F0 P. o1 g  J( E% I) Z' ~: `+ f; B& K
3 f/ F0 \/ _- E# D5 N: ^9 Q. {" C8 M
赞 收藏 评论0 发布时间:2022-9-26 23:18

举报

0个回答

所属标签

相似技术帖

官网相关资源

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