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

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

[复制链接]
STMCU小助手 发布时间:2022-9-26 23:18
蜂鸣器实验# P! z: Y) C; [
上一章,我们介绍了STM32MP157的IO口作为输出的使用。本章,我们将通过另外一个例子继续巩固IO口作为输出使用的操作方法,不同的是本章讲的不是用IO口直接驱动器件,而是通过三极管间接驱动。我们将利用一个IO口来控制板载的有源蜂鸣器。
9 ]" j; k# }3 t& J
) [3 [+ {3 [* `; w5 I+ M$ a11.1 蜂鸣器简介
5 y; H9 s/ a1 O% [9 ?0 h蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
5 q$ `  n( \$ ~. L5 `正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图14.1.1所示:
0 t4 A( U( e" q& T0 E/ }4 j1 A# m1 [. y
f0ca599573094e6791cd56d8473cb2d9.png
& l  N# y& O( A- |  m3 X* ~. [# K% W8 h- E: J- o9 P# H8 y* `
图11.1. 1有源蜂鸣器
# M$ m! c* b7 l0 ~5 h这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5KHz左右的方波驱动,才能发声。
  ~- |* n0 ~' e7 P9 v: M9 y上一章,我们利用STM32MP1的IO口直接驱动LED灯,本章的蜂鸣器,我们能否直接用STM32MP157的IO口驱动呢?让我们来分析一下:
( j. F% [- N* Q; ~. F9 ^①STM32MP157的单个IO最大可以提供20mA电流(来自数据手册,如下图),而蜂鸣器的驱动电流是30mA左右,如果直接将蜂鸣器接在IO口上,可能会烧毁IO。
4 U* i( R/ z/ U! K②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。* @, u- P* K% ~, b5 ]- _
所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。; v) ~6 y: s& J' k2 U
IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。
$ L4 V7 g# V% {1 k+ ^. Q/ v2 `# }- d- y
f06bcbaa85d6480c9295329eab95e288.png - \+ y, S0 S2 \* R+ M. @

6 [1 Y6 e  h3 b. ~图11.1. 2数据手册部分截图% M( e& c+ _: N4 M  B# {
11.2 硬件设计
) d' ?. }/ k2 d( E( v8 V+ f1.例程功能0 N# g2 }# x# d% f, V& @% d
控制蜂鸣器每隔1s响或者停一次,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器停的时候,LED0和LED1灭。7 R0 r8 N4 s: \% b% W  V4 `
2.硬件资源
# }7 Q! E5 ^, F
! A. N7 U+ ^* ?8 G 05bd57999137467cb8e0889c2c817b44.png , q: p$ F  R; j' F! p% G1 j/ ?; T
" B6 `& O1 _) C9 c" F7 f
表11.2. 1硬件资源, X! y  ^# s4 T
3. 原理图; O" m0 ~. Q" x9 t8 {! v; n9 Z
STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示:
3 }' X  L) g  Y4 ]3 C' I7 k$ M! n6 k4 y' f7 x7 k2 _- u
b7e46a01b17a4eed90c5dff1ca201681.png
0 @; X# `5 I  D. }* J. j+ f0 w1 Y- \1 o, Q0 O
图11.2. 1 LED与STM32MP157连接原理图
9 p1 ~0 w1 Z; O  ~; \! w, T, Q* z! e  f  E6 I2 U$ G, G
df7fd3a647014c72883ab5911ff338fb.png + v3 [7 ~$ L3 O% x1 B) n, I- `
9 w3 m% R, |* ^7 r
图11.2. 2蜂鸣器与STM32MP157连接原理图
% `! G6 B# k/ F, ~' o+ {图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。
5 ]# u2 I( [- ]( i
8 N& g1 U! V+ F4 G, q6 F8 S% M11.3 软件设计

' ^) Q2 o: @& h6 I* p0 E; ?本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘A-基础资料\1、程序源码\11、M4 CubeIDE裸机驱动例程\CubeIDE_project\ 4 BEEP。
( c- U; G2 [) E6 ^- \11.3.1 程序设计流程$ M/ \5 K2 n  W. x4 i$ V! a( N
本章节我们通过HAL库的API函数来驱动LED和蜂鸣器,实现蜂鸣器、LED0和LED1以1s间隔交替开启和关闭。其中,我们会用到HAL库中的HAL_GPIO_WritePin和HAL_GPIO_TogglePin函数。实验程序的设计流程如下:
. O, s( Q. g# J" D: Y2 j
9 O0 j3 N, J: ] 0dc4517c6cb247eda3c99aa9457c55cf.png * f8 Z8 d% a7 K; y/ o$ O' q) y0 O

* S7 u/ \% Z: H3 ~! n图11.3.1. 1程序设计流程图1 u. z! L8 K6 }! R2 K0 ]$ y
11.3.2 GPIO功能引脚配置
; q/ `# z3 ]6 K! [3 A' {) O( E; o新建一个工程BEEP,进入STM32CubeMX插件配置界面后,在Pinout & Configuration处配置PI0、PF3和PC7为GPIO Output,并配置PI0、PF3和PC7给CM4内核使用,如下图所示。
! {4 A2 M2 e; O+ s
1 Z) P5 q7 K' E2 G3 i1 @7 l: u 41b3e0c3f22f4906a1af4d549e4e5efd.png
' y# o, G3 d3 l' J% e* p2 [* q( G
5 L4 n( U* y) W9 m$ E$ P' Z图11.3.1. 1配置PI0引脚复用功能# k. t! k$ z  E; W4 |
接下来配置GPIO的工作模式,其中:
8 W0 e0 J7 Q% f9 F8 B0 F# t& \5 ~: C$ fPC7配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为BEEP;
- p, S- |9 h: W8 p4 |8 fPI0配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED0;  y# d3 k- c4 x0 [0 _% I0 t
PF3配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED1;& T, m' D! C  C; j- W+ o
上面的配置,速度等级也可以选其它配置,PI0和PF3的User Label我们保持和上面LDE实验的一致,因为我们要用前面LED工程的实验代码。
  D: y$ b& [2 T+ T/ R4 ~7 X* K9 s  `2 K) v& u7 n# B1 d
f9db551b052a46778dcb864435e3a0b6.png 6 K6 A( E. s2 Z+ N* r

2 Y% H6 l4 f; _" k" ]1 d图11.3.1. 2配置GPIO工作模式
4 m2 p) j& Y# Y& X. ?. o11.3.3 时钟和工程配置, P. `9 M; D" Y
我们采用默认内部高速时钟HSI(64MHz)。同时在Project Manager窗口勾选此项,配置独立生成对应外设的初始化.h和.c 文件:
, M3 V# x4 W5 q& o( w
& q4 x- r5 m8 k4 e" v" l4 E) k b817dc078b464a96bd04666e691f7ae3.png . E) h( t: f' }! @
' m  ?( W" x5 {% B; e2 ^
图11.3.2. 1配置生成外设独立的初始化文件
) F2 ]- r; |' a, h0 B: r6 h11.3.4 生成工程
+ z1 w8 P! S1 U6 Z配置好之后,按下键盘的“Ctrl+S”组合键保存保存 LED.ioc 文件,系统开始生成初始化代码。
+ w" p* R4 o, T$ d& h
. m+ ]( `8 ]& H" W: W* e* P- V 1b3b1952da6f4e94bde01f71d483104e.png * g1 L' o+ j2 }& N# V6 U* m; {. k

# [7 \; G; I/ u- W, G6 r7 `' \- J图11.3.3. 1生成BEEP工程* y& n' R! @+ p/ [! n

2 ?* A( ]3 N, `+ t2 ?& a11.3.5 控制逻辑代码实现0 o; Q  u0 B, j% m1 v/ }- i0 t
1.新建用户文件$ J1 p" g$ o# ~: p; `  ]" y
将上一章LED工程的BSP文件夹直接复制粘贴到本工程的CM4工程根目录下。如果还不太熟悉在工程中拷贝文件和新建文件的操作,也可以回头看看我们前面第4.2.3小节,如下图:
9 `  J% K/ W& \) B; w( K' E$ G  z# Y2 ]$ v0 {% F/ Y
eba9acfe83a34a0a90ec4b6bb181173a.png # c5 H! j7 f: [) \# G: a) J

) r" x4 G, D; s+ F9 d图11.3.4. 1拷贝BSP文件夹+ U: u. x) l; Q
在BSP的Include目录下新建beep.h头文件,在BSP的根目录下新建beep.c源文件,如下图:
# [6 U- W# X/ R" A
" k# Z; F: g; J0 z$ u0 e 7ce86024c1564aa1a6d9aeed549049ca.png
' K# o5 v' N% E, A0 v7 S" a5 a0 ~5 ~
图11.3.4. 2新建beep.h和beep.c文件
5 t: H# r8 W# j* W8 B7 C5 b+ v6 Q3 h最后记得在工程中设置源文件的路径,否则编译的时候会找不到beep.c和led.c文件里的函数。如果把BSP文件夹放在Core目录下的话,就不需要进行这步设置:
2 b8 ~- p" L/ G# E" c
$ e7 h5 w: P& _ 8a81bc8a0b464b6f8b3b222118d98524.png
! ]. f+ D/ g& C0 A" {4 Y$ _! @
( N" ~8 I  g' m; S' p图11.3.4. 3工程关联添加的源文件
5 T1 |+ g  @5 U2. 添加用户驱动代码
8 u8 r; Y% N8 n: ]* o# i* {在beep.h文件中添加如下代码:9 I) H1 v# }: C0 [8 f! t
beep.h文件内容$ y1 q; t2 E6 ?" _/ n6 k8 b
  1. 1   #ifndef __BEEP_H
    0 R) q* W- p2 |0 X1 j
  2. 2   #define __BEEP_H
    2 o4 o6 M7 n/ Q, G
  3. 3 3 L" R) q: s; {5 E8 e) ~% z
  4. 4   #include"gpio.h"8 w8 X/ i7 c6 P
  5. 5   /* 蜂鸣器控制 */
    - H+ ?  M, m9 D. R
  6. 6   #define BEEP(x)   do{ x ? \6 A" K8 ]1 N; S3 p2 m) ?. D
  7. 7    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET) : \
    , H% l# s2 J6 j8 E% b
  8. 8    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET); \ 9                           }while(0)       . m2 D& p; W, d+ o& e; K( v! [0 A
  9. 10/ O# @' Q4 R, a( d8 F+ @! `) _
  10. 11  /* 蜂鸣器取反控制 */
    : J- U% w. G- c0 K9 U
  11. 12  #define BEEP_TOGGLE() \  " j6 S/ A2 j: a, N: |( X
  12. 13  do{ \
    * [8 g- [) s. D9 C* ]  w
  13. 14      HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); \
    & U4 j7 a$ h* i! K3 v  H6 J
  14. 15    }while(0)                                  /* BEEP = !BEEP */
    1 D7 L7 X! u) c$ i3 k) E  n1 |
  15. 16
    4 f+ ]- v: h/ R- B' ?
  16. 17  void beep_init(void);         /* BEEP初始化函数 */
    : X, U/ m- U: b" X. Z* J
  17. 18
    ! C2 F: L7 a5 ^
  18. 19  #endif  
