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

📄 demo.c

📁 MC2300 USBAUDIO PROGRAM. FLASH UPLOAD AND CONNECT USB OPEN MP3.
💻 C
字号:
/*----------------------------------------------------------------------------
 *      Name:    DEMO.C
 *      Purpose: USB Audio Demo
 *      Version: V1.10
 *----------------------------------------------------------------------------
 *      This file is part of the uVision/ARM development tools.
 *      This software may only be used under the terms of a valid, current,
 *      end user licence from KEIL for a compatible version of KEIL software
 *      development tools. Nothing else gives you the right to use it.
 *
 *      Copyright (c) 2005-2007 Keil Software.
 *---------------------------------------------------------------------------*/

#include <LPC23XX.H>                        /* LPC23xx definitions */

#include "type.h"

#include "usb.h"
#include "usbcfg.h"
#include "usbhw.h"
#include "usbcore.h"

#include "demo.h"
#include "LCD.h"


BYTE  Mute;                                 /* Mute State */
DWORD Volume;                               /* Volume Level */

#if USB_DMA
#pragma arm section zidata = "USB_RAM"
DWORD InfoBuf[P_C];                         /* Packet Info Buffer */
short DataBuf[B_S];                         /* Data Buffer */
#pragma arm section zidata
#else
short DataBuf[B_S];                         /* Data Buffer */
#endif

WORD  DataOut;                              /* Data Out Index */
WORD  DataIn;                               /* Data In Index */

BYTE  DataRun;                              /* Data Stream Run State */

WORD  PotVal;                               /* Potenciometer Value */

DWORD VUM;                                  /* VU Meter */

DWORD Tick;                                 /* Time Tick */


/*
 * Get Potenciometer Value
 */

void get_potval (void) {
  DWORD val;

  AD0CR |= 0x01000000;                      /* Start A/D Conversion */
  do {
    val  = AD0GDR;                          /* Read A/D Data Register */
  } while ((val & 0x80000000) == 0);        /* Wait for end of A/D Conversion */
  AD0CR &= ~0x01000000;                     /* Stop A/D Conversion */
  PotVal = ((val >> 8) & 0xF8) +            /* Extract Potenciometer Value */
           ((val >> 7) & 0x08);
}


/*
 * Timer Counter 0 Interrupt Service Routine
 *   executed each 31.25us (32kHz frequency)
 */

short Uckagt[31000],k=0,i=0,j=0;
void tc0_isr (void) __irq {
  long  val;
  DWORD cnt;
  if(k>30000){DataRun=1;++j;if(j<1)return; j=0;}		
  if(i>30000)i=0;
  if (DataRun) {                            /* Data Stream is running */
    if(k>30000){val=Uckagt[i];++i;}
	else {val = DataBuf[DataOut];                 /* Get Audio Sample */
    Uckagt[k]=val;++k;}
	cnt = (DataIn - DataOut) & (B_S - 1);   /* Buffer Data Count */
    if (cnt == (B_S - P_C*P_S)) {           /* Too much Data in Buffer */
      DataOut++;                            /* Skip one Sample */
    }
    if (cnt > (P_C*P_S)) {                  /* Still enough Data in Buffer */
      DataOut++;                            /* Update Data Out Index */
    }
    DataOut &= B_S - 1;                     /* Adjust Buffer Out Index */
    if (val < 0) VUM -= val;                /* Accumulate Neg Value */
    else         VUM += val;                /* Accumulate Pos Value */
    val  *= Volume;                         /* Apply Volume Level */
    val >>= 16;                             /* Adjust Value */
    val  += 0x8000;                         /* Add Bias */
    val  &= 0xFFFF;                         /* Mask Value */
  } else {
    val = 0x8000;                           /* DAC Middle Point */
  }

  if (Mute) {
    val = 0x8000;                           /* DAC Middle Point */
  }

  DACR = val & 0xFFC0;                      /* Set Speaker Output */

  if ((Tick++ & 0x03FF) == 0) {             /* On every 1024th Tick */
    get_potval();                           /* Get Potenciometer Value */
    if (VolCur == 0x8000) {                 /* Check for Minimum Level */
      Volume = 0;                           /* No Sound */
    } else {
      Volume = VolCur * PotVal;             /* Chained Volume Level */
    }
    val = VUM >> 20;                        /* Scale Accumulated Value */
    VUM = 0;                                /* Clear VUM */
    if (val > 7) val = 7;                   /* Limit Value */
    FIO2CLR = LEDMSK;                       /* Turn Off all LEDs */
    FIO2SET = LEDMSK >> (7 - val);          /* LEDs show VU Meter */
  }

  T0IR = 1;                                 /* Clear Interrupt Flag */
  VICVectAddr = 0;                          /* Acknowledge Interrupt */
}


/* Main Program */

int main (void) {

  PINSEL10 = 0;                             /* Disable ETM interface */
  PINSEL1 = 0x00204000;                     /* Select AOUT,AIN0 */
  FIO2DIR  = LEDMSK;                        /* LEDs, port 2, bit 0~7 output only */

  PCONP  |= (1 << 12);                      /* Enable power to AD block    */
  AD0CR   = 0x00200E01;                     /* ADC: 10-bit AIN0 @ 4MHz */
  DACR    = 0x00008000;                     /* DAC Output set to Middle Point */

  /* Setup Timer Counter 0: Periodic Timer with Interrupt at DATA_FREQ Rate */
  T0MR0 = VPB_CLOCK/DATA_FREQ - 1;          /* TC0 Match Value 0 */
  T0MCR = 3;                                /* TCO Interrupt and Reset on MR0 */
  T0TCR = 1;                                /* TC0 Enable */

  /* Setup Timer Counter 0 Interrupt */
  VICVectAddr4 = (unsigned long)tc0_isr;    /* TC0 Interrupt -> Vector 4   */
  VICVectCntl4 = 0x02;                      /* TC0 Interrupt -> Priority 2 */
  VICIntEnable = 1 << 4;                    /* Enable TC0 Interrupt */

  lcd_init();
  lcd_clear();
  lcd_print (" MCB2300  Audio ");
  set_cursor (0, 1);
  lcd_print ("  www.keil.com  ");

  USB_Init();                               /* USB Initialization */
  USB_Connect(TRUE);                        /* USB Connect */

  while (1);                                /* Loop forever */
}

⌨️ 快捷键说明

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