请各位路过的高手帮忙看下,我找了一份F1的程序,修改后放在探索者中实验,用PWM来控制蜂鸣器播放一节小音乐的,可是每次下载后,总是只响乐曲的第一个音符,往下就没有反应了。调试时程序看着也是按步骤走的,可为什么不响呢?//////////////////////////////////////////////////////
#include "pwm.h"
#include "led.h"
#include "beep.h"
//TIM13 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM13_PWM_Init_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStruc;
TIM_OCInitTypeDef TIM_OCInitStruc;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM13,ENABLE); //TIM13时钟使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13); //GPIOF8复用为定时器13
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF8
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //上拉
GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF8
TIM_TimeBaseStruc.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStruc.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStruc.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStruc.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM13,&TIM_TimeBaseStruc);//初始化定时器13
//初始化TIM13 Channel1 PWM模式
TIM_OCInitStruc.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStruc.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStruc.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OCInitStruc.TIM_Pulse=0;
TIM_OC1Init(TIM13, &TIM_OCInitStruc); //根据T指定的参数初始化外设TIM13 OC1
TIM_OC1PreloadConfig(TIM13, TIM_OCPreload_Enable); //使能TIM13在CCR1上的预装载寄存器
TIM_ARRPreloadConfig(TIM13,ENABLE);//ARPE使能
TIM_Cmd(TIM13, ENABLE); //使能TIM13
}
//////////////////////////////////////////////////////////////
//蜂鸣器初始化
#include "beep.h"
//初始化PF8为输出口
//BEEP IO初始化
void BEEP_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);//使能GPIOF时钟
//初始化蜂鸣器对应引脚GPIOF8
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;//下拉
GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化GPIO
GPIO_ResetBits(GPIOF,GPIO_Pin_8); //蜂鸣器对应引脚GPIOF8拉低
}
////////////////////////////////////////////////////////////////
//music.h
//文件:music.h
#ifndef __MUSIC_H__
#define __MUSIC_H__
#include "sys.h"
// 定义低音音名(数值单位:Hz)
#define L1 262 // c
#define L2 294 // d
#define L3 330 // e
#define L4 349 // f
#define L5 392 // g
#define L6 440 // a1
#define L7 494 // b1
// 定义中音音名
#define M1 523 // c1
#define M2 587 // d1
#define M3 659 // e1
#define M4 698 // f1
#define M5 784 // g1
#define M6 880 // a2
#define M7 988 // b2
// 定义高音音名
#define H1 1047 // c2
#define H2 1175 // d2
#define H3 1319 // e2
#define H4 1397 // f2
#define H5 1568 // g2
#define H6 1760 // a3
#define H7 1976 // b3
// 定义时值单位,决定演奏速度(数值单位:ms)
#define T 3600
#define TT 2000
//定义音符结构
typedef struct {
short mName; // 音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的1234567,取值0表示休止符
short mTime; // 时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、 二分音符、四分音符、八分音符 ,取值0表示演奏结束
}tNote;
void buzzerQuiet(void);
void buzzerSound(unsigned short usFreq);
void musicPlay(void);
#endif
///////////////////////////////////////////////////////////
//music.c
#include "sys.h"
#include "music.h"
#include "delay.h"
#include "beep.h"
//#include "pwm.h"
// 定义乐曲:《化蝶》(梁祝)
const tNote MyScore[] =
{
{L3, T/4},
{L5, T/8+T/16},
//
{L6, T/16},
{M1, T/8+T/16},
{M2, T/16},
{L6, T/16},
{M1, T/16},
{L5, T/8},
{M5, T/8+T/16},
{H1, T/16},
{M6, T/16},
{M5, T/16},
{M3, T/16},
{M5, T/16},
{0, 0} // 结束
};
// 蜂鸣器停止发声
void buzzerQuiet(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_Cmd(TIM13, DISABLE); //停止TIM3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //PB.5 端口配置
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOF, &GPIO_InitStructure); //根据设定参数初始化GPIOB.5
GPIO_ResetBits(GPIOF,GPIO_Pin_8); //PB.5 输出低
}
//蜂鸣器发出指定频率的声音
//usFreq是发声频率,取值 (系统时钟/65536)+1 ~ 20000,单位:Hz
void buzzerSound(unsigned short usFreq)
{
// GPIO_InitTypeDef GPIO_InitStructure;
unsigned long ulVal;
if((usFreq<=8000000/65536UL)||(usFreq>20000))
{
buzzerQuiet();// 蜂鸣器静音
}
else
{
GPIO_PinAFConfig(GPIOF,GPIO_PinSource8,GPIO_AF_TIM13);
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF9
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
// GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
// GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //上拉
ulVal=8000000/usFreq;
TIM13->ARR =ulVal; //设置自动重装载寄存器周期的值(音调)
TIM_SetCompare1(TIM13,ulVal/2);//音量
TIM_Cmd(TIM13, ENABLE); //启动TIM3
}
}
// 演奏乐曲
//此为延时函数控
void musicPlay(void)
{
u8 i=0;
while(1)
{
if (MyScore[i].mTime == 0)
break;
buzzerSound(MyScore[i].mName);
delay_ms(MyScore[i].mTime);
i++;
buzzerQuiet(); // 蜂鸣器静音
delay_ms(100);// 10 ms
}
}
//////////////////////////////////////////////////////////////////
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "pwm.h"
#include "beep.h"
#include "music.h"
//延时函数控制时间
int main(void)
{
delay_init(168); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
TIM13_PWM_Init_Init(14399,10); //分频。PWM频率=72000/14400/11(Khz)
for (;;)
{
musicPlay();
delay_ms(1500);
delay_ms(1500);
}
}
一周热门 更多>