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 蜂鸣器简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。 正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图14.1.1所示:: }, M% ?1 P& _- B# t5 z$ h 2 j* g( Z( }/ c& A$ H, m8 x* \# n% U2 r
图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。 ②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。 所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。 IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。
% X6 t6 [6 v- G) j 图11.1. 2数据手册部分截图3 T/ s8 c) E( P9 R' W5 h 11.2 硬件设计 1.例程功能/ _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 ?
表11.2. 1硬件资源 3. 原理图5 \6 N7 D5 n; @: k q$ w" e STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示: 6 U% I* Y* n" P) d8 f# x
图11.2. 1 LED与STM32MP157连接原理图 + o: ]% x/ ?" A. g. ^0 ^
) h3 M' ~$ N2 X 图11.2. 2蜂鸣器与STM32MP157连接原理图 图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。 11.3 软件设计$ J \7 F0 D0 I _. _. \ 本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘A-基础资料\1、程序源码\11、M4 CubeIDE裸机驱动例程\CubeIDE_project\ 4 BEEP。 11.3.1 程序设计流程 本章节我们通过HAL库的API函数来驱动LED和蜂鸣器,实现蜂鸣器、LED0和LED1以1s间隔交替开启和关闭。其中,我们会用到HAL库中的HAL_GPIO_WritePin和HAL_GPIO_TogglePin函数。实验程序的设计流程如下:) a& |" B& k+ A. K% G
图11.3.1. 1程序设计流程图 11.3.2 GPIO功能引脚配置 新建一个工程BEEP,进入STM32CubeMX插件配置界面后,在Pinout & Configuration处配置PI0、PF3和PC7为GPIO Output,并配置PI0、PF3和PC7给CM4内核使用,如下图所示。/ c' h8 w) k) d
3 C( B0 H2 U( `" C 图11.3.1. 1配置PI0引脚复用功能 接下来配置GPIO的工作模式,其中:& n+ `3 R; k" z& Y- @# g PC7配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为BEEP; PI0配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED0; PF3配置: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
图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 文件:
5 }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 文件,系统开始生成初始化代码。 2 ^) E! D% f8 c2 L; l
5 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.新建用户文件 将上一章LED工程的BSP文件夹直接复制粘贴到本工程的CM4工程根目录下。如果还不太熟悉在工程中拷贝文件和新建文件的操作,也可以回头看看我们前面第4.2.3小节,如下图:' F% |, m3 m8 T+ L, v$ }$ P 0 N5 l" Q2 W: M# K
图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
7 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
图11.3.4. 3工程关联添加的源文件& d$ ~% K- ?1 R8 T# N- @ 2. 添加用户驱动代码 在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
beep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。 第6~9行,当x大于0的时候,设置端口位为0,蜂鸣器响;当x小于0的时候,设置端口位为1,蜂鸣器不响。 第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文件内容
main.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 编译和调试 工程编译不报错后,进入Debug模式调试工程,点击运行以后实验现象和我们上面分析的一致。 ————————————————% s& t2 |8 y# \5 e 版权声明:正点原子 J( E% I) Z' ~: `+ f; B& K 3 f/ F0 \/ _- E# D5 N: ^9 Q. {" C8 M |
STM32MP157双A核Linux + 自研RTOS双系统镜像免费下载
扩展STM32微处理器,实现高性价比、低功耗和灵活性能
STM32MP1 自举程序编程:USB DFU/USART 协议全解析
兔哥心中的ST中文论坛
我心中的ST中文论坛
STM32 开发者指南:ST.com 全新 MCU 产品阵容视觉布局深度解析
深度拆解 STM32MP1 Boot 链路
STM32串口自动识别波特率的原理
STM32MP135 MP157 MP257 CoreMark移植&&跑分对比&&多核心负载不均衡问题排查与解决
STM32--STM32 微控制器详解
微信公众号
手机版