stm32f103通用定时器pwm应用例程--蜂鸣器演奏乐曲 下载本文

内容发布更新时间 : 2024/10/25 23:34:12星期一 下面是文章的全部内容请认真阅读。

.

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

一.说明:本例程是将流明LM3SLib_Timer.pdf文档中的例程9及例程10(PWM应用:

蜂鸣器演奏乐曲),移植到STM32F103上。

二.流明LM3SLib_Timer.pdf例程9及例程10的拷贝:

例程9. Timer PWM应用:蜂鸣器发声

如图1.1所示,为EasyARM1138开发板上的蜂鸣器驱动电路。蜂鸣器类型是交流蜂鸣器,也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。

图1.1 蜂鸣器驱动电路

程序清单1.9是Timer模块16位PWM模式的一个应用,可以驱动交流蜂鸣器发声,运行后蜂鸣器以不同的频率叫两声。其中\和\是蜂鸣器的驱动程序,仅有3个驱动函数,用起来很简捷。

程序清单1.9 Timer PWM应用:蜂鸣器发声 文件:main.c

#include \#include \// 主函数(程序入口) int main(void) {

jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化

buzzerSound(1500); // 蜂鸣器发出1500Hz声音

SysCtlDelay(400* (TheSysClock / 3000)); // 延时约400ms buzzerSound(2000); // 蜂鸣器发出2000Hz声音

SysCtlDelay(800* (TheSysClock / 3000)); // 延时约800ms buzzerQuiet( ); // 蜂鸣器静音 for (;;) { } }

文件:buzzer.h

#ifndef __BUZZER_H__ #define __BUZZER_H__ // 蜂鸣器初始化

extern void buzzerInit(void); // 蜂鸣器发出指定频率的声音

extern void buzzerSound(unsigned short usFreq); word范文

.

// 蜂鸣器停止发声

extern void buzzerQuiet(void); #endif // __BUZZER_H__ 文件:buzzer.c

#include \#include #include #include #include #include #define PART_LM3S1138 #include

#define SysCtlPeriEnable SysCtlPeripheralEnable #define GPIOPinTypeOut GPIOPinTypeGPIOOutput // 声明全局的系统时钟变量

extern unsigned long TheSysClock;

// 蜂鸣器初始化

void buzzerInit(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位PWM TIMER_CFG_B_PWM); }

// 蜂鸣器发出指定频率的声音

// usFreq是发声频率,取值 (系统时钟/65536)+1 ~ 20000,单位:Hz void buzzerSound(unsigned short usFreq) {

unsigned long ulVal;

if ((usFreq <= TheSysClock / 65536UL) || (usFreq > 20000)) {

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计数 } }

// 蜂鸣器停止发声

void buzzerQuiet(void) {

TimerDisable(TIMER1_BASE, TIMER_B); // 禁止TimerB计数

GPIOPinTypeOut(CCP3_PORT, CCP3_PIN); // 配置CCP3管脚为GPIO输出 GPIOPinWrite(CCP3_PORT, CCP3_PIN, 0x00); // 使CCP3管脚输出低电平 }

例程10.Timer PWM应用:蜂鸣器演奏乐曲

程序清单1.10是Timer模块16位PWM模式的一个应用,能驱动交流蜂鸣器演奏一首动听的乐曲《化蝶》(乐谱参见图1.2)。\和\是演奏乐曲的驱动程序。

word范文

.

图1.2 乐谱《化蝶》

简谱是大众化的音乐记谱方式,比较容易理解和掌握。我们可以把一首乐谱(score)看成是由若干个基本的音符(note)单元组成。一个音符由音名和时值组成。音名就是低音、中音、高音的1234567(唱作do re mi fa sol la si),其本质是音符的发声频率。在头文件\里,用L1~L7、M1~M7、H1~H7定义了低音、中音、高音所对应的发声频率。时值是音符的发声时间长短,有全音符、二分音符、四分音符??等等。音符可以后缀一个“符点”,表示时值增加1/2,特殊地,二分音符加符点时用“-”代替圆点。参见表1.26的描述。

音 符 5――― 5- 5 5 5 5―― 5. 5. 表1.26 常见简谱音符示例 名 称 全音符 二分音符 四分音符 八分音符 十六分音符 符点二分音符 符点四分音符 符点八分音符 相 对 时 值 T T/2 T/4 T/8 T/16 T/2+T/4 T/4+T/8 T/8+T/16

在头文件\里定义有一个音符结构体tNote,有两个数据成员:音名mName和时值mTime。在C文件\里定义有一个tNote型常量数表MyScore[ ],用来保存实际乐谱转换成tNote格式的数据。有了上述一点点乐谱基础知识,我们就可以很方便地编辑这个数表了。比如音符“3”转换为“{M3, T/4}”,音符“3.”转换为“{M3, T/4+T/8}”,等等。在\里,已经在数表MyScore[ ]里给出了乐谱《化蝶》开头一部分音符转换结果,其余部分请感兴趣的读者补充完整。

程序清单1.10 Timer PWM应用:蜂鸣器演奏乐曲

文件:main.c

#include \#include \#include \// 主函数(程序入口) int main(void) {

jtagWait(); // 防止JTAG失效,重要! clockInit(); // 时钟初始化:晶振,6MHz buzzerInit(); // 蜂鸣器初始化 for (;;) {

musicPlay();

SysCtlDelay(4000 * (TheSysClock / 3000)); } }

word范文