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)中 ,可以不断的放