工程代码: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”寄存器中
开启时钟之后,就是对GPIO口进行配置,下图是GPIO的配置寄存器图,往下是对各寄存器的具体介绍
① GPIO的端口配置寄存器(GPIOx_MODER)
从图中可以看出,GPIOx的“x”代表当前要配置的是哪组GPIO的引脚,每组GPIO有16个引脚,而寄存器共32位,每两位控制一个引脚的配置。
② GPIO 端口输出类型寄存器 (GPIOx_OTYPER) (x = A..I)
这个寄存器用于配置端口输出的类型,分别有推挽模式和开漏模式
推挽模式:输出1时引脚输出高电平,输出0时引脚输出低电平
开漏模式:输出1时引脚不接地,输出0时引脚接地
注意:因为开漏模式输出1时只是引脚不接地,此时引脚处于高电平或者低电平,取决于引脚连接的电路是高电平还是低电平,如果需要在开漏模式下,输出1时引脚输出高电平,需要外界上拉,把引脚的电压拉高。
③ GPIO 端口输出速度寄存器 (GPIOx_OSPEEDR) (x = A..I/)
关于GPIO的速度配置,这里指的是输出模式下,每秒最大的输出速度,举个例子:如果我配置为2MHz的输出模式,然后引脚交替输出高电平和低电平,此时引脚每秒只能翻转2M的次数。
④ GPIO 端口上拉/ 下拉寄存器 (GPIOx_PUPDR) (x = A..I/)
这个引脚是在输入模式下使用的,相当于给引脚加了一个弱上拉或者弱下拉(关于上下拉知识,可以查看这里:https://blog.csdn.net/z735640642/article/details/78043018)
上拉:让电路默认情况处于高电平
下拉:让电路默认情况处于低电平
⑤ 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,看完你就明白了。
⑧ GPIO 端口配置锁定寄存器 (GPIOx_LCKR) (x = A..I)
这个寄存器用于锁定引脚的配置,当特定的写序列写入到LCKK位时,将会锁定LCK0~LCK15中值位1的引脚的配置。
⑨ GPIO 复用功能低位寄存器 (GPIOx_AFRL) (x = A..I)
这个寄存器用于配置GPIO的复用功能,复用就是使片内外设的复用功能连接到引脚,关于复用更深的应用,以后使用到的时候再说明。
⑩ GPIO 复用功能高位寄存器 (GPIOx_AFRH) (x = A..I)
同上,不同在于“GPIOx_AFRL”配置的是引脚0~7的复用功能,“GPIOx_AFRH”配置的是引脚8~15的复用功能。
到此,引脚的配置介绍结束。
因为我们要驱动蜂鸣器发声,从图中可以看出,只有PF8输出高电平,三极管Q3就能导通,蜂鸣器 “Speaker”供电开始工作。
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。
② 定时器配置
定时器分为基本定时器和其他类型的定时器,由于使用最基本的延时功能,只需要基本定时器就可以实现,基本定时器有TIM6、TIM7两个。
基本定时器的框图如下:
基本定时器的寄存器主要是以下几个:
① TIM6 和 TIM7 控制寄存器 1 (TIMx_CR1)
这个寄存器控制主要的定时器配置。
② 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定时的定时器。