首页 > 其他分享 >《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章 蜂鸣器实验

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章 蜂鸣器实验

时间:2022-12-15 10:31:39浏览次数:44  
标签:MPSoc HAL FPGA beep BEEP IO GPIO 蜂鸣器

第十六章 蜂鸣器实验


上一章,我们介绍了STM32MP157的IO口作为输出的使用。本章,我们将通过另外一个例子继续巩固IO口作为输出使用的操作方法,不同的是本章讲的不是用IO口直接驱动器件,而是通过三极管间接驱动。我们将利用一个IO口来控制板载的有源蜂鸣器。​

本章将分为如下几个小节:​

16.1、蜂鸣器简介;​

16.2、硬件设计;​

16.3、程序设计;​

16.4、编译测试;​


16.1 蜂鸣器简介​

蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中,用作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。​

正点原子STM32MP157开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图16.1.1所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章   蜂鸣器实验_引脚


图16.1. 1有源蜂鸣器​

这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供2~5KHz左右的方波驱动,才能发声。​

上一章,我们利用STM32MP1的IO口直接驱动LED灯,本章的蜂鸣器,我们能否直接用STM32MP157的IO口驱动呢?让我们来分析一下:​

①STM32MP157的单个IO最大可以提供20mA电流(来自数据手册,如下图),而蜂鸣器的驱动电流是30mA左右,如果直接将蜂鸣器接在IO口上,可能会烧毁IO。​

②STM32MP157整个芯片的电流,最大也就140mA,如果用IO口直接驱动蜂鸣器,其他地方用电就得省着点了。​

所以我们不用STM32MP1的IO直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样STM32MP157的IO只需要提供不到1mA的电流就足够了。​

IO口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,出现的问题也就越少。​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章   蜂鸣器实验_初始化_02


图16.1. 2数据手册部分截图​

16.2 硬件设计​

1. 例程功能​

控制蜂鸣器每隔一段时间响或者停一次,当蜂鸣器响的时候,LED0亮,当蜂鸣器停的时候,LED0灭。​

2. 硬件资源​

LED0

BEEP

总线

PI0​

PC7​

AHB4​

表16.2. 1硬件资源​

3. 原理图​

STM32mp157原理图中,LED0接在PI0上,LED1接在PF3上。蜂鸣器的驱动信号连接在STM32mp157的PC7上。如下图所示:​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章   蜂鸣器实验_#define_03


图16.2. 1与STM32MP157连接原理图​

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章   蜂鸣器实验_初始化_04


图16.2. 2蜂鸣器与STM32MP157连接原理图​

图中我们用到一个PNP 型的三极管(S8550)来驱动蜂鸣器,R108主要用于防止蜂鸣器的误发声。当PC7输出低电平的时候,Q1导通,蜂鸣器发声,当PC7输出高电平的时候,Q1不导通,蜂鸣器停止发声。​

16.3 程序设计​

本实验配置好的实验工程已经放到了开发板光盘中,路径为:开发板光盘A-基础资料\1、程序源码\ 3、M4裸机驱动例程\ MP157-M4 HAL库V1.2\实验5 蜂鸣器实验。​

16.3.1 程序设计流程​

本章节我们通过HAL库的API函数来驱动LED和蜂鸣器,实现蜂鸣器和LED0交替开启和关闭。实验程序的设计流程如下:​

1)初始化HAL库​

HAL_Init();

2)开启GPIOI和GPIOC时钟​

__HAL_RCC_GPIOI_CLK_ENABLE()​

__HAL_RCC_GPIOC_CLK_ENABLE()​

3)设置GPIO引脚电平​

通过HAL_GPIO_WritePin和HAL_GPIO_TogglePin设置GPIO口的电平。​

4)实现LED0和BEEP电平以0和1交替变化​

16.3.2 添加驱动文件​

在上一章实验的基础上,我们在工程的Drivers\BSP\BEEP下新建beep.c和beep.h文件:

《DFZU2EG_4EV MPSoc之FPGA开发指南》第十六章   蜂鸣器实验_引脚_05


图16.3.2.1 新建beep.c和beep.h文件​

新建好文件后,将beep.c文件和工程关联。​

16.3.3 添加驱动代码​

1. 添加beep.h文件代码​

在beep.h文件中添加如下代码:​

#ifndef __BEEP_H
#define __BEEP_H

#include "./SYSTEM/sys/sys.h"

/* PC7引脚 定义 */
#define BEEP_GPIO_PORT GPIOC
#define BEEP_GPIO_PIN GPIO_PIN_7
/* GPIOC时钟使能 */
#define BEEP_GPIO_CLK_ENABLE() do{ __HAL_RCC_GPIOC_CLK_ENABLE(); }while(0)
/* 蜂鸣器引脚控制 */
#define BEEP(x) do{ x ? \
HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_SET) : \
HAL_GPIO_WritePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN, GPIO_PIN_RESET); \
}while(0)

/* 蜂鸣器引脚电平取反控制 */
#define BEEP_TOGGLE() do{ HAL_GPIO_TogglePin(BEEP_GPIO_PORT, BEEP_GPIO_PIN); }while(0)

void beep_init(void); /* BEEP初始化函数 */
#endif

