STM32F103通用定时器PWM应用例程--蜂鸣器演奏乐曲

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1STM32F103通用定时器PWM应用例程:蜂鸣器演奏乐曲一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:蜂鸣器演奏乐曲),移植到STM32F103上。二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:例程9.TimerPWM应用:蜂鸣器发声如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。图1.1蜂鸣器驱动电路程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中buzzer.h和buzzer.c是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。程序清单1.9TimerPWM应用:蜂鸣器发声文件:main.c#includesystemInit.h#includebuzzer.h//主函数(程序入口)intmain(void){jtagWait();//防止JTAG失效,重要!clockInit();//时钟初始化:晶振,6MHzbuzzerInit();//蜂鸣器初始化buzzerSound(1500);//蜂鸣器发出1500Hz声音SysCtlDelay(400*(TheSysClock/3000));//延时约400msbuzzerSound(2000);//蜂鸣器发出2000Hz声音SysCtlDelay(800*(TheSysClock/3000));//延时约800msbuzzerQuiet();//蜂鸣器静音for(;;){}}文件:buzzer.h#ifndef__BUZZER_H__#define__BUZZER_H__//蜂鸣器初始化externvoidbuzzerInit(void);//蜂鸣器发出指定频率的声音externvoidbuzzerSound(unsignedshortusFreq);//蜂鸣器停止发声externvoidbuzzerQuiet(void);2#endif//__BUZZER_H__文件:buzzer.c#includebuzzer.h#includehw_types.h#includehw_memmap.h#includesysctl.h#includegpio.h#includetimer.h#definePART_LM3S1138#includepin_map.h#defineSysCtlPeriEnableSysCtlPeripheralEnable#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput//声明全局的系统时钟变量externunsignedlongTheSysClock;//蜂鸣器初始化voidbuzzerInit(void){SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1);//使能TIMER1模块SysCtlPeriEnable(CCP3_PERIPH);//使能CCP3所在的GPIO端口GPIOPinTypeTimer(CCP3_PORT,CCP3_PIN);//设置相关管脚为Timer功能TimerConfigure(TIMER1_BASE,TIMER_CFG_16_BIT_PAIR|//配置TimerB为16位PWMTIMER_CFG_B_PWM);}//蜂鸣器发出指定频率的声音//usFreq是发声频率,取值(系统时钟/65536)+1~20000,单位:HzvoidbuzzerSound(unsignedshortusFreq){unsignedlongulVal;if((usFreq=TheSysClock/65536UL)||(usFreq20000)){buzzerQuiet();}else{GPIOPinTypeTimer(CCP3_PORT,CCP3_PIN);//设置相关管脚为Timer功能ulVal=TheSysClock/usFreq;TimerLoadSet(TIMER1_BASE,TIMER_B,ulVal);//设置TimerB初值TimerMatchSet(TIMER1_BASE,TIMER_B,ulVal/2);//设置TimerB匹配值TimerEnable(TIMER1_BASE,TIMER_B);//使能TimerB计数}}//蜂鸣器停止发声voidbuzzerQuiet(void){TimerDisable(TIMER1_BASE,TIMER_B);//禁止TimerB计数GPIOPinTypeOut(CCP3_PORT,CCP3_PIN);//配置CCP3管脚为GPIO输出GPIOPinWrite(CCP3_PORT,CCP3_PIN,0x00);//使CCP3管脚输出低电平}例程10.TimerPWM应用:蜂鸣器演奏乐曲程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。music.h和music.c是演奏乐曲的驱动程序。3图1.2乐谱《化蝶》简谱是大众化的音乐记谱方式,比较容易理解和掌握。我们可以把一首乐谱(score)看成是由若干个基本的音符(note)单元组成。一个音符由音名和时值组成。音名就是低音、中音、高音的1234567(唱作doremifasollasi),其本质是音符的发声频率。在头文件music.h里,用L1~L7、M1~M7、H1~H7定义了低音、中音、高音所对应的发声频率。时值是音符的发声时间长短,有全音符、二分音符、四分音符⋯⋯等等。音符可以后缀一个“符点”,表示时值增加1/2,特殊地,二分音符加符点时用“-”代替圆点。参见表1.26的描述。表1.26常见简谱音符示例音符名称相对时值5―――全音符T5-二分音符T/25四分音符T/45八分音符T/85十六分音符T/165――符点二分音符T/2+T/45.符点四分音符T/4+T/85.符点八分音符T/8+T/16在头文件music.h里定义有一个音符结构体tNote,有两个数据成员:音名mName和时值mTime。在C文件music.c里定义有一个tNote型常量数表MyScore[],用来保存实际乐谱转换成tNote格式的数据。有了上述一点点乐谱基础知识,我们就可以很方便地编辑这个数表了。比如音符“3”转换为“{M3,T/4}”,音符“3.”转换为“{M3,T/4+T/8}”,等等。在music.c里,已经在数表MyScore[]里给出了乐谱《化蝶》开头一部分音符转换结果,其余部分请感兴趣的读者补充完整。程序清单1.10TimerPWM应用:蜂鸣器演奏乐曲文件:main.c#includesystemInit.h#includebuzzer.h#includemusic.h//主函数(程序入口)intmain(void){jtagWait();//防止JTAG失效,重要!clockInit();//时钟初始化:晶振,6MHzbuzzerInit();//蜂鸣器初始化for(;;){musicPlay();SysCtlDelay(4000*(TheSysClock/3000));}}4文件:music.h#ifndef__MUSIC_H__#define__MUSIC_H__//定义低音音名(数值单位:Hz)#defineL1262//c#defineL2294//d#defineL3330//e#defineL4349//f#defineL5392//g#defineL6440//a1#defineL7494//b1//定义中音音名#defineM1523//c1#defineM2587//d1#defineM3659//e1#defineM4698//f1#defineM5784//g1#defineM6880//a2#defineM7988//b2//定义高音音名#defineH11047//c2#defineH21175//d2#defineH31319//e2#defineH41397//f2#defineH51568//g2#defineH61760//a3#defineH71976//b3//定义时值单位,决定演奏速度(数值单位:ms)#defineT3600//定义音符结构typedefstruct{shortmName;//音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的//1234567,取值0表示休止符shortmTime;//时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、//二分音符、四分音符、八分音符⋯,取值0表示演奏结束}tNote;//演奏乐曲externvoidmusicPlay(void);#endif//__MUSIC_H__文件:music.c#includemusic.h#includebuzzer.h#includesystemInit.h//定义乐曲:《化蝶》(梁祝)consttNoteMyScore[]={{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},{M2,T/2},//省略后续乐曲数据,请感兴趣的读者补充完整5{0,0}//结束};//演奏乐曲voidmusicPlay(void){shorti=0;for(;;){if(MyScore[i].mTime==0)break;buzzerSound(MyScore[i].mName);SysCtlDelay(MyScore[i].mTime*(TheSysClock/3000));i++;buzzerQuiet();SysCtlDelay(10*(TheSysClock/3000));}}三.移植到STM32F103上:Timer3部分重映射TIM3_CH2-PB5:PB5作为PWM输出。//定义低音音名(数值单位:Hz)#defineL1262#defineL2294#defineL3330#defineL4349#defineL5392#defineL6440#defineL7494//定义中音音名#defineM1523#defineM2587#defineM3659#defineM4698#defineM5784#defineM6880#defineM7988//定义高音音名#defineH11047#defineH21175#defineH31319#defineH41397#defineH51568#defineH61760#defineH71976//定义时值单位,决定演奏速度(数值单位:ms)#defineTT2000typedefstruct{shortmName;//音名:取值L1~L7、M1~M7、H1~H7分别表示低音、中音、高音的1234567,取值0表示休止符shortmTime;//时值:取值T、T/2、T/4、T/8、T/16、T/32分别表示全音符、二分音符、四分音符、八分音符.,取值0表示演奏结束}tNote;6intmain(void){delay_init();//延时函数初始化NVIC_Configuration();//设置NVIC中断分组2:2位抢占优先级,2位响应优先级TIM3_PWM_Init(14399,10);//分频。PWM频率=72000/14400/11(Khz)for(;;){musicPlay();delay_ms(1500);delay_ms(1500);}}//PWM输出初始化//arr:自动重装值//psc:时钟预分频数voidTIM3_PWM_Init(u

1 / 13
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功