⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pwm.c

📁 本代码是在arm-lpc2220上做的一个pwm播放wav声音的源代码。
💻 C
字号:
#include  "deftype.h"
#include  "config.h"

union valchg
{
       U32 buf32;
	   U16 buf16[2];                 
	   U8 buf8[4]; 
	                
}val; 
unsigned int val_souceaddr; 
unsigned int val_souceLen; 
unsigned int val_soucecnt;
U8 adjust_val;    //调节音量
U8 val_flag;

#define   SOUNDRING_OFFSET0   0        
#define   SOUNDRING_OFFSET1   0x23000 
//#define   TESTSOUND_OFFSET   0x64000  //数据区 //test

extern void FlashRead(unsigned int ReadStart, unsigned short *DataPtr, unsigned int Size);  //size 表示要读出的字节长
extern void Int_PWM(void);
extern void Uart_Printf(char *fmt,...);
extern void setbuzkey(uint8 buz_set);

/************************************************************************************
*** 函 数 名:  U8 adjust_sound(U8 sound_val)
*** 功能描述: 调节声音函数
*** 全局变量:
*** 参    数:  输入: 	U8 sound_val
***            输出:
*** 功能模块: 
*** 返 回 值:			无
*** 模块信息: 
************************************************************************************/
U8 adjust_sound(U8 sound_val)
{
        U16 i;
	    U8 j;
	                   
        if(sound_val>=0x80)
	    {

	       i = (sound_val - 0x80) * adjust_val; //调节音量
	       i = i/10;
	          	             
	       if(i>=0x80) i = 0x7f;
	       j = 0x80 + (U8)i;
	    }
	    else
	    {
	       i = (0x80 - sound_val) * adjust_val; //调节音量
	       i = i/10;
	       if(i>=0x80) i = 0x7f;
	       
	       j = 0x80 - (U8)i;
	    }
	    return j;
} 

/************************************************************************************
*** 函 数 名:  void __irq PWM5_IRQ(void) 
*** 功能描述:  pwm发音中断函数
*** 全局变量:
*** 参    数:  输入: 	无
***            输出:
*** 功能模块: 
*** 返 回 值:			无
*** 模块信息:  
************************************************************************************/
void __irq PWM5_IRQ(void) 
{	

	 if(val_soucecnt <  val_souceLen)
     {
        if(val_flag == 0)
        {
		    FlashRead(val_souceaddr, &val.buf16[0], 2);
		    val_souceaddr+=2;
		    val_soucecnt ++;          //计数
		    val_flag = 1;		   		    
            PWMMR5 = adjust_sound(val.buf8[0]);
            // PWMLER = 0x21;			    // PWMMR0、PWMMR5锁存
            PWMLER = 0x20;			        //PWMMR5锁存
    	}
    	else
    	{
    	    val_soucecnt ++;                //计数
    	    val_flag = 0;
    	    
    	    PWMMR5 = adjust_sound(val.buf8[1]);
            // PWMLER = 0x21;			    // PWMMR0、PWMMR5锁存
            PWMLER = 0x20;			        //PWMMR5锁存         	
    	}
     }
     else
     {
         //  Uart_Printf("val_souceaddr = %04x ",val_souceaddr);//test    
     	 val_flag = 0;
	     PWMTCR = 0x02; //PWM使能,停止PWM定时器    
	     Int_PWM();     //pwm初始化成按键模式
     }
       
     PWMIR = 0x01;
     VICVectAddr = 0;					// 向量中断结束 
     
} 


/************************************************************************************
*** 函 数 名:  void InitBUZPWM(U8 sound_id,U8 adj_val)
*** 功能描述:  //初始化pwm发音
*** 全局变量:
*** 调用函数:
			  
*** 参    数:  输入: 	无
***            输出:
*** 功能模块: 
*** 返 回 值:			无
*** 模块信息: 
************************************************************************************/
void InitBUZPWM(U8 sound_id,U8 adj_val)
{
    //PWMPR = 0;//PWM预分频计数器设为0,则PWMTC每1个pclk周期加1 pclk=27648000HZ

    PINSEL1 = (PINSEL1&0xfffff3ff)|0x00000400;//BUZ设置为PWM5  //设置P0.21为
    PWMPCR = (PWMPCR&0xffffffdf)|0x00002000;//使能PWM5,模式为单边沿控制
    PWMLER = 0;   
    PWMPR = 4;//27;			        // 分频,计数频率为Fpclk    1us

    PWMMCR = 0x0003;        //当PWMMR5匹配时产生中断,当PWMMR0匹配时复位PWM定时器
    PWMMR0 = 255;           //补尝  //255 8k
    
    adjust_val = adj_val;   //调节音量值
    if(sound_id == 0)       //id号为0 放铃声
    {
       val_souceaddr = SOUNDRING_OFFSET0; 
    }
    else if(sound_id == 1)                
    {
       val_souceaddr = SOUNDRING_OFFSET1; 
    }
    else                               //留给以后用
    {
        val_souceaddr = SOUNDRING_OFFSET0; 
    }
    FlashRead(val_souceaddr, &val.buf16[0], 4); //读取声音长度      
    val_souceLen = val.buf32;                   //声音长度放在pwm起始地址的前4个字节   
    
    // Uart_Printf("val_souceLen = %04x ",val_souceLen);//test
    //Uart_Printf("adjust_val = %02x ",adjust_val);//test    
     
    val_soucecnt = 0;               
    
	val_souceaddr+=4;
	val_flag = 1;	 
	
	FlashRead(val_souceaddr, &val.buf16[0], 2);
	val_souceaddr+=2;
	
	val_soucecnt ++;  	              
    PWMMR5 = adjust_sound(val.buf8[0]);       //声音初始值 	 
    
    PWMLER = 0x21;			    // PWMMR0、PWMMR5锁存

    VICIntSelect &= 0xfffffeff;   //设置IRQ中断  
    //VICIntSelect |= 0x00000100;		//设置FIQ中断
    VICVectCntl8 = 0x28;               
      
    VICVectAddr8 = (uint32)PWM5_IRQ;//设置中断服务程序地址
       
	VICIntEnable |= 1<<8;          // 使能PWM中断
    PWMTCR = 0x09; //PWM使能,启动PWM定时器        
}


/************************************************************************************
*** 函 数 名: void Start_PWM_Sound(U8 Sound_ID,U8 Adjust_Val)
*** 功能描述:  pwm发音主函数
*** 全局变量:
*** 参    数:  输入: 	U8 Sound_ID
                        U8 Adjust_Val
***            输出:
*** 功能模块:        根据ID号放出不同的声音
                     Sound_ID == 0时,放铃声
                       
                     根据Adjust_Val调节音量
                     Adjust_Val == 0时,  没声音
                     Adjust_Val == 10时, 原声音(没有放大,也没缩小)
                     Adjust_Val > 10时,声音放大
                     Adjust_Val < 10时, 声音缩小
*** 返 回 值:	
*** 模块信息:  
************************************************************************************/
void Start_PWM_Sound(U8 Sound_ID,U8 Adjust_Val) 
{	
     U8 temp;
     if(Adjust_Val>100) temp = 100;   //防止调节过大
     else  temp = Adjust_Val;
     setbuzkey(1);  //开启按键 
	 InitBUZPWM(Sound_ID,temp);	 
} 








⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -