STM32单片机TIM3蜂鸣器播放音乐

发布者:丝语轻风最新更新时间:2015-11-02 来源: eefocus关键字:STM32  单片机  蜂鸣器  播放音乐 手机看文章 扫描二维码
随时随地手机看文章
下面这段代码有个小bug,软件仿真PORTB.5 beep 波形正常,如下图所示
[转载]STM32单片机TIM3蜂鸣器播放音乐

但下到我的开发板上,beep没有声音,若看到此程序,有兴趣的朋友可以帮忙验证一下,欢迎一起探讨!

#include    // STM32F10x Library Definitions
#include "STM32_Init.h"       // STM32 Initialization
#include
#define uchar unsigned char  
 
bool beep;
uchar k;
long reload_time=0,time=0;
long get_time;
 
 
 
uchar sszymmh[]={ 
                  6,2,3,5,2,1,3,2,2,5,2,2,1,3,2,6,2,1,5,2,1,
         6,2,4,3,2,2,5,2,1,6,2,1,5,2,2,3,2,2,1,2,1,
         6,1,1,5,2,1,3,2,1,2,2,4,2,2,3,3,2,1,5,2,2,
         5,2,1,6,2,1,3,2,2,2,2,2,1,2,4,5,2,3,3,2,1,
         2,2,1,1,2,1,6,1,1,1,2,1,5,1,6,0,0,0 };
                         // 音阶频率表 高八位
uchar FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8, 
                    0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC, //1,2,3,4,5,6,7,8,i
                    0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
                    0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;
                         // 音阶频率表 低八位
uchar FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
                    0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i
                    0xEE,0x44, 0x6B,0xB4,0xF4,0x2D, 
                    0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};  
 
 
 
 
void RCC_Configuration(void)
{
    ErrorStatus HSEStartUpStatus;
 
    //使能外部晶振
    RCC_HSEConfig(RCC_HSE_ON);
    //等待外部晶振稳定
    HSEStartUpStatus = RCC_WaitForHSEStartUp();
    //如果外部晶振启动成功,则进行下一步操作
    if(HSEStartUpStatus==SUCCESS)
    {
        //设置HCLK(AHB时钟)=SYSCLK
        RCC_HCLKConfig(RCC_SYSCLK_Div1);
 
        //PCLK1(APB1) = HCLK/2
        RCC_PCLK1Config(RCC_HCLK_Div2);
 
        //PCLK2(APB2) = HCLK
        RCC_PCLK2Config(RCC_HCLK_Div1);
        
 
        RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_4);//4倍频
        //启动PLL
        RCC_PLLCmd(ENABLE);
        //等待PLL稳定
        while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
        //系统时钟SYSCLK来自PLL输出
        RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
        //切换时钟后等待系统时钟稳定
        while(RCC_GetSYSCLKSource()!=0x08);  
     }
 
 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOB, ENABLE); //给GPIOD提供时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //定时器3提供时钟
}
 
 void TIM3_Configuration(void)
 {
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  
  TIM_TimeBaseStructure.TIM_Prescaler = 2;                     //2分频 22.1184M
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;    
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数模式
  TIM_TimeBaseStructure.TIM_Period = reload_time;                    //自动装载
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
  TIM_Cmd(TIM3, ENABLE);             
  }
 
 
 void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;  
 
#ifdef  VECT_TAB_RAM  
   
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
#else  
   
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //抢占式优先级别, 无抢占优先级
 
 
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure); 
 
 void GPIO_Configuration(void)
 {
 
  GPIO_InitTypeDef  GPIO_InitStructure;
[page]
 
 
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
 
  GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
 }
 
 
void delay1(uchar i)
{
 long j;
 for(;i>0;i--)
 {
 for(j=0;j<6000;j++);
 }
}
 
void delay(uchar i)
{
 unsigned long j;
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 TIM_Cmd(TIM3, DISABLE);
 for(;i>0;i--)
 {
 for(j=0;j<60000;j++);
 }
//TIM_Cmd(TIM3, ENABLE);
}
 
