搜索
bottom↓
回复: 0

《STM32MP1 M4裸机CubeIDE开发指南 V1.5.2》第十一章 蜂鸣器实验

[复制链接]

出0入234汤圆

发表于 2022-7-29 11:08:14 | 显示全部楼层 |阅读模式
本帖最后由 正点原子 于 2022-7-29 14:39 编辑

1)实验平台:正点原子STM32MP157开发板
2) 章节摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南 V1.5.2
3)购买链接:https://detail.tmall.com/item.htm?id=631745687288
4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/arm-linux/zdyzmp157.html1.0.0 文档
5)正点原子官方B站:https://space.bilibili.com/394620890
6)STM32MP157技术交流QQ群:703341432 lQLPJxaFi2zaB4UWWrDAMgIsFEW2pwLb3abnwDMA_90_22.png

lQDPJxaFi2nfFizMjM0CbLCPlxn_FVheIQLb3aGrwFQA_620_140.jpg

lQLPJxaFi2nfFhLMkM0BXrDNvOUyeU_FPgLb3aGvQNIA_350_144.png

第十一章 蜂鸣器实验


上一章,我们介绍了STM32MP157的IO口作为输出的使用。本章,我们将通过另外一个例子继续巩固IO口作为输出使用的操作方法,不同的是本章讲的不是用IO口直接驱动器件,而是通过三极管间接驱动。我们将利用一个IO口来控制板载的有源蜂鸣器。
        本章将分为如下几个小节:
        11.1、蜂鸣器实验;
        11.2、硬件设计;
        11.3、软件设计;
11.1 蜂鸣器简介

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。
正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图14.1.1所示:
第十一章 蜂鸣器实验347.png
图11.1. 1有源蜂鸣器

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5KHz左右的方波驱动,才能发声。
上一章,我们利用STM32MP1的IO口直接驱动LED灯,本章的蜂鸣器,我们能否直接用STM32MP157的IO口驱动呢?让我们来分析一下:
①STM32MP157的单个IO最大可以提供20mA电流(来自数据手册,如下图),而蜂鸣器的驱动电流是30mA左右,如果直接将蜂鸣器接在IO口上,可能会烧毁IO。
②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。
所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。
IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。
第十一章 蜂鸣器实验819.png
图11.1. 2数据手册部分截图

11.2 硬件设计
1. 例程功能
控制蜂鸣器每隔1s响或者停一次,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器停的时候,LED0和LED1灭。
2. 硬件资源
9AB611E1-63F9-4578-8865-EC7101CA7D27.png
表11.2. 1硬件资源

3. 原理图
STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示:
第十一章 蜂鸣器实验1099.png
图11.2. 1 LED与STM32MP157连接原理图

第十一章 蜂鸣器实验1155.png
图11.2. 2蜂鸣器与STM32MP157连接原理图

图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。
11.3 软件设计
        本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘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函数。实验程序的设计流程如下:
第十一章 蜂鸣器实验1550.png
图11.3.1. 1程序设计流程图

11.3.2 GPIO功能引脚配置
        新建一个工程BEEP,进入STM32CubeMX插件配置界面后,在Pinout & Configuration处配置PI0、PF3和PC7为GPIO Output,并配置PI0、PF3和PC7给CM4内核使用,如下图所示。
第十一章 蜂鸣器实验1728.png
图11.3.1. 1配置PI0引脚复用功能

        接下来配置GPIO的工作模式,其中:
        PC7配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为BEEP;
        PI0配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED0;
        PF3配置:GPIO为推挽输出模式,配置上拉,速度等级为Very High,User Label为LED1;
        上面的配置,速度等级也可以选其它配置,PI0和PF3的User Label我们保持和上面LDE实验的一致,因为我们要用前面LED工程的实验代码。
第十一章 蜂鸣器实验2040.png
图11.3.1. 2配置GPIO工作模式

11.3.3 时钟和工程配置
我们采用默认内部高速时钟HSI(64MHz)。同时在Project Manager窗口勾选此项,配置独立生成对应外设的初始化.h和.c 文件:
第十一章 蜂鸣器实验2176.png
图11.3.2. 1配置生成外设独立的初始化文件

11.3.4 生成工程
        配置好之后,按下键盘的“Ctrl+S”组合键保存保存 LED.ioc 文件,系统开始生成初始化代码。
