¿Î ³Ì Éè ¼Æ ±¨ ¸æ
¿Î³ÌÉè¼ÆÃû³Æ£º ÒôÀÖ²¥·ÅÆ÷ Ôº ϵ£º ÐÅÏ¢¹¤³ÌѧԺ ѧÉúÐÕÃû£º °à ¼¶£º ѧ ºÅ£º
³É ¼¨£º Ö¸µ¼½Ìʦ£º
¿ª¿Îʱ¼ä£º 2016-2017 ѧÄê 2 ѧÆÚ
ÒôÀÖ²¥·ÅÆ÷
Ò»¡¢Êµ¼ùµÄÄÚÈݺÍÒªÇó
1.1ʵÑéÄÚÈÝ
ѧϰWAV¸ñʽÒôƵ²¥·ÅÔÀí¡¢Êý×ÖÒôƵ½Ó¿Ú¼°µÄÏà¹ØÖªÊ¶¡£Á˽âÄ£ÄâÒôƵÐźźÍÊý×ÖÒôƵÐźŵĸÅÄî¡£ÕÆÎÕ±àдÒôƵ²¥Ö÷ÒªÄÚÈÝ ·ÅÆ÷µÄ·½·¨¡£ÊµÏÖÒôƵ²¥·Å£¬Ð¡¼üÅÌÊäÈë²Ù×÷¡£ 1.2ʵÑéÒªÇó
±¾ÏµÍ³Òª×öÒ»¸öÒôÀÖ²¥·ÅÆ÷£¬Ê¹ÓÃͨÓö¨Ê±Æ÷¶¨Ê±£¬ÓñȽÏÊä³ö¹¦ÄÜ£¬Êä³öÀ֯ׯµÂʵķ½²¨²úÉúÉùÒô£¬¶Ô 3 Ê׸èÇú±àÂ룬 ÆäÖ§³Ö WAV ¸ñʽÒôƵ²¥·Å£¨Éϼü£ºÔÝÍ££»×ó¼ü£ºÉÏÒ»Ê×£»ÓÒ¼ü£ºÏÂÒ»Ê×£©¡£ÀûÓÃÓ²¼þARM ǶÈëʽ¿ª·¢Æ½Ì¨¡¢ ÓÃÓÚ ARM7TDMI µÄ JTAG ·Â ÕæÆ÷¡¢PC »ú Pentium100¿ª·¢ÊµÏÖʵÏÖÒôƵ²¥·Å¡£Ö÷ҪʵÏÖ£ºÉÏÒ»Ê×°´¼ü£ºµ±µã»÷ÉÏÒ»Ê×°´¼üʱ£¬µ±Ç°²¥·Å¸èÇúµÄÉÏ Ò»Ê׸èÊ×±»²¥·Å¡£ÏÂÒ»Ê×°´¼ü£ºµ±µã»÷ÏÂÒ»Ê×°´¼üʱ£¬µ±Ç°²¥·Å¸èÇúµÄÏÂÒ»Ê׸èÇú¼´±» ²¥·Å¡£µ±µã»÷Í£Ö¹¼üʱ£¬µ±Ç°¸èÇú¼´»á±»Í£Ö¹¡£ ²¥·Å½çÃæÉè¼Æ£º ÔÚ¸èÇú½øÐв¥·Åʱ£¬ ½çÃæÓ¦°üº¬ËùÓеİ´¼ü£¬ ²¢ÇÒÒª¸èÇúµÄÇúÄ¿µ¥¡£
¶þ¡¢Êµ¼ùÔÀí
WAV²¥·ÅÆ÷ϵͳҪÇóÄܹ»¶Ômp3¡¢wav¸ñʽµÄÒôƵÎļþ½øÐнâÂ룬´¦ÀíÆðÀ´ËÙ¶ÈÊÇÓÐÒªÇóµÄ£¬ÓÈÆäÊǶÔ320KbpsµÄMP3¸ñʽÊý¾ÝÁ÷µÄ´¦Àí£¬±ØÐë·Ç³£¿ì£¬²ÅÄÜʵÏÖMP3µÄÁ÷³©²¥·Å£¬¿É¹©Ñ¡ÔñµÄ°Ëλ»úÓÐAVR¡¢PIC£¬¿É¹©Ñ¡ÔñµÄ32λ´¦ÀíÆ÷ÓÐSAMSUNG¡¢STM32¡¢ATMELµÈ¡£Ñ¡ÔñMCUÓÅÏÈ¿¼ÂÇÓÚÓµÓзḻµÄRAM£¬°Ëλ»úRAMÖ÷Òª¿¿À©Õ¹£¬ÄÚ²¿RAMÒ»°ãÔÚ4KbyteÒÔÄÚ£¬32λ»úÀïÃæ£¬SAMSUNGÒ»°ã²»ÄÚ´øRAM£¬Ò²ÒªÍâÀ©¡£
±¾ÊµÑéʹÓÃÁËARM7´¦ÀíÆ÷£¬MP3½âÂë¿ÉÒÔÓÐÁ½ÖÖ·½·¨£¬Ò»ÊÇͨ¹ýARM´¦ÀíÆ÷Èí½âÂ룬ͨ¹ý¶ÔMP3Êý¾Ý¸ñʽµÄ½âÎöʵÏÖMP3²¥·Å£¬¶þÊÇͨ¹ýÍⲿ½âÂëоƬֱ½Ó½âÂë¡£µÚÒ»ÖÖ·½·¨ÔÚ½âÂë¸ßÂëÂʵÄMP3ʱ£¬ARM7´¦ÀíÄÜÁ¦³Ô½ô£¬¶øÇÒSTM32»¹ÐèÒªÍⲿDACÀ´×öÒôƵÊä³ö£¬ËùÒÔ²ÉÓõڶþÖÖ·½·¨½øÐнâÂë¡£MP3³£¼ûµÄ½âÂëоƬÓÐVS100XϵÁкÍSTA01ϵÁУ¬STA01ÐèÒªÍâ½ÓDAC×öÒôƵÊä³ö£¬¶øVS1003×Ô´øDAC£¬ÇÒ½âÂëµÄÎļþ¸ñʽ°üº¬mp3ºÍwav,ÁíÍâËü»¹¿ÉÒÔʵÏÖ¼Òô¹¦ÄÜ£¬·½±ãÒÔºó½øÐй¦ÄܵÄÍØÕ¹Ó¦Óá£
1
Èý¡¢Êµ¼ù²½Öè
3.1¹¦ÄÜÉè¼Æ
¿ª»úºó£¬Ïȳõʼ»¯¸÷ÍâÉ裬Ȼºó¼ì²â×Ö¿âÎļþ¼ÐÊÇ·ñ´æÔÚ£¬Èç¹ûÓÐÎÊÌ⣬ÔòÌáʾError£¬Èç¹û¼ì²âÎÞÎÊÌ⣬Ôò¿ªÊ¼Ñ»·²¥·Å SD¿¨ÄÚMUSIC Îļþ¼ÐÀïÃæµÄ¸èÇú£¬ÔÚ TFTLCD ÉÏÏÔʾ¸èÇúÃû×Ö¡¢²¥·Åʱ¼ä¡¢¸èÇú×Üʱ¼ä¡¢¸èÇúÊýÄ¿¡¢µ±Ç°¸èÇúµÄ±àºÅµÈÐÅÏ¢¡£KEY0Ñ¡ÔñÏÂÒ»Ê×£¬KEY2 Ñ¡ÔñÉÏÒ»Ê×£¬KEY_UP ¿ØÖÆÔÝÍ£/¼ÌÐø²¥·Å¡£ 3.2ʵÑé²½Öè
1£©³õʼ»¯ WM8978£¬Õâ¸ö¹ý³Ì°üÀ¨Èí¸´Î»¡¢DAC ÉèÖá¢Êä³öÉèÖà ºÍÒôÁ¿ÉèÖõȡ£ 2£©³õʼ»¯ I2S£¬´Ë¹ý³ÌÖ÷ÒªÉèÖà SPI_I2SCFGR ¼Ä´æÆ÷£¬ÉèÖà I2S ģʽ¡¢I2S ±ê×¼¡¢Ê±ÖÓ¿ÕÏÐµçÆ½ºÍÊý¾ÝÖ¡³¤µÈ£¬×îºó¿ªÆô I2S TX DMA£¬Ê¹ÄÜ I2S ÍâÉè¡£ Ôڿ⺯ÊýÖгõʼ»¯ I2S µ÷Óõĺ¯ÊýΪ£ºvoid I2S_Init(SPI_TypeDef* SPIx, I2S_InitTypeDef* I2S_InitStruct); ½á¹¹Ìå I2S_InitTypeDef µÄ¶¨ÒåΪ£º
typedef struct
{ uint16_t I2S_Mode; uint16_t I2S_Standard;
uint16_t I2S_DataFormat; uint16_t I2S_MCLKOutput; uint32_t I2S_AudioFreq;
uint16_t I2S_CPOL; }I2S_InitTypeDef;
µÚÒ»¸ö²ÎÊýÓÃÀ´ÉèÖà I2S µÄģʽ£¬Ò²¾ÍÊÇÉèÖà SPI_I2SCFGR ¼Ä´æÆ÷µÄ I2SCFG Ïà¹ØÎ»¡£¿ÉÒÔÅäÖÃΪÖ÷ģʽ·¢ËÍ I2S_Mode_MasterTx£¬Ö÷ģʽ½ÓÊÜ I2S_Mode_MasterRx£¬´Óģʽ·¢ËÍ I2S_Mode_SlaveTx ÒÔ¼°´Óģʽ½ÓÊÜ I2S_Mode_SlaveRx ËÄÖÖģʽ¡£µÚ¶þ¸ö²ÎÊý I2S_Standard ÓÃÀ´ÉèÖà I2S ±ê×¼£¬Õâ¸öÇ°ÃæÒѾ½²½â¹ý¡£¿ÉÒÔÉèÖÃΪ£º·ÉÀûÆÖ ±ê×¼ I2S_Standard_Phillips,MSB ¶ÔÆë±ê×¼ I2S_Standard_MSB£¬LSB ¶ÔÆë±ê×¼
I2S_Standard_LSB ÒÔ¼° PCM ±ê×¼ I2S_Standard_PCMShort¡£ µÚÈý¸ö²ÎÊý I2S_DataFormat ÓÃÀ´ÉèÖà I2S µÄÊý¾ÝͨПñʽ¡£ÕâÀïʵ¼Ê°üº¬ÉèÖà SPI_I2SCFGR ¼Ä´æÆ÷µÄ HCLEN λ£¨Í¨µÀ³¤¶È£©ÒÔ¼° DATLEN 루´«ÊäµÄÊý¾Ý³¤¶È£©¡£µ±ÎÒÃÇ ÉèÖÃΪ 16 λ±ê×¼¸ñʽ
I2S_DataFormat_16b µÄʱºò£¬Êµ¼ÊÉÏ´«ÊäµÄÊý¾Ý³¤¶ÈΪ 16 λ£¬Í¨µÀ³¤¶È Ϊ 16 λ¡£µ±ÎÒÃÇÉèÖÃΪÆäËûÖµµÄʱºò£¬Í¨µÀ³¤¶È¶¼Îª 32 λ¡£µÚËĸö²ÎÊý I2S_MCLKOutputÓÃÀ´ÉèÖÃÊÇ·ñʹÄÜÖ÷ʱÖÓÊä³ö¡£ÎÒÃÇʵÑé»áʹÄÜÖ÷ʱÖÓÊä³ö¡£µÚÎå¸ö²ÎÊý I2S_AudioFreq ÓÃÀ´ÉèÖà I2S
2
ƵÂÊ¡£Êµ¼Ê¸ù¾ÝÊäÈëµÄƵÂÊÖµ£¬»áÀ´¼ÆËã SPI Ô¤ ·ÖƵ¼Ä´æÆ÷ SPI_I2SPR µÄÔ¤·ÖÆµÆæÊýÒò×ÓÒÔ¼° I2S ÏßÐÔÔ¤·ÖƵÆ÷µÄÖµ¡£ÕâÀïÖ§³Ö 10 ÖÐÆµÂÊ£º
#define I2S_AudioFreq_192k ((uint32_t)192000) #define I2S_AudioFreq_96k ((uint32_t)96000) #define I2S_AudioFreq_48k ((uint32_t)48000) #define I2S_AudioFreq_44k ((uint32_t)44100) #define I2S_AudioFreq_32k ((uint32_t)32000) #define I2S_AudioFreq_22k ((uint32_t)22050) #define I2S_AudioFreq_16k ((uint32_t)16000) #define I2S_AudioFreq_11k ((uint32_t)11025) #define I2S_AudioFreq_8k ((uint32_t)8000) #define I2S_AudioFreq_Default ((uint32_t)2)
µÚÁù¸ö²ÎÊý I2S_CPOL ÓÃÀ´ÉèÖÿÕÏÐ״̬ʱÖÓµçÆ½£¬È¡ÖµÎª¸ßµçƽ I2S_CPOL_High ÒÔ¼°µÍµçƽ I2S_CPOL_Low¡£
3£©½âÎö WAV Îļþ£¬»ñÈ¡ÒôƵÐźŲÉÑùÂʺÍλÊý²¢ÉèÖà I2S ʱÖÓ·ÖÆµÆ÷ÕâÀҪÏȽâÎö WAV Îļþ£¬È¡µÃÒôƵÐźŵIJÉÑùÂÊ£¨fs£©ºÍλÊý£¨16 λ»ò 32 룩£¬¸ù¾ÝÕâÁ½¸ö²ÎÊý£¬À´ÉèÖà I2S µÄʱÖÓ·ÖÆµ£¬ÕâÀïÎÒÃÇÓÃÇ°Ãæ½éÉܵIJé±í·¨À´ÉèÖü´¿É¡£ÕâÊÇÎÒÃǵ¥¶ÀдÁËÒ»¸öÉèÖÃÆµÂʵĺ¯ÊýΪ I2S2_SampleRate_Set¡£
4£©ÉèÖà DMA I2S ²¥·ÅÒôƵµÄʱºò£¬Ò»°ã¶¼ÊÇͨ¹ý DMA À´´«ÊäÊý¾ÝµÄ£¬ËùÒÔ±ØÐëÅäÖà DMA£¬±¾ÕÂÎÒÃÇÓà I2S2£¬Æä TXÊÇʹÓÃµÄ DMA1 Êý¾ÝÁ÷ 4 µÄͨµÀ 0 À´´«ÊäµÄ¡£²¢ÇÒSTM32F4 µÄ DMA ¾ßÓÐË«»º³å»úÖÆ£¬ÕâÑù¿ÉÒÔÌá¸ßЧÂÊ£¬´ó´ó·½±ãÁËÎÒÃǵÄÊý¾Ý´«Ê䣬±¾Õ½« DMA1 Êý¾ÝÁ÷ 4 ÉèÖÃΪ£ºË«»º³åÑ»·Ä£Ê½£¬ÍâÉèºÍ´æ´¢Æ÷¶¼ÊÇ 16 λ¿í£¬²¢¿ªÆô DMA ´«ÊäÍê³ÉÖжϣ¨·½±ãÌî³äÊý¾Ý£©¡£
5£©±àд DMA ´«ÊäÍê³ÉÖжϷþÎñº¯ÊýΪÁË·½±ãÌî³äÒôƵÊý¾Ý£¬ÎÒÃÇʹÓà DMA ´«ÊäÍê³ÉÖжϣ¬Ã¿µ±Ò»¸ö»º³åÊý¾Ý·¢ËÍÍêºó£¬Ó²¼þ×Ô¶¯Çл»ÎªÏÂÒ»¸ö»º³å£¬Í¬Ê±½øÈëÖжϷþÎñº¯Êý£¬Ìî³äÊý¾Ýµ½·¢ËÍÍêµÄÕâ¸ö»º³å¡£
6£©¿ªÆô DMA ´«Ê䣬Ìî³äÊý¾Ý ×îºó£¬ÎÒÃǾÍÖ»ÐèÒª¿ªÆô DMA ´«Ê䣬Ȼºó¼°Ê±Ìî³ä WAV Êý¾Ýµ½ DMA µÄÁ½¸ö»º´æÇø¼´ ¿É¡£´Ëʱ£¬¾Í¿ÉÒÔÔÚ WM8978 µÄ¶ú»úºÍÀ®°ÈͨµÀÌýµ½Ëù²¥·ÅÒôÀÖÁË¡£²Ù×÷·½·¨Îª£º DMA_Cmd(DMA1_Stream4,ENABLE);//¿ªÆô DMA TX ´«Êä,¿ªÊ¼²¥·Å¡£
3
3.3Á÷³Ìͼ
3.4¹Ø¼ü´úÂë
I2s.c´úÂ룺 #include \#include \
void I2S2_Init(u16 I2S_Standard,u16 I2S_Mode,u16 I2S_Clock_Polarity,u16 I2S_DataFormat)
{
I2S_InitTypeDef I2S_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//ʹÄÜSPI2ʱÖÓ RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,ENABLE); //¸´Î»SPI2 RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2,DISABLE);//½áÊø¸´Î» I2S_InitStructure.I2S_Mode=I2S_Mode;//IISģʽ I2S_InitStructure.I2S_Standard=I2S_Standard;//IIS±ê×¼ I2S_InitStructure.I2S_DataFormat=I2S_DataFormat;//IISÊý¾Ý³¤¶È
4
Ö¹
I2S_InitStructure.I2S_MCLKOutput=I2S_MCLKOutput_Disable;//Ö÷ʱÖÓÊä³ö½û
I2S_InitStructure.I2S_AudioFreq=I2S_AudioFreq_Default;//IISƵÂÊÉèÖà I2S_InitStructure.I2S_CPOL=I2S_Clock_Polarity;//¿ÕÏÐ״̬ʱÖÓµçÆ½ I2S_Init(SPI2,&I2S_InitStructure);//³õʼ»¯IIS
SPI_I2S_DMACmd(SPI2,SPI_I2S_DMAReq_Tx,ENABLE);//SPI2 TX DMAÇëÇóʹÄÜ.
I2S_Cmd(SPI2,ENABLE);//SPI2 I2S ENʹÄÜ. }
//²ÉÑùÂʼÆË㹫ʽ:Fs=I2SxCLK/[256*(2*I2SDIV+ODD)] //I2SxCLK=(HSE/pllm)*PLLI2SN/PLLI2SR //Ò»°ãHSE=8Mhz
//pllm:ÔÚSys_Clock_SetÉèÖõÄʱºòÈ·¶¨£¬Ò»°ãÊÇ8 //PLLI2SN:Ò»°ãÊÇ192~432 //PLLI2SR:2~7 //I2SDIV:2~255 //ODD:0/1
//I2S·ÖƵϵÊý±í@pllm=8,HSE=8Mhz,¼´vcoÊäÈëÆµÂÊΪ1Mhz //±í¸ñʽ:²ÉÑùÂÊ/10,PLLI2SN,PLLI2SR,I2SDIV,ODD const u16 I2S_PSC_TBL[][5]= {
{800 ,256,5,12,1}, {1102,429,4,19,0}, {1600,213,2,13,0}, {2205,429,4, 9,1},
//8Khz²ÉÑùÂÊ //11.025Khz²ÉÑùÂÊ //16Khz²ÉÑùÂÊ //22.05Khz²ÉÑùÂÊ
5
{3200,213,2, 6,1}, {4410,271,2, 6,0}, {4800,258,3, 3,1}, {8820,316,2, 3,1}, {9600,344,2, 3,1}, {17640,361,2,2,0}, {19200,393,2,2,0},
//32Khz²ÉÑùÂÊ //44.1Khz²ÉÑùÂÊ //48Khz²ÉÑùÂÊ //88.2Khz²ÉÑùÂÊ //96Khz²ÉÑùÂÊ //176.4Khz²ÉÑùÂÊ //192Khz²ÉÑùÂÊ
};
//ÉèÖÃIISµÄ²ÉÑùÂÊ(@MCKEN) //samplerate:²ÉÑùÂÊ,µ¥Î»:Hz //·µ»ØÖµ:0,ÉèÖóɹ¦;1,ÎÞ·¨ÉèÖÃ. u8 I2S2_SampleRate_Set(u32 samplerate) {
u8 i=0; u32 tempreg=0;
samplerate/=10;//ËõС10±¶
for(i=0;i<(sizeof(I2S_PSC_TBL)/10);i++)//¿´¿´¸Ä²ÉÑùÂÊÊÇ·ñ¿ÉÒÔÖ§³Ö { }
RCC_PLLI2SCmd(DISABLE);//ÏȹرÕPLLI2S
if(i==(sizeof(I2S_PSC_TBL)/10))return 1;//ËѱéÁËÒ²ÕÒ²»µ½
if(samplerate==I2S_PSC_TBL[i][0])break;
RCC_PLLI2SConfig((u32)I2S_PSC_TBL[i][1],(u32)I2S_PSC_TBL[i][2]);//ÉèÖÃI2SxCLKµÄƵÂÊ(x=2) ÉèÖÃPLLI2SN PLLI2SR
6
}
RCC->CR|=1<<26; //¿ªÆôI2SʱÖÓ
//µÈ´ýI2SʱÖÓ¿ªÆô³É¹¦.
while((RCC->CR&1<<27)==0);
tempreg=I2S_PSC_TBL[i][3]<<0; //ÉèÖÃI2SDIV tempreg|=I2S_PSC_TBL[i][4]<<8; //ÉèÖÃODDλ tempreg|=1<<9;
//ʹÄÜMCKOEλ,Êä³öMCK //ÉèÖÃI2SPR¼Ä´æÆ÷
SPI2->I2SPR=tempreg; return 0;
//I2S2 TX DMAÅäÖÃ
//ÉèÖÃΪ˫»º³åģʽ,²¢¿ªÆôDMA´«ÊäÍê³ÉÖÐ¶Ï //buf0:M0ARµØÖ·. //buf1:M1ARµØÖ·. //num:ÿ´Î´«ÊäÊý¾ÝÁ¿
void I2S2_TX_DMA_Init(u8* buf0,u8 *buf1,u16 num) {
NVIC_InitTypeDef NVIC_InitStructure; DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1,ENABLE);//DMA1ʱÖÓʹÄÜ
DMA_DeInit(DMA1_Stream4);
while (DMA_GetCmdStatus(DMA1_Stream4) != DISABLE){}//µÈ´ýDMA1_Stream1¿ÉÅäÖÃ
/* ÅäÖÃ DMA Stream */
DMA_InitStructure.DMA_Channel = DMA_Channel_0; //ͨµÀ0 SPI2_TXͨµÀ DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&SPI2->DR;//ÍâÉèµØÖ·Îª:(u32)&SPI2->DR
7
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)buf0;//DMA ´æ´¢Æ÷0µØÖ· DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//´æ´¢Æ÷µ½ÍâÉèģʽ DMA_InitStructure.DMA_BufferSize = num;//Êý¾Ý´«ÊäÁ¿
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//ÍâÉè·ÇÔöÁ¿Ä£Ê½
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//´æ´¢Æ÷ÔöÁ¿Ä£Ê½ DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//ÍâÉèÊý¾Ý³¤¶È:16λ
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//´æ´¢Æ÷Êý¾Ý³¤¶È£º16λ
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;// ʹÓÃÑ»·Ä£Ê½ DMA_InitStructure.DMA_Priority = DMA_Priority_High;//¸ßÓÅÏȼ¶
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //²»Ê¹ÓÃFIFOģʽ DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//ÍâÉèÍ»·¢µ¥´Î´«Êä
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//´æ´¢Æ÷Í»·¢µ¥´Î´«Êä
DMA_Init(DMA1_Stream4, &DMA_InitStructure);//³õʼ»¯DMA Stream
DMA_DoubleBufferModeConfig(DMA1_Stream4,(u32)buf1,DMA_Memory_0);//Ë«»º³åģʽÅäÖÃ
DMA_DoubleBufferModeCmd(DMA1_Stream4,ENABLE);//Ë«»º³åģʽ¿ªÆô DMA_ITConfig(DMA1_Stream4,DMA_IT_TC,ENABLE);//¿ªÆô´«ÊäÍê³ÉÖÐ¶Ï NVIC_InitStructure.NVIC_IRQChannel = DMA1_Stream4_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00;//ÇÀÕ¼ÓÅÏȼ¶0 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;//×ÓÓÅÏȼ¶0
8
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//ʹÄÜÍⲿÖжÏͨµÀ NVIC_Init(&NVIC_InitStructure);//ÅäÖà }
//I2S DMA»Øµ÷º¯ÊýÖ¸Õë
void (*i2s_tx_callback)(void); //TX»Øµ÷º¯Êý //DMA1_Stream4ÖжϷþÎñº¯Êý void DMA1_Stream4_IRQHandler(void) {
if(DMA_GetITStatus(DMA1_Stream4,DMA_IT_TCIF4)==SET)////DMA1_Stream4,´«ÊäÍê³É±êÖ¾
{
DMA_ClearITPendingBit(DMA1_Stream4,DMA_IT_TCIF4);
i2s_tx_callback(); //Ö´Ðлص÷º¯Êý,¶ÁÈ¡Êý¾ÝµÈ²Ù×÷ÔÚÕâÀïÃæ´¦Àí }
//I2S¿ªÊ¼²¥·Å
void I2S_Play_Start(void) { }
//¹Ø±ÕI2S²¥·Å
void I2S_Play_Stop(void) {
DMA_Cmd(DMA1_Stream4,DISABLE);//¹Ø±ÕDMA,½áÊø²¥·Å
}
DMA_Cmd(DMA1_Stream4,ENABLE);//¿ªÆôDMA TX´«Êä,¿ªÊ¼²¥·Å
9
}
wm8978´úÂ룺 #include \#include \#include \
static u16 WM8978_REGVAL_TBL[58]= { };
//WM8978³õʼ»¯ //·µ»ØÖµ:0,³õʼ»¯Õý³£ // ÆäËû,´íÎó´úÂë u8 WM8978_Init(void) {
u8 res;
GPIO_InitTypeDef GPIO_InitStructure;
0X0000,0X0000,0X0000,0X0000,0X0050,0X0000,0X0140,0X0000, 0X0000,0X0000,0X0000,0X00FF,0X00FF,0X0000,0X0100,0X00FF, 0X00FF,0X0000,0X012C,0X002C,0X002C,0X002C,0X002C,0X0000, 0X0032,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000,0X0000, 0X0038,0X000B,0X0032,0X0000,0X0008,0X000C,0X0093,0X00E9, 0X0000,0X0000,0X0000,0X0000,0X0003,0X0010,0X0010,0X0100, 0X0100,0X0002,0X0001,0X0001,0X0039,0X0039,0X0039,0X0039, 0X0001,0X0001
10
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC, ENABLE); //ʹÄÜÍâÉèGPIOB,GPIOCʱ
//PB12/13 ¸´Óù¦ÄÜÊä³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍì GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ GPIO_Init(GPIOB, &GPIO_InitStructure);//³õʼ»¯
//PC2/PC3/PC6¸´Óù¦ÄÜÊä³ö
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//¸´Óù¦ÄÜ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//ÍÆÍì GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//ÉÏÀ GPIO_Init(GPIOC, &GPIO_InitStructure);//³õʼ»¯
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12,GPIO_AF_SPI2); //PB12,AF5 I2S_LRCK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2); //PB13,AF5 I2S_SCLK
GPIO_PinAFConfig(GPIOC,GPIO_PinSource3,GPIO_AF_SPI2); I2S_DACDATA
GPIO_PinAFConfig(GPIOC,GPIO_PinSource6,GPIO_AF_SPI2); I2S_MCK
//PC3 ,AF5
//PC6 ,AF5
GPIO_PinAFConfig(GPIOC,GPIO_PinSource2,GPIO_AF6_SPI2); //PC2 ,AF6 I2S_ADCDATA I2S2ext_SDÊÇAF6!!!
11
IIC_Init();//³õʼ»¯IIC½Ó¿Ú
res=WM8978_Write_Reg(0,0); //Èí¸´Î»WM8978 if(res)return 1; //ÒÔÏÂΪͨÓÃÉèÖÃ
//·¢ËÍÖ¸Áîʧ°Ü,WM8978Òì³£
WM8978_Write_Reg(1,0X1B); //R1,MICENÉèÖÃΪ1(MICʹÄÜ),BIASENÉèÖÃΪ1(Ä£ÄâÆ÷¹¤×÷),VMIDSEL[1:0]ÉèÖÃΪ:11(5K)
WM8978_Write_Reg(2,0X1B0); //R2,ROUT1,LOUT1Êä³öʹÄÜ(¶ú»ú¿ÉÒÔ¹¤×÷),BOOSTENR,BOOSTENLʹÄÜ
WM8978_Write_Reg(3,0X6C); //R3,LOUT2,ROUT2Êä³öʹÄÜ(À®°È¹¤×÷),RMIX,LMIXʹÄÜ
}
//WM8978д¼Ä´æÆ÷ //reg:¼Ä´æÆ÷µØÖ· //val:ҪдÈë¼Ä´æÆ÷µÄÖµ //·µ»ØÖµ:0,³É¹¦; // ÆäËû,´íÎó´úÂë
u8 WM8978_Write_Reg(u8 reg,u16 val)
WM8978_Write_Reg(6,0);
//R6,MCLKÓÉÍⲿÌṩ
WM8978_Write_Reg(43,1<<4); //R43,INVROUT2·´Ïò,Çý¶¯À®°È
WM8978_Write_Reg(47,1<<8); //R47ÉèÖÃ,PGABOOSTL,×óͨµÀMIC»ñµÃ20±¶ÔöÒæ WM8978_Write_Reg(48,1<<8); //R48ÉèÖÃ,PGABOOSTR,ÓÒͨµÀMIC»ñµÃ20±¶ÔöÒæ WM8978_Write_Reg(49,1<<1); //R49,TSDEN,¿ªÆô¹ýÈȱ£»¤
WM8978_Write_Reg(10,1<<3); //R10,SOFTMUTE¹Ø±Õ,128x²ÉÑù,×î¼ÑSNR WM8978_Write_Reg(14,1<<3); //R14,ADC 128x²ÉÑùÂÊ return 0;
12
{
IIC_Start();
IIC_Send_Byte((WM8978_ADDR<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî if(IIC_Wait_Ack())return 1; //µÈ´ýÓ¦´ð(³É¹¦?/ʧ°Ü?)
IIC_Send_Byte((reg<<1)|((val>>8)&0X01));//д¼Ä´æÆ÷µØÖ·+Êý¾ÝµÄ×î¸ßλ
if(IIC_Wait_Ack())return 2; //µÈ´ýÓ¦´ð(³É¹¦?/ʧ°Ü?) IIC_Send_Byte(val&0XFF);
//·¢ËÍÊý¾Ý
if(IIC_Wait_Ack())return 3; //µÈ´ýÓ¦´ð(³É¹¦?/ʧ°Ü?)
IIC_Stop(); }
//WM8978¶Á¼Ä´æÆ÷
//¾ÍÊǶÁÈ¡±¾µØ¼Ä´æÆ÷Öµ»º³åÇøÄڵĶÔÓ¦Öµ //reg:¼Ä´æÆ÷µØÖ· //·µ»ØÖµ:¼Ä´æÆ÷Öµ
u16 WM8978_Read_Reg(u8 reg) { }
//WM8978 DAC/ADCÅäÖà //adcen:adcʹÄÜ(1)/¹Ø±Õ(0) //dacen:dacʹÄÜ(1)/¹Ø±Õ(0)
void WM8978_ADDA_Cfg(u8 dacen,u8 adcen)
13
WM8978_REGVAL_TBL[reg]=val; //±£´æ¼Ä´æÆ÷Öµµ½±¾µØ return 0;
return WM8978_REGVAL_TBL[reg];
{ }
//WM8978 ÊäÈëͨµÀÅäÖà //micen:MIC¿ªÆô(1)/¹Ø±Õ(0) //lineinen:Line In¿ªÆô(1)/¹Ø±Õ(0) //auxen:aux¿ªÆô(1)/¹Ø±Õ(0)
void WM8978_Input_Cfg(u8 micen,u8 lineinen,u8 auxen) {
u16 regval;
regval=WM8978_Read_Reg(2); //¶ÁÈ¡R2 if(micen)regval|=3<<2; else regval&=~(3<<2);
//¿ªÆôINPPGAENR,INPPGAENL(MICµÄPGA·Å´ó) //¹Ø±ÕINPPGAENR,INPPGAENL.
u16 regval;
regval=WM8978_Read_Reg(3); //¶ÁÈ¡R3 if(dacen)regval|=3<<0; else regval&=~(3<<0);
//R3×îµÍ2¸öλÉèÖÃΪ1,¿ªÆôDACR&DACL //R3×îµÍ2¸öλÇåÁã,¹Ø±ÕDACR&DACL.
WM8978_Write_Reg(3,regval); //ÉèÖÃR3 regval=WM8978_Read_Reg(2); //¶ÁÈ¡R2 if(adcen)regval|=3<<0; else regval&=~(3<<0);
//R2×îµÍ2¸öλÉèÖÃΪ1,¿ªÆôADCR&ADCL //R2×îµÍ2¸öλÇåÁã,¹Ø±ÕADCR&ADCL.
WM8978_Write_Reg(2,regval); //ÉèÖÃR2
WM8978_Write_Reg(2,regval); //ÉèÖÃR2
regval=WM8978_Read_Reg(44); //¶ÁÈ¡R44
14
if(micen)regval|=3<<4|3<<0; //¿ªÆôLIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA. else regval&=~(3<<4|3<<0); //¹Ø±ÕLIN2INPPGA,LIP2INPGA,RIN2INPPGA,RIP2INPGA.
}
//WM8978 Êä³öÅäÖÃ
//dacen:DACÊä³ö(·ÅÒô)¿ªÆô(1)/¹Ø±Õ(0)
//bpsen:BypassÊä³ö(¼Òô,°üÀ¨MIC,LINE IN,AUXµÈ)¿ªÆô(1)/¹Ø±Õ(0) void WM8978_Output_Cfg(u8 dacen,u8 bpsen) { }
15
WM8978_Write_Reg(44,regval);//ÉèÖÃR44
if(lineinen)WM8978_LINEIN_Gain(5);//LINE IN 0dBÔöÒæ else WM8978_LINEIN_Gain(0); //¹Ø±ÕLINE IN if(auxen)WM8978_AUX_Gain(7);//AUX 6dBÔöÒæ else WM8978_AUX_Gain(0);
//¹Ø±ÕAUXÊäÈë
u16 regval=0;
if(dacen)regval|=1<<0; //DACÊä³öʹÄÜ if(bpsen) { }
WM8978_Write_Reg(50,regval);//R50ÉèÖÃ WM8978_Write_Reg(51,regval);//R51ÉèÖÃ
regval|=1<<1; regval|=5<<2;
//BYPASSʹÄÜ //0dBÔöÒæ
//WM8978 MICÔöÒæÉèÖÃ(²»°üÀ¨BOOSTµÄ20dB,MIC-->ADCÊäÈ벿·ÖµÄÔöÒæ) //gain:0~63,¶ÔÓ¦-12dB~35.25dB,0.75dB/Step void WM8978_MIC_Gain(u8 gain) { }
//WM8978 L2/R2(Ò²¾ÍÊÇLine In)ÔöÒæÉèÖÃ(L2/R2-->ADCÊäÈ벿·ÖµÄÔöÒæ) //gain:0~7,0±íʾͨµÀ½ûÖ¹,1~7,¶ÔÓ¦-12dB~6dB,3dB/Step void WM8978_LINEIN_Gain(u8 gain) {
u16 regval; gain&=0X07;
regval=WM8978_Read_Reg(47); //¶ÁÈ¡R47 regval&=~(7<<4);
//Çå³ýÔÀ´µÄÉèÖÃ
gain&=0X3F;
WM8978_Write_Reg(45,gain);
//R45,×óͨµÀPGAÉèÖÃ
WM8978_Write_Reg(46,gain|1<<8); //R46,ÓÒͨµÀPGAÉèÖÃ
WM8978_Write_Reg(47,regval|gain<<4);//ÉèÖÃR47
regval=WM8978_Read_Reg(48); //¶ÁÈ¡R48 regval&=~(7<<4);
//Çå³ýÔÀ´µÄÉèÖÃ
WM8978_Write_Reg(48,regval|gain<<4);//ÉèÖÃR48 }
//WM8978 AUXR,AUXL(PWMÒôƵ²¿·Ö)ÔöÒæÉèÖÃ(AUXR/L-->ADCÊäÈ벿·ÖµÄÔöÒæ) //gain:0~7,0±íʾͨµÀ½ûÖ¹,1~7,¶ÔÓ¦-12dB~6dB,3dB/Step void WM8978_AUX_Gain(u8 gain)
16
{
u16 regval; gain&=0X07;
regval=WM8978_Read_Reg(47); //¶ÁÈ¡R47 regval&=~(7<<0);
//Çå³ýÔÀ´µÄÉèÖÃ
WM8978_Write_Reg(47,regval|gain<<0);//ÉèÖÃR47
regval=WM8978_Read_Reg(48); //¶ÁÈ¡R48 regval&=~(7<<0);
//Çå³ýÔÀ´µÄÉèÖÃ
WM8978_Write_Reg(48,regval|gain<<0);//ÉèÖÃR48 }
//ÉèÖÃI2S¹¤×÷ģʽ
//fmt:0,LSB(ÓÒ¶ÔÆë);1,MSB(×ó¶ÔÆë);2,·ÉÀûÆÖ±ê×¼I2S;3,PCM/DSP; //len:0,16λ;1,20λ;2,24λ;3,32λ; void WM8978_I2S_Cfg(u8 fmt,u8 len) {
fmt&=0X03;
len&=0X03;//ÏÞ¶¨·¶Î§
WM8978_Write_Reg(4,(fmt<<3)|(len<<5)); //R4,WM8978¹¤×÷ģʽÉèÖÃ
}
//ÉèÖöú»ú×óÓÒÉùµÀÒôÁ¿ //voll:×óÉùµÀÒôÁ¿(0~63) //volr:ÓÒÉùµÀÒôÁ¿(0~63)
void WM8978_HPvol_Set(u8 voll,u8 volr)
17
{
voll&=0X3F;
volr&=0X3F;//ÏÞ¶¨·¶Î§
if(voll==0)voll|=1<<6;//ÒôÁ¿Îª0ʱ,Ö±½Ómute if(volr==0)volr|=1<<6;//ÒôÁ¿Îª0ʱ,Ö±½Ómute WM8978_Write_Reg(52,voll);
//R52,¶ú»ú×óÉùµÀÒôÁ¿ÉèÖÃ
WM8978_Write_Reg(53,volr|(1<<8)); //R53,¶ú»úÓÒÉùµÀÒôÁ¿ÉèÖÃ,ͬ²½¸üÐÂ(HPVU=1)
}
//ÉèÖÃÀ®°ÈÒôÁ¿
//voll:×óÉùµÀÒôÁ¿(0~63) void WM8978_SPKvol_Set(u8 volx) {
volx&=0X3F;//ÏÞ¶¨·¶Î§
if(volx==0)volx|=1<<6;//ÒôÁ¿Îª0ʱ,Ö±½Ómute
//R54,À®°È×óÉùµÀÒôÁ¿ÉèÖÃ
WM8978_Write_Reg(54,volx);
WM8978_Write_Reg(55,volx|(1<<8)); //R55,À®°ÈÓÒÉùµÀÒôÁ¿ÉèÖÃ,ͬ²½¸üÐÂ(SPKVU=1)
}
//ÉèÖÃ3D»·ÈÆÉù
//depth:0~15(3DÇ¿¶È,0×îÈõ,15×îÇ¿) void WM8978_3D_Set(u8 depth) {
depth&=0XF;//ÏÞ¶¨·¶Î§
WM8978_Write_Reg(41,depth); //R41,3D»·ÈÆÉèÖÃ
18
}
//ÉèÖÃEQ/3D×÷Ó÷½Ïò //dir:0,ÔÚADCÆð×÷Óà // 1,ÔÚDACÆð×÷ÓÃ(ĬÈÏ) void WM8978_EQ_3D_Dir(u8 dir) {
u16 regval;
regval=WM8978_Read_Reg(0X12); if(dir)regval|=1<<8; else regval&=~(1<<8);
WM8978_Write_Reg(18,regval);//R18,EQ1µÄµÚ9λ¿ØÖÆEQ/3D·½Ïò }
//ÉèÖÃEQ1
//cfreq:½ØÖ¹ÆµÂÊ,0~3,·Ö±ð¶ÔÓ¦:80/105/135/175Hz //gain:ÔöÒæ,0~24,¶ÔÓ¦-12~+12dB void WM8978_EQ1_Set(u8 cfreq,u8 gain) {
u16 regval;
cfreq&=0X3;//ÏÞ¶¨·¶Î§ if(gain>24)gain=24; gain=24-gain;
regval=WM8978_Read_Reg(18); regval&=0X100;
regval|=cfreq<<5; //ÉèÖýØÖ¹ÆµÂÊ
19
regval|=gain; //ÉèÖÃÔöÒæ
WM8978_Write_Reg(18,regval);//R18,EQ1ÉèÖÃ }
//ÉèÖÃEQ2
//cfreq:ÖÐÐÄÆµÂÊ,0~3,·Ö±ð¶ÔÓ¦:230/300/385/500Hz //gain:ÔöÒæ,0~24,¶ÔÓ¦-12~+12dB void WM8978_EQ2_Set(u8 cfreq,u8 gain) {
u16 regval=0;
cfreq&=0X3;//ÏÞ¶¨·¶Î§ if(gain>24)gain=24; gain=24-gain;
regval|=cfreq<<5; //ÉèÖýØÖ¹ÆµÂÊ regval|=gain;
//ÉèÖÃÔöÒæ
WM8978_Write_Reg(19,regval);//R19,EQ2ÉèÖÃ }
//ÉèÖÃEQ3
//cfreq:ÖÐÐÄÆµÂÊ,0~3,·Ö±ð¶ÔÓ¦:650/850/1100/1400Hz //gain:ÔöÒæ,0~24,¶ÔÓ¦-12~+12dB void WM8978_EQ3_Set(u8 cfreq,u8 gain) {
u16 regval=0;
cfreq&=0X3;//ÏÞ¶¨·¶Î§ if(gain>24)gain=24;
20
gain=24-gain;
regval|=cfreq<<5; //ÉèÖýØÖ¹ÆµÂÊ regval|=gain;
//ÉèÖÃÔöÒæ
WM8978_Write_Reg(20,regval);//R20,EQ3ÉèÖÃ }
//ÉèÖÃEQ4
//cfreq:ÖÐÐÄÆµÂÊ,0~3,·Ö±ð¶ÔÓ¦:1800/2400/3200/4100Hz //gain:ÔöÒæ,0~24,¶ÔÓ¦-12~+12dB void WM8978_EQ4_Set(u8 cfreq,u8 gain) {
u16 regval=0;
cfreq&=0X3;//ÏÞ¶¨·¶Î§ if(gain>24)gain=24; gain=24-gain;
regval|=cfreq<<5; //ÉèÖýØÖ¹ÆµÂÊ regval|=gain;
//ÉèÖÃÔöÒæ
WM8978_Write_Reg(21,regval);//R21,EQ4ÉèÖÃ }
//ÉèÖÃEQ5
//cfreq:ÖÐÐÄÆµÂÊ,0~3,·Ö±ð¶ÔÓ¦:5300/6900/9000/11700Hz //gain:ÔöÒæ,0~24,¶ÔÓ¦-12~+12dB void WM8978_EQ5_Set(u8 cfreq,u8 gain) {
u16 regval=0;
21
cfreq&=0X3;//ÏÞ¶¨·¶Î§ if(gain>24)gain=24; gain=24-gain;
regval|=cfreq<<5; //ÉèÖýØÖ¹ÆµÂÊ regval|=gain;
//ÉèÖÃÔöÒæ
WM8978_Write_Reg(22,regval);//R22,EQ5ÉèÖÃ }
Main.c´úÂë #include \#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \ #include \#include \
22
//ALIENTEK ̽Ë÷ÕßSTM32F407¿ª·¢°å ʵÑé43 //ÒôÀÖ²¥·ÅÆ÷ ʵÑé -¿âº¯Êý°æ±¾ //¼¼ÊõÖ§³Ö£ºwww.openedv.com
//ÌÔ±¦µêÆÌ£ºhttp://eboard.taobao.com //¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾ //×÷ÕߣºÕýµãÔ×Ó @ALIENTEK int main(void) { delay_init(168);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//ÉèÖÃϵͳÖжÏÓÅÏȼ¶·Ö×é2
//³õʼ»¯ÑÓʱº¯Êý uart_init(115200); LED_Init();
//³õʼ»¯´®¿Ú²¨ÌØÂÊΪ115200
//³õʼ»¯LED
//³õʼ»¯USMART //LCD³õʼ»¯ //°´¼ü³õʼ»¯ //³õʼ»¯W25Q128 //³õʼ»¯WM8978 //¶ú»úÒôÁ¿ÉèÖà //À®°ÈÒôÁ¿ÉèÖà //³õʼ»¯ÄÚ²¿ÄÚ´æ³Ø //³õʼ»¯CCMÄÚ´æ³Ø
//ΪfatfsÏà¹Ø±äÁ¿ÉêÇëÄÚ´æ //¹ÒÔØSD¿¨
23
usmart_dev.init(84);
LCD_Init(); KEY_Init();
W25QXX_Init(); WM8978_Init();
WM8978_HPvol_Set(40,40); WM8978_SPKvol_Set(60); my_mem_init(SRAMIN);
my_mem_init(SRAMCCM); exfuns_init();
f_mount(fs[0],\
POINT_COLOR=BLACK; while(font_init()) {
LCD_ShowString(30,50,200,16,16,\delay_ms(200);
//¼ì²é×Ö¿â
LCD_Fill(30,50,240,66,WHITE);//Çå³ýÏÔʾ delay_ms(200);
}
POINT_COLOR=BLACK;
Show_Str(60,50,200,16,\¿ª·¢°å\ }
Show_Str(60,70,200,16,\
Show_Str(60,90,200,16,\ʵÑéÕߣº³Â±ó£¬½¯Îľê\
Show_Str(60,130,200,16,\ÏÂÒ»Ê× KEY2:ÉÏÒ»Ê×\Show_Str(60,150,200,16,\while(1) { }
audio_play();
24
3.5ÏÂÔØÑéÖ¤
ËÄ¡¢ÐĵÃÌå»á
ͨ¹ý±¾´ÎʵÑ飬Ö÷ҪѧϰÁË WAV ¸ñʽÒôƵ²¥·ÅÔÀí¡¢Êý×ÖÒôƵ½Ó¿Ú¼° IIS ×ÜÏß½Ó ¿ÚµÄÏà¹ØÖªÊ¶¡£Á˽âÁËÄ£ÄâÒôƵÐźźÍÊý×ÖÒôƵÐźŵĸÅÄî¡£ÕÆÎÕÁ˱àдÒôƵ²¥·ÅÆ÷µÄ·½·¨²¢ÇÒʵÏÖÁËÒôƵ²¥·Å¡£±¾ÏµÍ³Äܹ»Ö§³Ö´¥ÃþÆÁ²Ù×÷£¬ÏÔʾ¸è´ÊµÈ¹¦ÄÜ¡£
´Ë´ÎµÄ¿Î³ÌÉè¼ÆÊ¹ÎÒÕÆÎÕÄÇЩ×Ô¼º²»ÊìϤµÄÓ²¼þÏà¹ØµÄ֪ʶµã£¬×öÒ»¸ö¿Î³ÌÉè¼Æ»¹ÐèҪעÒâºÜ¶à·½Ã棬ÎÞÂÛÊǸñʽ£¬»¹ÊÇÊéдµÄÄÚÈݺÍÒª±í´ïµÄ˼Ïë¶¼µÃÑϸñÒªÇó×Ô¼º£¬ËùÒÔ×öÆðÀ´ÕæµÄ²»ËãÈÝÒס£µ«ÔÚ½â¾öÎÊÌâµÄ¹ý³ÌÖлáÓгɾ͸У¬Ò²»á¿´µ½×Ô¼ºµÄ²»×㣬ÔÚÒÔºóµÄѧϰÖУ¬Îһ᲻¶ÏµÄÍêÉÆ×ÔÎÒ£¬²»¶Ï½øÈ¡£¬ÄÜʹ×Ô¼ºÔÚ±à³ÌÕâ·½ÃæÓÐÒ»¸ö´óµÄ·¢Õ¹¡£
25