完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:【正点原子】 NANO STM32F103 开发板
2)摘自《正点原子STM32 F1 开发指南(NANO 板-HAL 库版)》关注官方微信号公众号,获取更多资料:正点原子 第七章 蜂鸣器实验 上一章,我们介绍了 STM32F1 的 IO 口作为输出的使用,这一章,我们将通过另外一个例子讲述STM32F1 的 IO 口作为输出的使用。在本章中,我们将利用一个 IO 口来控制板载的有源蜂鸣器,实现蜂鸣器控制。通过本章的学习,你将进一步了解 STM32F1 的 IO 口作为输出口使用的方法。本章分为如下几个小节: 7.1 蜂鸣器简介 7.2 硬件设计 7.3 软件设计 7.4 仿真与下载 7.5 STM32CubeMX 配置 IO 口 7.1 蜂鸣器简介 蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。NANO STM32 开发板板载的蜂鸣器是电磁式的有源蜂鸣器,如图 7.1.1 所示: 图 7.1.1 有源蜂鸣器 这里的有源不是指电源的“源”,而是指有没有自带震荡电路,有源蜂鸣器自带了震荡电路,一通电就会发声;无源蜂鸣器则没有自带震荡电路,必须外部提供 2~5Khz 左右的方波驱动,才能发声。前面我们已经对 STM32 的 IO 做了简单介绍,上一章,我们就是利用 STM32 的 IO 口直接驱动 LED 的,本章的蜂鸣器,我们能否直接用 STM32 的 IO 口驱动呢?让我们来分析下:STM32的单个 IO 最大可以提供 25mA 电流(来自数据手册),而蜂鸣器的驱动电流是 30mA 左右,两者十分相近,但是全盘考虑,STM32 整个芯片的电流,最大也就 150mA,如果用 IO 口直接驱动蜂鸣器,其他地方用电就得省着点了…所以,我们不用 STM32 的 IO 直接驱动蜂鸣器,而是通过三极管扩流后再驱动蜂鸣器,这样 STM32 的 IO 只需要提供不到 1mA 的电流就足够了。IO 口使用虽然简单,但是和外部电路的匹配设计,还是要十分讲究的,考虑越多,设计就越可靠,可能出现的问题也就越少。本章将要实现的是控制 ALIENTEK NANO STM32 开发板上的蜂鸣器发出:“嘀”…“ 嘀”…的间隔声,进一步熟悉 STM32 IO 口的使用。 7.2 硬件设计 本章需要用到的硬件有: 1)指示灯 DS0 2)蜂鸣器 DS0 在上一章已有介绍,而蜂鸣器在硬件上也是直接连接好了的,不需要经过任何设置, 直接编写代码就可以了。蜂鸣器的驱动信号连接在 STM32 的 PB8 上。如图 7.2.1 所示: 图 7.2.1 蜂鸣器与 STM32 连接原理图 图中我们用到一个 PNP 三极管(S8550)来驱动蜂鸣器,R25 主要用于控制 PNP 管饱和导 通作用。当 PB.8 输出低电平的时候,蜂鸣器将发声,当 PB.8 输出高电平的时候,蜂鸣器停止 发声。 7.3 软件设计 大家可以直接打开本实验工程。也可以按下面的步骤在实验 1 的基础上新建蜂鸣器实验工 程。复制上一章的 LED 实验工程,然后打开 USER 目录,把目录下面工程 LED.uvprojx 重命名 为 BEEP.uvprojx。,然后在 HARDWARE 文件夹下新建一个 BEEP 文件夹,用来存放与蜂鸣器 相关的代码。如图 7.3.1 所示: 图 7.3.1 在 HARDWARE 下新增 BEEP 文件夹 然后我们打开 USER 文件夹下的 BEEP.uvprojx 工程,按 按钮新建一个文件,然后保存在 HARDWARE→BEEP 文件夹下面,保存为 beep.c。在该文件中输入如下代码: #include "beep.h" //蜂鸣器 IO 初始化 void BEEP_Init(void) { GPIO_InitTypeDef GPIO_Initure; __HAL_RCC_GPIOB_CLK_ENABLE(); //开启 GPIOB 时钟 GPIO_Initure.Pin=GPIO_PIN_8; //PB8 GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出 GPIO_Initure.Pull=GPIO_PULLUP; //上拉 GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速 HAL_GPIO_Init(GPIOB,&GPIO_Initure); HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //蜂鸣器对应引脚 GPIOB8 拉高, } 这段代码 仅包含 1 个函数:void BEEP_Init(void),该函数的作用就是使能 PORTB 的时钟, 同时配置 PB8 为推挽输出。这里的初始化内容跟实验 6 跑马灯实验几乎是一样的,这里就不做 深入的讲解。 保存 beep.c 代码,然后我们按同样的方法,新建一个 beep.h 文件,也保存在 BEEP 文件夹 下面。在 beep.h 中输入如下代码: #ifndef __BEEP_H #define __BEEP_H #include "sys.h" //蜂鸣器端口定义 #define BEEP PBout(8) // 蜂鸣器控制 IO void BEEP_Init(void);//初始化 #endif 和上一章一样,我们这里还是通过位带操作来实现某个 IO 口的输出控制,BEEP 就直接代 表了 PB8 的输出状态。我们只需要令 BEEP=0,就可以让蜂鸣器发声。 将 beep.h 也保存。接着,我们把 beep.c 加入到 HARDWARE 这个组里面,这一次我们通过 双击的方式来增加新的.c 文件,双击 HARDWARE,找到 beep.c,加入到 HARDWARE 里面, 如图 7.3.2 所示: 图 7.3.2 将 beep.c 加入 HARDWARE 组下 可以看到 HARDWARE 文件夹里面多了一个 beep.c 的文件,然后还是用老办法把 beep.h 头文件所在的路径加入到工程里面。回到主界面,在 main.c 里面编写如下代码: #include "sys.h" #include "delay.h" #include "usart.h" #include "led.h" #include "beep.h" int main(void) { HAL_Init(); //初始化 HAL 库 Stm32_Clock_Init(RCC_PLL_MUL9); //设置时钟,72M delay_init(72); //初始化延时函数 LED_Init(); //初始化 LED BEEP_Init(); //初始化蜂鸣器端口 while(1) { HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_RESET); //DS0 拉低,亮 等同 LED0=0; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET); //BEEP 引脚拉高,不响,等同 BEEP=1; delay_ms(300);//延时 500ms HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET); //DS0 拉高,亮 等同 LED0=1; HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET); //BEEP 引脚拉低,响, 等同 BEEP=0; delay_ms(300); } } 注意要将 BEEP 文件夹加入头文件包含路径,不能少,否则编译的时候会报错。这段代码 就实现前面 7.1 节所阐述的功能,同时加入了 DS0(LED0)的闪烁来提示程序运行(后面的代 码,我们基本都会加入这个),整个代码比较简单。 然后编译工程,得到结果如图 7.3.3 所示: 图 7.3.3 编译结果 可以看到没有错误,也没有警告。接下来,大家就可以下载验证了。 7.4 仿真与下载 我们可以先用软件仿真,看看结果对不对,根据软件仿真的结果,然后再下载到 NANO STM32 开发板上面看运行是否正确。首先,我们进行软件仿真。开始仿真,接着显示逻辑分析窗口,点击 Setup,新建 2 个信号:PORTC.0 和 PORTB.8,如图 7.4.1 所示: 图 7.4.1 新建仿真信号 接着,点击开始运行。运行一段时间之后,暂停仿真回到逻辑分析窗口,可以看到如图 7.4.2 所示的波形: 图 7.4.2 仿真波形 从图中我们可以看出,PC.0 和 PB.8 同时输出高和低电平,和我们预计的效果是一样的, 周期是 0.6s,符合预期设计。接下来可以把代码下载到 NANO STM32 开发板上看看运行结果 是否正确。 下载完代码,可以看到 DS0 亮的时候蜂鸣器叫,而 DS0 灭的时候,蜂鸣器不叫。间隔为 0.3 秒左右,符合预期设计。 至此,我们的本章的学习就结束了。本章,作为 STM32 的入门第二个例子,进一步介绍 了 STM32 的 IO 作为输出口的使用方法,同时巩固了前面的学习。希望大家在开发板上实际验 证一下,从而加深印象。 7.5 STM32CubuMX 配置 IO 口 上一章我们讲解了使用 STM32CubeMX 工具配置 GPIO 的一般方法。本章同样也是配置 IO 口为输出模式。这里我们就直接列出 IO 口配置截图,具体方法请参考 4.8 和上一章跑马灯实验。 根据 7.2 小节讲解,知道 NANO 板上的蜂鸣器是连在 PB8 上。 使用 STM32CubeMX 打开光盘工程模板(双击工程目录的 Template.ioc),目录为“4,程序源 码标准例程-库函数版本实验 0-3 Template 工程模板-使用 STM32CubeMX 配置”。我们首先在 IO 口引脚图上,依次配置 2 个 IO 口 PB8 和 PC0 为输出模式,这里我们以 PB8 为例,操作方 法如下图 7.5.1 所示: 图 7.5.1 配置 PB8 为输出模式 同样的方法,我们配置 PC0,然后我们进入 Configuration->GPIO 配置界面,配置方法如下 图 7.5.2 所示: 图 7.5.2 配置 IO 口详细参数 配置完成 IO 参数之后,接下来我们同样生成工程。打开生成的工程会发现,main.c 文件中 添加了函数 MX_GPIO_Init 函数,内容如下: static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET); /*Configure GPIO pin : PC0 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); /*Configure GPIO pin : PB8 */ GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); } 该函数实现的功能和蜂鸣器实验的功能一模一样。有兴趣的同学可以直接复制该函数内容替换蜂鸣器实验中的 BEEP_Init 和 LED_Init 函数内容,替换后会发现实现的现象完全一致。使用 STM32CubeMX 配置 IO 口就给大家介绍到这里。 |
|
相关推荐
|
|
1020 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
996 浏览 2 评论
2102 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1202 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1621 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 23:17 , Processed in 0.364398 second(s), Total 36, Slave 28 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号