一.蜂鸣器的区别
首先咱们得先搞懂蜂鸣器,蜂鸣器可以分为有源蜂鸣器和无源蜂鸣器两种,这里的源指的是震荡源,顾名思义有源蜂鸣器内部自带震荡源,直接上电接直流源就可以发出频率一定的声响,而无源蜂鸣器内部没有震荡源,需要外接方波,对于二者的区别网上可能会出现如下图所示的原理图:
但是咱们还是不能完全以原理图判断有源与无源,具体还是应该根据蜂鸣器内部结构来看,所以建议不确定的朋友们还是咨询一下商家或者看一下能不能找到相关的结构手册。比如下图我用到的这个STM32F103C8T6的蜂鸣器,若按照上示原理图来看那这就是一个有源蜂鸣器,但是朋友后面问了一下客服才确定实际上是一个无源蜂鸣器。
二.CubeMX配置
根据蜂鸣器电路原理图对应的引脚进行配置,我这里用的PB3,而对应地大家就会发现SYS会报警,而这个原因就是PB3实际是默认被JLINK占用的(这里可以引申一下就是STM32默认启动时PB4、PB3、PA15这三个引脚都是JTAG的复用功能,分别为JNTRST、TDI、JTDO,不能作为普通的IO口使用)。
我们用到的下载器是STLINK,所以其实我们这里用了也没有影响蜂鸣器发声,但是为了工程的严谨性咱还是解决一下比较好,解决方法也简单,在CubeMX配置好了生成代码之后在图示位置再加两串代码禁用JTAG就可以:
继续回到我们的CubeMX配置上:
需要改引脚名字的可以在如下图所示位置进行修改,方便后面代码的编写:
时钟配置,首先要根据我们选择的引脚使用对应的定时器,这里就需要查找开发板的芯片手册了,STM32F103C8T6的PB3脚对应的定时器为TIM2:
还有这几处一定要记得使能
接着配置时钟树
生成工程
![](https://i-blog.csdnimg.cn/direct/e3044e4954f74cf4b07ffaedc34e86a6.png)
三.编写代码
利用翻转函数产生方波信号
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//回调函数
{
if(htim->Instance == TIM2)
{
HAL_GPIO_TogglePin(BEEP_GPIO_Port,BEEP_Pin); //翻转函数
}
}