以上代码很好理解,beep.h文件中调用HAL_GPIO_WritePin函数来对GPIO端口位写值,调用HAL_GPIO_TogglePin函数来对GPIO端口位取反。当x大于0的时候,设置端口位为1,蜂鸣器不响;当x小于0的时候,设置端口位为0,蜂鸣器响。​

2. 添加beep.c文件代码​

在beep.c文件中添加如下代码,完成蜂鸣器使用的引脚PC7的初始化,配置为推挽输出、上拉、高速模式,当调用beep_init函数时,默认关闭蜂鸣器。​

#include "./BSP/BEEP/beep.h"

/**
* @brief初始化蜂鸣器相关IO口, 并使能时钟
* @param无
* @retval无
*/
void beep_init(void)
{
GPIO_InitTypeDef gpio_init_struct;
BEEP_GPIO_CLK_ENABLE(); /* 蜂鸣器时钟使能 */

gpio_init_struct.Pin = BEEP_GPIO_PIN; /* 蜂鸣器引脚PC7 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;/* 高速 */
HAL_GPIO_Init(BEEP_GPIO_PORT, &gpio_init_struct); /* 初始化蜂鸣器引脚 */

BEEP(1); /* 关闭蜂鸣器 */
}

3. 添加main.c文件代码​

mian.c文件代码如下:​

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/BEEP/beep.h"

/**
* @brief主函数
* @param无
* @retval无
*/
int main(void)
{
HAL_Init(); /* 初始化HAL库 */
led_init(); /* 初始化LED */
beep_init(); /* 初始化蜂鸣器 */

while(1)
{
LED0(0); /* 打开LED0 */
BEEP(0); /* 打开蜂鸣器 */
delay(100); /* 延时一段时间 */
LED0(1); /* 关闭LED0 */
BEEP(1); /* 关闭蜂鸣器 */
delay(100); /* 延时一段时间 */
}
}

16.4 编译测试​

保存修改,编译无报错后进入仿真,运行后,蜂鸣器在滴答滴答响,LED0在闪烁,其中,当蜂鸣器响的时候,LED0是亮的,当蜂鸣器不响的时候,LED0是不亮的。​


标签:MPSoc,HAL,FPGA,beep,BEEP,IO,GPIO,蜂鸣器
From: https://blog.51cto.com/u_15046463/5938866

相关文章

  • 【学习FPGA必看】一个FPGA小白的自述
       知道明德扬科教是一个偶然,但后来耐心看完明德扬知识大串讲系列视频却是一个必然。因为做得用心,所以看得放心。本人是一个纯FPGA小白,就连FPGA这个名词我都是最近才知......
  • 基于DSP+ZYNQ平台Zynq7035/45 FPGA高速串行接口的千兆以太网UDP例程设计和使用说明
         Xines基于XilinxXC7Z035/45-2FFG676I自研平台XQ6657Z35-EVM的Zynq7035/45PL端高速串行接口,使用千兆以太网通讯方式来测试验证底板上的光口通信,实现以下以......
  • FPGA新起点V1开发板(四)——Modelsim安装
    文章目录​​一、Modelsim的介绍​​​​二、安装​​​​三、破戒​​一、Modelsim的介绍Mentor公司的ModelSim是业界最优秀的HDL语言仿真软件,它能提供友好的仿真环境,是业......
  • 基于FPGA的百兆以太网ARP测试实验
    由于各种原因,如旧式电脑的网卡不支持千兆网等,导致PHY在自协商时速率达不到1000Mbps。而目前主流的FPGA的以太网实验均基于千兆网络编写测试代码,因此根据千兆网络降速编写百......
  • FPGA串口发送模块
    1、串口原理通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter,UART)是一种异步收发传输器,其在数据发送时将并行数据转换成串行数据来传输,在数据接收时将接......
  • 使用串口将数据回传至FPGA
    在使用串口传输助手读取txt文件中的数据传送至FPGA芯片时发现传输助手在发送文件中数据时是以字符串的形式发送。    例如,发送数据124时,串口助手是将其当做1、2、3......
  • 《DFZU2EG_4EV MPSoc之FPGA开发指南》第十五章 RGB LCD彩条显示实验​
    RGBLCD彩条显示实验​TFT-LCD是一种液晶显示屏,它采用薄膜晶体管(TFT)技术提升图像质量,如提高图像亮度和对比度等。相比于传统的CRT显示器,TFT-LCD有着轻薄、功耗低、无辐射、......
  • 高云FPGA系列教程(1):FPGA和ARM开发环境搭建
    文章目录​​@[toc]​​​​1.获取安装包​​​​2.申请License​​​​3.安装高云FPGA开发环境​​​​4.安装高云MCU开发环境​​​​5.替换TangNano4K专用下载软件......
  • Linux下学习FPGA
    声明(叠甲):鄙人水平有限,本文章仅供参考。1.环境推荐使用Ubuntu20.04这是我使用多个版本中最好用的一个,相关安装教程可以自行上网搜索这不再赘述,但要补充的一点的是......
  • 《DFZU2EG_4EV MPSoc之FPGA开发指南》第十一章 IP核之MMCM/PLL实验​
    IP核之MMCM/PLL实验​PLL的英文全称是PhaseLockedLoop,即锁相环,是一种反馈控制电路。PLL对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移和可编程......