void song()
{
 
//  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//  TIM_TimeBaseStructure.TIM_Period = reload_time;
//  reload_time=FREQH[k]*256+FREQL[k];
 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 reload_time=get_time;
 TIM_TimeBaseStructure.TIM_Period = reload_time;
 TIM_Cmd(TIM3, ENABLE);
delay(time); 
}
 
int main (void) 
{
 uchar i=0;
 RCC_Configuration();  //配置时钟                      
 NVIC_Configuration();
 GPIO_Configuration(); //配置IO口
 TIM3_Configuration();
 GPIO_WriteBit(GPIOD, GPIO_Pin_9, (BitAction)1);
 GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)1);
 delay1(10);
 GPIO_WriteBit(GPIOD, GPIO_Pin_9, (BitAction)0);
 GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)0);
while(1)
 {
 time=1;
 i=0;
 while(i<75)
 {
         k=sszymmh[i]+7*sszymmh[i+1]-1;
get_time=FREQH[k]*256+FREQL[k];
time = sszymmh [i+ 2];   //读出时间长度数值
i=i+3;
song();
  }
 }}
 
 
void TIM3_IRQHandler (void) 
{
 //  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   TIM_Cmd(TIM3, DISABLE);
   if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)//判断是否为定时器3溢出中断
   {
     (bool)beep=!beep;
reload_time=get_time;
GPIO_WriteBit(GPIOB, GPIO_Pin_5, (BitAction)beep);
     GPIO_WriteBit(GPIOD, GPIO_Pin_9, (BitAction)beep);
   }
   TIM_ClearFlag(TIM3, TIM_FLAG_Update);     //清中断标记
   TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
//   TIM_Cmd(TIM3, DISABLE);
}
关键字:STM32  单片机  蜂鸣器  播放音乐 引用地址:STM32单片机TIM3蜂鸣器播放音乐

上一篇:关于u-boot移植时的NAND FLASH问题
下一篇:ARM 2440 学习笔记

推荐阅读最新更新时间:2024-03-16 14:38