第十一章 蜂鸣器实验2293.png
图11.3.3. 1生成BEEP工程

11.3.5 控制逻辑代码实现
1. 新建用户文件
        将上一章LED工程的BSP文件夹直接复制粘贴到本工程的CM4工程根目录下。如果还不太熟悉在工程中拷贝文件和新建文件的操作,也可以回头看看我们前面第4.2.3小节,如下图:
第十一章 蜂鸣器实验2482.png
图11.3.4. 1拷贝BSP文件夹

        在BSP的Include目录下新建beep.h头文件,在BSP的根目录下新建beep.c源文件,如下图:
第十一章 蜂鸣器实验2584.png
图11.3.4. 2新建beep.h和beep.c文件

        最后记得在工程中设置源文件的路径,否则编译的时候会找不到beep.c和led.c文件里的函数。如果把BSP文件夹放在Core目录下的话,就不需要进行这步设置:
第十一章 蜂鸣器实验2722.png
图11.3.4. 3工程关联添加的源文件

2. 添加用户驱动代码
        在beep.h文件中添加如下代码:
beep.h文件内容
1   #ifndef __BEEP_H
2   #define __BEEP_H
3
4   #include"gpio.h"
5   /* 蜂鸣器控制 */
6   #define BEEP(x)   do{ x ? \
7    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_RESET) : \
8    HAL_GPIO_WritePin(BEEP_GPIO_Port, BEEP_Pin, GPIO_PIN_SET); \ 9                           }while(0)      
10
11  /* 蜂鸣器取反控制 */
12  #define BEEP_TOGGLE() \  
13  do{ \
14      HAL_GPIO_TogglePin(BEEP_GPIO_Port, BEEP_Pin); \
15    }while(0)                                  /* BEEP = !BEEP */
16
17  void beep_init(void);         /* BEEP初始化函数 */
18
19  #endif  
        beep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。
        第6~9行,当x大于0的时候,设置端口位为0,蜂鸣器响;当x小于0的时候,设置端口位为1,蜂鸣器不响。
        第12~15行,对GPIO端口位取反,如果蜂鸣器开启,执行这段语句后蜂鸣器关闭;如果此时蜂鸣器关闭,执行这段语句后打开蜂鸣器。
        在beep.c文件中添加如下代码,默认关闭蜂鸣器。
beep.c文件内容
1   #include "./Include/beep.h"
2
3   void beep_init(void)
4   {
5           BEEP(0);                            /* 关闭 蜂鸣器 */
6   }
        main.c文件代码如下:
main.c文件内容
1   #include "main.h"
2   #include "gpio.h"
3   #include "../../BSP/Include/beep.h"
4   #include "../../BSP/Include/led.h"
5
6   void SystemClock_Config(void);
7
8   int main(void)
9   {
10    /* 初始化HAL库 */
11    HAL_Init();
12   
13    if(IS_ENGINEERING_BOOT_MODE())
14    {
15     /* 配置系统时钟 */
16      SystemClock_Config();
17    }
18
19    /* 初始化所有已经配置的外设 */
20    MX_GPIO_Init();
21    led_init();                           /* 关闭 LED0,打开LED1  */
22    beep_init();                         /* 关闭BEEP */
23   
24    while (1)
25    {
26      BEEP(1);                            /* 打开蜂鸣器 */
27      LED0(0);                            /* 打开LED0 */
28      LED1(0);                            /* 打开LED1 */
29      HAL_Delay(1000);
30      BEEP(0);                            /* 关闭蜂鸣器 */
31      LED0(1);                            /* 关闭LED0 */
32      LED1(1);                            /* 关闭LED1 */
33      HAL_Delay(1000);
34    }
35  }
36
37  /*系统时钟配置*/
38  void SystemClock_Config(void)
39  {
40    /*此处省略时钟初始化代码*/
41  }
42
43  void Error_Handler(void)
44  {
45   
46  }
        main.c文件中的初始化代码我们在前面的第10.5.5小节有分析过,这里不再赘述。在while循环中,蜂鸣器以1秒的间隔发声,当蜂鸣器响的时候,LED0和LED1亮,当蜂鸣器不响的时候,LED0和LED1灭。
11.3.6 编译和调试
        工程编译不报错后,进入Debug模式调试工程,点击运行以后实验现象和我们上面分析的一致。


阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 13:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表