STM32 cubeMX下配置STM32单片机使无源蜂鸣器输出PWM波并放音乐

1.首先我们要了解定时器(timer)
timer分为三种:高级定时器(tim1,tim8),基本定时器(tim6,tim7),通用定时器(tim2,tim3,tim4,tim5)。
基本定时器:它有两个功能。第一就是生成时基,第二就是专门用于驱动数模转换器(DAC),我们这里要产生PWM波,这与它无关,所以不用过多了解它。
通用的定时器:可以输出四路PWM信号互不影响,它就是普通的调节PWM的占空比和频率。
高级定时器:可以输出三对互补PWM信号外加CH4通道,一共七路,它还带有互补输出功能,同时互补信号可以插入死区,也有使能刹车功能。
由于我做的单片机只用到了通用定时器。因此我对高级定时器也没有过多的了解。
2.PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,PWM输出最基本的调节就是频率和占空比,接下来我们将了解PWM是如何产生的。
PWM的频率和占空比分别通过TIMX_ARR和TIMX_CCRX这两个寄存器控制,ARR寄存器就是自动重装寄存器(计数器记到这个数后清零在开始计数),在计数是会不停的和CCRX寄存器中的数据进行比较,如果小于的话就是高电平或者低电平(这取决于你设的PWM输出是高电平还是低电平有效如下图(是高电平有效)),计数值大于CCRX值这电平极性相反,这就控制了占空比。
下图是PWM原理图:在这里插入图片描述
ARR:决定PWM周期
CCRX:决定PWM的占空比
PWM的两种输出模式:在这里插入图片描述

3.STM32 cubeMX配置蜂鸣器

首先要使外部时钟使能,因为内部时钟频率不稳定
在这里插入图片描述
系统最大为80MHZ,就设为最大
由于我的芯片是TIM2-CH2产生PWM所以设置如下在这里插入图片描述

配置PWM的参数
输出频率=系统频率(80M)/[(PSC+1)*(ARR+1)]
由于一会要改变频率,所以可以先不设脉冲宽度

在这里插入图片描述
将TIM2的GPIO设置为下拉(因为PWM输出高低电平,GPIO下拉防止蜂鸣器误发出声音)并勾选
在这里插入图片描述
接下来就是生成代码,,勾选如下使其一个功能模块生成一个.c文件和一个.h文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我一般选Open Project,因为比较方便在这里插入图片描述
在keil5中将出现如下.c文件
在这里插入图片描述
刚才我们配置的PWM参数在tim.c文件中就可以看到
在这里插入图片描述
接下来在tim.c中加入自己写的延时函数,不能调用系统,因为蜂鸣器的频率可能会不变
我的就没变。这段延时代码是我在网上百度的
在这里插入图片描述

void Delay_ms(int32_t nms) 
{
 int32_t temp; 
 SysTick->LOAD = 8000*nms; 
 SysTick->VAL=0X00; 
 SysTick->CTRL=0X01;
  do 
  { 
       temp=SysTick->CTRL; 
  }
     while((temp&0x01)&&(!(temp&(1<<16))));
     
     SysTick->CTRL=0x00; 
     SysTick->VAL =0X00;  
 }

接下来就在tim.c中的/* USER CODE BEGIN 1 /
/
USER CODE END 1 */之间加入自己的代码,以下是我的《两只老虎》的代码,如果你想放其他歌你把频率变一下就可以了。
链接:https://mp.csdn.net/mdeditor/88737012
然后在tim.h中声明你定义的变量及函数,不然会报错


最后在main.c中调用,记住一定要在GPIO和TIMX初始化之后,不然代码得不到调用
你也可以加在while(1)中 ,可以不断的放
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42153903/article/details/88714155