复制代码

7 R4 ^, H4 ^6 K. {1 h2 ]beep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。
# o, {3 T) Y3 m: G& Y第6~9行,当x大于0的时候,设置端口位为0,蜂鸣器响;当x小于0的时候,设置端口位为1,蜂鸣器不响。
+ P- @6 ?" k1 ^7 r8 \7 R/ m第12~15行,对GPIO端口位取反,如果蜂鸣器开启,执行这段语句后蜂鸣器关闭;如果此时蜂鸣器关闭,执行这段语句后打开蜂鸣器。: b" Y. F" ^- N$ S* u: t* U
在beep.c文件中添加如下代码,默认关闭蜂鸣器。3 Y: I7 k9 F, v( {2 {4 D
/ j  j! Z  w1 `( y' W7 N9 b
beep.c文件内容" J8 d, _# e. @5 r! R  }+ P

# B. ?, E% a% e7 Z9 q- E/ x
  1. 1   #include "./Include/beep.h"
    + N/ B' Y, b4 D0 a6 l, s
  2. 2
    6 J, L4 e+ l! Z+ U2 I$ S3 ?! A
  3. 3   void beep_init(void)% z3 q4 w( v0 g! u3 ~% X7 s
  4. 4   {
    : o6 _8 H! f8 [! i7 g7 b
  5. 5           BEEP(0);                            /* 关闭 蜂鸣器 */
    9 Q/ q/ f, F' ^! W9 ]: s% p
  6. 6   }9 D0 v' O. {, c1 Q" C; a8 U( n
  7.         main.c文件代码如下:9 s( I& g0 ~5 [! `8 x; W
  8. main.c文件内容
    - U( ?& @! X5 m" b+ _0 H2 I
  9. 1   #include "main.h"
      v) `1 i1 ], B, \9 s( ]
  10. 2   #include "gpio.h"+ F+ M' d7 O" k- s# ~1 W) ]& f
  11. 3   #include "../../BSP/Include/beep.h"8 H: ~! w& i4 ^0 g& s
  12. 4   #include "../../BSP/Include/led.h"  f# C6 R9 L# |) z+ Y/ A2 K, F
  13. 5
    - y$ r6 W# m0 ?: D
  14. 6   void SystemClock_Config(void);
    0 V5 V% Z' f8 N+ i+ Z
  15. 7 9 W# Y4 T. Q, l+ _; T; R
  16. 8   int main(void)
    ! I" S) E' z) e# ]  q
  17. 9   {5 Q4 ?5 N7 B) K0 K! |
  18. 10    /* 初始化HAL库 */
    % g( Z) {: t1 l; i
  19. 11    HAL_Init();
    % X6 x4 J# r7 a* V" s; F% t; G
  20. 12   # S& a% u+ d9 T0 K7 V
  21. 13    if(IS_ENGINEERING_BOOT_MODE())3 `- j( x7 R0 N0 r
  22. 14    {
    ) `; X4 ^9 _3 u5 ?- g
  23. 15     /* 配置系统时钟 */
    * q' ?8 n  u. h( O* u; p
  24. 16      SystemClock_Config();
    - k, y7 `: {2 _2 n/ |( A3 K
  25. 17    }
    2 N3 t8 O, P& ?+ C
  26. 18
    . _3 W$ ~7 v% H! w  x6 U: [
  27. 19    /* 初始化所有已经配置的外设 */
    % R+ \1 E; z- e  @2 r
  28. 20    MX_GPIO_Init();# ^) k! Z6 {$ q5 v% `, h; W% M0 {
  29. 21    led_init();                           /* 关闭 LED0,打开LED1  */# d% |2 f2 Z9 i4 h
  30. 22    beep_init();                         /* 关闭BEEP */; y/ S+ M. y) o& ^
  31. 23    $ {. b2 n8 b1 u+ [, f1 n
  32. 24    while (1)
    ! T6 c3 v+ O6 K+ J& |" V' Y
  33. 25    {1 ]& E2 F7 Y! A
  34. 26      BEEP(1);                            /* 打开蜂鸣器 */
    7 |) o% H+ V; E1 u$ _
  35. 27      LED0(0);                            /* 打开LED0 */
    2 m  A  [5 i4 U* s7 {" o. t
  36. 28      LED1(0);                            /* 打开LED1 */6 n: [! o6 e; g2 g2 R% `
  37. 29      HAL_Delay(1000);
    3 `5 ~# B& y' i$ O, J  l7 h6 j+ Z
  38. 30      BEEP(0);                            /* 关闭蜂鸣器 */
    6 D0 y2 b1 C3 _, ]
  39. 31      LED0(1);                            /* 关闭LED0 */3 k, [; Y. C7 J9 \9 q2 q
  40. 32      LED1(1);                            /* 关闭LED1 */5 n8 @# r" a5 e* K5 x+ x# Z# w# b
  41. 33      HAL_Delay(1000);4 ^# R- X3 g. j5 p- h# ~8 j/ G5 i1 K
  42. 34    }
    . d! ^8 N' p  y9 b3 A$ k& }% }
  43. 35  }5 x# v) T! X) m# i: j# Z
  44. 36
    5 l1 @& K) A& u8 I. J
  45. 37  /*系统时钟配置*/
    + c+ n4 C& u7 U$ P. ~! ?
  46. 38  void SystemClock_Config(void)
    * i* l8 M+ h% L
  47. 39  {
    # m. l' J, U; E* Y
  48. 40    /*此处省略时钟初始化代码*/
    * q8 T1 I: q3 T
  49. 41  }
    6 s6 U0 Z+ ~8 [0 m& u7 W% J# b: P
  50. 424 d& `9 I* ?" p; H3 t2 Q& q+ U
  51. 43  void Error_Handler(void)
    " D7 |1 ~0 n4 S$ D
  52. 44  {
    5 M9 ]2 Y2 }8 ^. E
  53. 45    ( Y( V. _) ?7 t8 a/ \+ o0 N2 f
  54. 46  }
    0 M. A5 ?  R6 p+ Y1 _
复制代码
4 Z" m: E2 m& m, D1 ?1 X
main.c文件中的初始化代码我们在前面的第10.5.5小节有分析过,这里不再赘述。在while循环中,蜂鸣器以1秒的间隔发声,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器不响的时候,LED0和LED1灭。2 B: }) G+ [8 z$ p2 G5 m

8 r! v4 G( z4 `$ ^0 t% ^' l) ^- o; h/ m11.3.6 编译和调试
" f; C  A. z9 C1 k2 M6 k% t工程编译不报错后,进入Debug模式调试工程,点击运行以后实验现象和我们上面分析的一致。8 q' R# G: \* G: x) j, Q: g+ f: }
————————————————0 Y* X  g  x" o) ^% O& K/ l; }5 K
版权声明:正点原子/ p: V& W' f- `4 |+ D0 G

% l5 a3 g% E" V( L( j8 Y
- {8 A% \$ I; ]8 M+ X  m
收藏 评论0 发布时间:2022-9-26 23:18

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版