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

📄 wave.c

📁 IAR编译环境下的AT91SAM7S64芯片的PWM输出演示
💻 C
字号:
//*----------------------------------------------------------------------------
//*      ATMEL Microcontroller Software Support  -  ROUSSET  -
//*----------------------------------------------------------------------------
//* The software is delivered "AS IS" without warranty or condition of any
//* kind, either express, implied or statutory. This includes without
//* limitation any warranty or condition with respect to merchantability or
//* fitness for any particular purpose, or against the infringements of
//* intellectual property rights of others.
//*----------------------------------------------------------------------------
//* File Name           : wave.c
//* Object              : wave description file for Audio extention board
//*
//* 1.0 21/01/02 JPP    : Creation,
//* 1.1 07/Apr/05 JPP   : Change for PWM
//*----------------------------------------------------------------------------

//* --------------------------- include file ----------------------------------

#include "init.h"
#include "wave.h"
#include "audio.h"

//* Wave  parameter
WaveITDESC	IT_buff;

//* --------------------------- Constant definition ---------------------------

//*----------------------------------------------------------------------------
//* \fn    Setwave
//* \brief Set wawe para
//*----------------------------------------------------------------------------
void Setwave(void)
{
	WaveHeaderDESC *ptHeader;
	ptHeader = 	(WaveHeaderDESC *) FILE_LOCATION;
	wave_print_header(ptHeader);

    IT_buff.File= ptHeader;
    IT_buff.cmpt=0;
    IT_buff.block_size =0;
    IT_buff.ptr = (char*)&(IT_buff.File->dataStart);
}
//*----------------------------------------------------------------------------
//* Function Name       : wave_print_header
//* Object              : Print wave header information
//* Input Parameters    : ptHeader Header wave file
//* Output Parameters   : none
//*----------------------------------------------------------------------------
void wave_print_header(WaveHeaderDESC *ptHeader)
//* Begin
{
		sprintf(message,"size:%d, %dKb\n\r",ptHeader->fileSize,ptHeader->fileSize/1024);
		AT91F_DBGU_Printk(message);
		if ( ptHeader->wavType == WAVE_TYPE_PCM ) AT91F_DBGU_Printk("PCM ");
			else  AT91F_DBGU_Printk("Uncknown TYPE !!! ");
		if ( ptHeader->monoStereo == WAVE_MONO ) AT91F_DBGU_Printk("MONO, ");
		if ( ptHeader->monoStereo == WAVE_STEREO ) AT91F_DBGU_Printk("STEREO, ");
		sprintf(message,"sample:%dHz,%d Bits/s\n\r",ptHeader->sampleRate,ptHeader->sampleSpeed);
		AT91F_DBGU_Printk(message);
		sprintf(message,"Wave %dKHz, ",ptHeader->sampleRate/1000);
		AT91F_DBGU_Printk(message);
		sprintf(message,"align:%d, ",ptHeader->alignment);
		AT91F_DBGU_Printk(message);
		sprintf(message,"Width:%d\n\r",ptHeader->sampleWidth);
		AT91F_DBGU_Printk(message);
//* End
}
//*----------------------------------------------------------------------------
//* Function Name       : wave_interrupt
//* Object              : Wave file Interrupt Management
//* Input Parameters    : IT_buff Wave descriptor
//* Output Parameters   : none
//*----------------------------------------------------------------------------
__ramfunc void OutputWave(char *ptr_data,int size)
{
char sample_r[4];
char Sample;
int cmpt,cmpt_read;
    for (cmpt=0 ; cmpt < size ; cmpt++,IT_buff.cmpt+=IT_buff.File->alignment)
	{
        // read one sample can be 1 for 8 bits to 4 32 bits
		for (cmpt_read=0 ; cmpt_read < (IT_buff.File->sampleWidth/8) ; cmpt_read++)
		{
			sample_r[cmpt_read]=*(IT_buff.ptr);
			IT_buff.ptr++;
		}
		//
		switch (cmpt_read)
		{
			case 1:// 8 bits unsigned
				Sample=  (sample_r[0]);
			break;
			case 2:// 16 bits signed
				Sample=  (sample_r[1]);
			break;
			case 3:// 24 bits signed
				Sample = (sample_r[2]);
			break;
			case 4:// 32 bits signed
				Sample = (sample_r[3]) ;
			break;
		}

#ifdef TEST_WAVE_STEREO
		if ( IT_buff.File->monoStereo == WAVE_STEREO)
		{
			for (cmpt_read=0 ; cmpt_read < (IT_buff.File->sampleWidth/8) ; cmpt_read++)
			{
				sample_r[cmpt_read]=*(IT_buff.ptr);
				IT_buff.ptr++;
			}
		}
#endif
		ptr_data[cmpt] = Sample;
		if (IT_buff.cmpt >= IT_buff.File->chunkSize )
		{
			ptr_data[cmpt]=0x00;
		}

    }
	if (IT_buff.cmpt >= IT_buff.File->chunkSize )
	{
           AT91F_DBGU_Printk("Wave done:\n\r");
    	   SetConstant(0);
           OutputSample_init(OutputConstant);
	}

}


⌨️ 快捷键说明

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