These are the examples provided for [[/users/frank26080115/libraries/LPC1700CMSIS_Lib/]] Note, the entire "program" is not compilable!
Diff: USBDEV/USBAudio/usbdmain.c
- Revision:
- 0:bf7b9fba3924
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDEV/USBAudio/usbdmain.c Sun Mar 20 05:38:56 2011 +0000 @@ -0,0 +1,178 @@ +/*---------------------------------------------------------------------------- + * Name: usbmain.c + * Purpose: USB Audio Class Demo + * Version: V1.20 + *---------------------------------------------------------------------------- + * This software is supplied "AS IS" without any warranties, express, + * implied or statutory, including but not limited to the implied + * warranties of fitness for purpose, satisfactory quality and + * noninfringement. Keil extends you a royalty-free right to reproduce + * and distribute executable files created using this software for use + * on NXP Semiconductors LPC microcontroller devices only. Nothing else + * gives you the right to use this software. + * + * Copyright (c) 2009 Keil - An ARM Company. All rights reserved. + *---------------------------------------------------------------------------*/ + +#include "LPC17xx.h" /* LPC17xx definitions */ +#include "lpc_types.h" + +#include "usb.h" +#include "usbcfg.h" +#include "usbhw.h" +#include "usbcore.h" +#include "usbaudio.h" + +/* Example group ----------------------------------------------------------- */ +/** @defgroup USBDEV_USBAudio USBAudio + * @ingroup USBDEV_Examples + * @{ + */ +uint8_t Mute; /* Mute State */ +uint32_t Volume; /* Volume Level */ + +#if USB_DMA +uint32_t *InfoBuf = (uint32_t *)(DMA_BUF_ADR); +short *DataBuf = (short *)(DMA_BUF_ADR + 4*P_C); +#else +uint32_t InfoBuf[P_C]; +short DataBuf[B_S]; /* Data Buffer */ +#endif + +uint16_t DataOut; /* Data Out Index */ +uint16_t DataIn; /* Data In Index */ + +uint8_t DataRun; /* Data Stream Run State */ +uint16_t PotVal; /* Potenciometer Value */ +uint32_t VUM; /* VU Meter */ +uint32_t Tick; /* Time Tick */ + + +/* + * Get Potenciometer Value + */ + +void get_potval (void) { + uint32_t val; + + LPC_ADC->ADCR |= 0x01000000; /* Start A/D Conversion */ + do { + val = LPC_ADC->ADGDR; /* Read A/D Data Register */ + } while ((val & 0x80000000) == 0); /* Wait for end of A/D Conversion */ + LPC_ADC->ADCR &= ~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) + */ + +void TIMER0_IRQHandler(void) +{ + long val; + uint32_t cnt; + + if (DataRun) { /* Data Stream is running */ + val = DataBuf[DataOut]; /* Get Audio Sample */ + 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 */ + } + + LPC_DAC->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 */ + } + + LPC_TIM0->IR = 1; /* Clear Interrupt Flag */ +} + + + +/***************************************************************************** +** Main Function main() +******************************************************************************/ +int main (void) +{ + volatile uint32_t pclkdiv, pclk; + +// SystemInit(); + + LPC_PINCON->PINSEL1 &=~((0x03<<18)|(0x03<<20)); + /* P0.25, A0.0, function 01, P0.26 AOUT, function 10 */ + LPC_PINCON->PINSEL1 |= ((0x01<<18)|(0x02<<20)); + + /* Enable CLOCK into ADC controller */ + LPC_SC->PCONP |= (1 << 12); + + LPC_ADC->ADCR = 0x00200E04; /* ADC: 10-bit AIN2 @ 4MHz */ + LPC_DAC->DACR = 0x00008000; /* DAC Output set to Middle Point */ + + /* By default, the PCLKSELx value is zero, thus, the PCLK for + all the peripherals is 1/4 of the SystemFrequency. */ + /* Bit 2~3 is for TIMER0 */ + pclkdiv = (LPC_SC->PCLKSEL0 >> 2) & 0x03; + switch ( pclkdiv ) + { + case 0x00: + default: + pclk = SystemCoreClock/4; + break; + case 0x01: + pclk = SystemCoreClock; + break; + case 0x02: + pclk = SystemCoreClock/2; + break; + case 0x03: + pclk = SystemCoreClock/8; + break; + } + + LPC_TIM0->MR0 = pclk/DATA_FREQ - 1; /* TC0 Match Value 0 */ + LPC_TIM0->MCR = 3; /* TCO Interrupt and Reset on MR0 */ + LPC_TIM0->TCR = 1; /* TC0 Enable */ + NVIC_EnableIRQ(TIMER0_IRQn); + + USB_Init(); /* USB Initialization */ + USB_Connect(TRUE); /* USB Connect */ + + /********* The main Function is an endless loop ***********/ + while( 1 ); +} + +/****************************************************************************** +** End Of File +******************************************************************************/ +/* + * @} + */