资讯详情

【正点原子MP157连载】第十一章 蜂鸣器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南

1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码 手册 视频下载地址:http://www.openedv.com/thread-318813-1-1.html 4)正点原子官方B站:https://space.bilibili.com/394620890 5)正点原子STM32MP157技术交流群:691905614 在这里插入图片描述

第十一章 蜂鸣器实验

我们介绍了上一章STM32MP157的IO使用口作为输出。本章将继续通过另一个例子巩固IO口作为输出的操作方法,区别在于本章没有使用IO口直接驱动器件,但间接驱动三极管。我们将使用一个IO控制板载有源蜂鸣器。 本章将分为如下几个小节: 11.1.蜂鸣器实验; 11.二、硬件设计; 11.三、软件设计;

11.1 蜂鸣器简介 蜂鸣器是一种集成的电子息器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话、定时器等电子产品。蜂鸣器主要分为压电蜂鸣器和电磁蜂鸣器。 正点原子STM32MP157开发板上的蜂鸣器是电磁有源蜂鸣器,如图14所示.1.1所示:

图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虽然口的使用很简单,但与外部电路的匹配设计应该非常精致。考虑得越多,设计就越可靠,问题就越少。

图11.1. 部分数据手册截图 11.2 硬件设计

  1. 例程功能 每隔1次控制蜂鸣器s当蜂鸣器响起时,响或停一次,LED0和LED当蜂鸣器停止时,1亮,LED0和LED1灭。
  2. 硬件资源

表11.2. 1硬件资源 3. 原理图 STM32mp157原理图中,LED0接在PI0上,LED1接在PF3.蜂鸣器的驱动信号连接到STM32mp157的PC7.如下图所示:

图11.2. 1 LED与STM32MP157连接原理图

图11.2. 2蜂鸣器与STM32MP157连接原理图 我们在图中使用了一个PNP 型的三极管(S驱动蜂鸣器,R108主要用于防止蜂鸣器误发声。PC7输出低电平时,Q1导通,蜂鸣器发声,当PC7输出高电平时,Q蜂鸣器停止发声,不导通。 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函数。实验程序的设计过程如下:

图11.3.1. 程序设计流程图 11.3.2 GPIO功能引脚配置 新项目BEEP,进入STM32CubeMX插件配置界面后,在Pinout & Configuration处配置PI0、PF3和PC7为GPIO Output,并配置PI0、PF3和PC7给CM如下图所示,下图所示。

图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工程的实验代码。

图11.3.1. 2配置GPIO工作模式 11.3.3 时钟和工程配置 我们采用默认内部高速时钟HSI(64MHz)。同时在Project Manager窗口勾选此项,配置独立生成相应外设的初始化.h和.c 文件:

图11.3.2. 1配置生成外设独立的初始化文件 11.3.4 生成工程 配置好后,按键盘Ctrl S组合键保存保存 LED.ioc 系统开始生成初始化代码。

图11.3.3. 1生成BEEP工程 11.3.5 实现控制逻辑代码

  1. 新用户文件 将上一章LED工程的BSP文件夹直接复制粘贴到本工程中。CM4项目根目录下。如果您不熟悉在项目中复制文件和新文件的操作,您也可以回顾我们前面的第四个.2.如下图所示:

图11.3.4. 1拷贝BSP文件夹 在BSP的Include目录下新建beep.h头文件,在BSP根目录下新建beep.c源文件如下图所示:

图11.3.4. 2新建beep.h和beep.c文件 最后,记得在项目中设置源文件的路径,否则在编译过程中找不到beep.c和led.c文件中的函数。BSP文件夹放在Core在目录下,无需设置此步骤:

图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模式调试工程,点击运行以后实验现象和我们上面分析的一致。

标签: bsp62三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台