STM32F407ZGT6学习之蜂鸣器

时间:2024-03-18 14:06:20

工程代码:https://pan.baidu.com/s/1Qlfg1_br0tN6yy0fcDwCjg,密码:fhh2

(一)简介

        这一小节,学习的是驱动蜂鸣器,因为使用的是有源蜂鸣器(关于有源和无源蜂鸣器请看这里:https://zhidao.baidu.com/question/13384059.html),只需要给蜂鸣器供电,蜂鸣器即可发声;需要使用STM32的定时器,给蜂鸣器定时,使蜂鸣器响一秒停一秒。

(二)程序的编写

1. 引脚驱动蜂鸣器       

在我的工程中,使用STM32的PF8接口连接蜂鸣器,为了让PF8引脚输出高电平,我们需要配置PF8引脚。

首先我们需要打开PF8的时钟电源,GPIO的所有时钟开启都在“RCC_AHB1ENR”寄存器中

STM32F407ZGT6学习之蜂鸣器

开启时钟之后,就是对GPIO口进行配置,下图是GPIO的配置寄存器图,往下是对各寄存器的具体介绍

STM32F407ZGT6学习之蜂鸣器

① GPIO的端口配置寄存器(GPIOx_MODER)

        从图中可以看出,GPIOx的“x”代表当前要配置的是哪组GPIO的引脚,每组GPIO有16个引脚,而寄存器共32位,每两位控制一个引脚的配置。

STM32F407ZGT6学习之蜂鸣器

② GPIO  端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)       

       这个寄存器用于配置端口输出的类型,分别有推挽模式和开漏模式

推挽模式:输出1时引脚输出高电平,输出0时引脚输出低电平

开漏模式:输出1时引脚不接地,输出0时引脚接地

注意:因为开漏模式输出1时只是引脚不接地,此时引脚处于高电平或者低电平,取决于引脚连接的电路是高电平还是低电平,如果需要在开漏模式下,输出1时引脚输出高电平,需要外界上拉,把引脚的电压拉高。

STM32F407ZGT6学习之蜂鸣器

③ GPIO  端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)

关于GPIO的速度配置,这里指的是输出模式下,每秒最大的输出速度,举个例子:如果我配置为2MHz的输出模式,然后引脚交替输出高电平和低电平,此时引脚每秒只能翻转2M的次数。

STM32F407ZGT6学习之蜂鸣器

④ GPIO  端口上拉/ 下拉寄存器 (GPIOx_PUPDR) (x = A..I/)

这个引脚是在输入模式下使用的,相当于给引脚加了一个弱上拉或者弱下拉(关于上下拉知识,可以查看这里:https://blog.csdn.net/z735640642/article/details/78043018

上拉:让电路默认情况处于高电平

下拉:让电路默认情况处于低电平

STM32F407ZGT6学习之蜂鸣器

⑤ GPIO  端口输入数据寄存器 (GPIOx_IDR) (x = A..I)

在输入模式下,用于读取引脚的输入情况,通过这个寄存器,可以读取此时引脚的输入是处于哪种电平。

⑥ GPIO  端口输出数据寄存器 (GPIOx_ODR) (x = A..I)

在输出模式下,这个寄存器用于配置引脚的高低电平的输出

⑦ GPIO  端口置位/ 复位寄存器 (GPIOx_BSRR) (x = A..I)

        这个寄存器用于输出模式下,配置引脚的输出电平,通知给寄存器的0~15位赋值,可以设置对应的16个引脚输出高电平;通知给寄存器的16~31位赋值,可以设置对应的16个引脚输出低电平。

        看到这里可能有小伙伴有疑问了,为什么有了“GPIOx_ODR”了,还要弄一个“GPIOx_BSRR”的寄存器呢,两个寄存器的功能不是一样的吗?

       这里可以参考:https://blog.csdn.net/drivermonkey/article/details/17062381,看完你就明白了。

STM32F407ZGT6学习之蜂鸣器

⑧ GPIO  端口配置锁定寄存器 (GPIOx_LCKR) (x = A..I)

这个寄存器用于锁定引脚的配置,当特定的写序列写入到LCKK位时,将会锁定LCK0~LCK15中值位1的引脚的配置。

STM32F407ZGT6学习之蜂鸣器STM32F407ZGT6学习之蜂鸣器

⑨ GPIO  复用功能低位寄存器 (GPIOx_AFRL) (x = A..I)

        这个寄存器用于配置GPIO的复用功能,复用就是使片内外设的复用功能连接到引脚,关于复用更深的应用,以后使用到的时候再说明。

⑩ GPIO  复用功能高位寄存器 (GPIOx_AFRH) (x = A..I)

同上,不同在于“GPIOx_AFRL”配置的是引脚0~7的复用功能,“GPIOx_AFRH”配置的是引脚8~15的复用功能。

到此,引脚的配置介绍结束。

因为我们要驱动蜂鸣器发声,从图中可以看出,只有PF8输出高电平,三极管Q3就能导通,蜂鸣器 “Speaker”供电开始工作。

 

STM32F407ZGT6学习之蜂鸣器

2. 定时器的配置

① 系统时钟

        要学习定时器,需要了解STM32的时钟体系,关于STM32的时钟体系,可以参考:https://blog.csdn.net/qq_29344757/article/details/73479924

         由图可知,系统时钟(SYSCLK 168MHz)经过“APBx PRESC”分频后输出到定时器时钟。

        而在STM32的手册中有介绍,AHB 域的最大频率为 168 MHz。高速 APB2 域的最大允许频率为 84 MHz。低速 APB1 域的最大允许频率为 42 MHz。所以系统时钟到APB2的时钟需要经过4分频,168 / 4 = 42MHz给到APB2。根据图中的判断条件,APB2时钟到定时器时钟时需要2倍频,42 * 2 = 84MHz,所以定时器时钟是84MHz。

STM32F407ZGT6学习之蜂鸣器

② 定时器配置 

        定时器分为基本定时器和其他类型的定时器,由于使用最基本的延时功能,只需要基本定时器就可以实现,基本定时器有TIM6、TIM7两个。

基本定时器的框图如下:

STM32F407ZGT6学习之蜂鸣器

基本定时器的寄存器主要是以下几个:

STM32F407ZGT6学习之蜂鸣器

① TIM6  和 TIM7  控制寄存器 1 (TIMx_CR1)

         这个寄存器控制主要的定时器配置。

STM32F407ZGT6学习之蜂鸣器

② TIM6  和 TIM7  控制寄存器 2 (TIMx_CR2) 和 TIM6  和 TIM7 DMA/ 中断使能寄存器 (TIMx_DIER)先不说

③ TIM6  和 TIM7  状态寄存器 (TIMx_SR),这个寄存器用于查看定时是否结束。

④ TIM6  和 TIM7  事件生成寄存器 (TIMx_EGR),就是一个软件控制的更新源。

⑤ TIM6  和 TIM7  计数器 (TIMx_CNT),当前定时器的计数的值。

⑥ TIM6  和 TIM7  预分频器 (TIMx_PSC),定时器的预分频值。

⑦ TIM6  和 TIM7  自动重载寄存器 (TIMx_ARR),定时器的重载值。

到此,寄存器介绍结束。

        由于我们需要使用1s的定时,而定时器时钟为84MHz = 84 * 1000 * 1000,我们设置预分频值为83(实际设置为84 - 1),设置定时器值为999(1000 - 1),这样定时器每次计数完成就是1ms。那么,我们就得到了一个1ms定时的定时器。