CEPARK 51单片机DS18B20测试程序
/********************************************************************** * 文件名称: CEPARK 51 V2.0开发板 * 程序版本: V1.0 * 技术支持:http://bbs.cepark.com *CEPARK http://bbs.cepark.com/viewthread.php?tid=34&fromuid=6136 * Cepark暑期51在线免费培训用程序---活动报名地址: http://bbs.cepark.com/viewthread.php?tid=14228&fromuid=6136 ********************
[单片机]
单片机普通I/O模拟串口
#i nclude reg52.h sfr16 DPTR = 0x82; typedef unsigned char INT8U; typedef unsigned int INT16U; #define YES 1 #define NO 0 //定义使用哪个定时器, 只可定义一个 //#define TIMER_0 #define TIMER_1 //定义串口收、发送管脚。 sbit rs_TXD = P2^1; sbit rs_RXD = P2^0; //根据定时器确定参数 #ifdef TIMER_0 #define TMOD_AND_WORD 0xF0;
[单片机]
STM32 BOOT 引脚配置的说明
STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 用户闪存: BOOT1=x BOOT0=0 芯片内置的Flash。 SRAM: BOOT1=1 BOOT0=1 芯片内置的RAM 区,就是内存啦。 系统存储器:BOOT1=0 BOOT0=1 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。 在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表: BOOT1=x BOOT0=0 从用户闪存启
[单片机]
单片机定时中断数码管程序
;数码管 ---- 目的:学习查表及间接寻址定时中断 ;完整代码下载地址: http://www.51hei.com/f/smysh.rar CHIP SN8F27E65 //{{SONIX_CODE_OPTION .Code_Option WDT_CLK Flosc/4 .Code_Option Reset_Pin P04 .Code_Option LVD LVD_Max ; 3.3V Reset .Code_Option Watch_Dog Disable ;关闭看门狗 .Code_Option Low_Fcpu Flosc/1 .Code_Option High_Clk IHRC_16M ; Internal 16M RC
[单片机]
基于单片机的直流电子负载的设计方案
  本文提出了一种基于STC12C5A60S的直流电子负载的设计方案。主要以高速、低功耗、超强抗干扰STC12C5A60S单片机为控制核心设计直流电子负载。包括控制电路( MCU )、主电路、采样电路、显示电路等,能够检测被测电路的电流值、电压值等各个参数,并能直观的在液晶上显示。本系统由自锁开关控制电路的工作状态,通过手动调节开关切换在恒压、恒流、恒阻电路之间的工作状态,由LED灯指示相应的工作状态。系统的稳压范围为1V-30V,稳流范围为100mA-3.5A,误差0-5%在题目要求范围内,达到题目要求并扩展了恒压、恒流的范围。由单片机控制,通过按键达到对恒压值或恒流值在一定范围内的控制,设置了过载保护,通过亮灯显示过载。   1
[单片机]
基于<font color='red'>单片机</font>的直流电子负载的设计方案
基于AVR单片机的博物馆防盗保护器系统设计
引言 博物馆内的藏品常常受到人为盗窃的威胁,周围环境的变化也会对其造成破坏,因此需要极为可靠的防盗系统及完善的空调系统,本设计的目的就是实现对馆藏品的智能化防盗和保护。博物馆关闭时便可将此防盗保护器启动,通过CMOS传感器对博物馆进行扫描,图像信号在微处理器中进行处理筛选压缩,并与被监控信号(人形信号)进行比较,一旦出现类人形信号,便将数据进行存储(这样可以大大节省存储空间),并进行报警。被监控信号可以增加,可以是其它任何可能对馆藏品造成损害的动物,只不过在进行筛选比较处理时要复杂一些。另外,通过温度传感器对温度信号进行采集监控,通过控制馆内空调来达到调节温度的效果,以避免馆内文物因为温度的变化而造成损害。 图1 系统功能框
[单片机]
基于AVR<font color='red'>单片机</font>的博物馆防盗保护器系统设计
关于51和AVR单片机开发的一些看法
本人原来使用过的芯片有:AT89C51、2051、PIC16C711、16F84、LPC76X、ADuC812/834 但是看到AVR以后觉得AVR有不少优点: 1.带10位A/D,一般满足工业控制的基本要求; 2.带FLASH和EEPROM,特别是EEPROM,可以放逻辑炸弹,防止某些人用上了不付钱; 3.引脚少,没有外扩总线,抗干扰性能还可以; 4.开发容易,开发硬件成本低(我现在采用的是汇编语言,我不用C语言,C语言对于高速实时控制太慢了),采用汇编语言来说,写一个比较复杂的控制程序(比如大功率焊接设备SCR调压器控制器),连键显、PID、触发和保护一起,4K*16位足够了,就算开发很复杂的工控系统,16K*8位的
[单片机]
基于C8051F060单片机和K9F2808UOC存储器实现数据采集系统的设计
从上个世纪九十年代起,电子技术在钻井井下得到应用。但井下钻具的振动会给很多传感器带来不利影响。 特别是对测量井下钻头姿态的惯性导航传感器影响巨大,在随钻振动环境中,如果对信号不作处理,根本就不能测量出正确的井斜角和方位角,也就无法实现井眼轨迹随钻控制的要求。本文介绍应用SoC芯片中的DMA技术对振动的高速采集和存储功能的实现方法,并给出了钻井环境中测试的结果。 1 方法的提出 传统的数据采集方法采用CPU直接控制的方式进行数据采集,数据传送需要经过CPU的中转才能存入存储器,传送速度慢且采集速率受到CPU的限制,极大影响了系统的采样频率,不能满足对振动信号高速采集的要求。而在DMA传送方式下,数据传送不经过CPU,由DMA
[单片机]
基于C8051F060<font color='red'>单片机</font>和K9F2808UOC存储器实现数据采集系统的设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved