Added Function to power down magic USB interface chip with new firmware Download firmware here http://mbed.org/users/simon/notebook/interface-powerdown/ http://mbed.org/media/uploads/simon/mbedmicrocontroller_experimentalpowerdown.if You need to power the mbed by vin or usb board such as cool components http://mbed.org/cookbook/Cool-Components-Workshop-Board Hello my name is guitar reverse me and it is karaoke time
main.cpp@0:f2733793d0fd, 2011-07-20 (annotated)
- Committer:
- mbed2f
- Date:
- Wed Jul 20 05:45:03 2011 +0000
- Revision:
- 0:f2733793d0fd
Added Function to power down magic USB interface chip with new firmware
Hello my name is guitar reverse me and it is karaoke time
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mbed2f | 0:f2733793d0fd | 1 | #include <mbed.h> |
mbed2f | 0:f2733793d0fd | 2 | |
mbed2f | 0:f2733793d0fd | 3 | // Function to power down magic USB interface chip with new firmware |
mbed2f | 0:f2733793d0fd | 4 | #define USR_POWERDOWN (0x104) |
mbed2f | 0:f2733793d0fd | 5 | int semihost_powerdown() { |
mbed2f | 0:f2733793d0fd | 6 | uint32_t arg; |
mbed2f | 0:f2733793d0fd | 7 | return __semihost(USR_POWERDOWN, &arg); |
mbed2f | 0:f2733793d0fd | 8 | } |
mbed2f | 0:f2733793d0fd | 9 | |
mbed2f | 0:f2733793d0fd | 10 | // If you don't need the PC host USB interface.... |
mbed2f | 0:f2733793d0fd | 11 | // Power down magic USB interface chip - saves around 150mW |
mbed2f | 0:f2733793d0fd | 12 | // Needs new firmware (URL below) and USB cable not connected |
mbed2f | 0:f2733793d0fd | 13 | // http://mbed.org/users/simon/notebook/interface-powerdown/ |
mbed2f | 0:f2733793d0fd | 14 | // Supply power to mbed using Vin pin |
mbed2f | 0:f2733793d0fd | 15 | |
mbed2f | 0:f2733793d0fd | 16 | |
mbed2f | 0:f2733793d0fd | 17 | // Boolean types |
mbed2f | 0:f2733793d0fd | 18 | #define TRUE 1 |
mbed2f | 0:f2733793d0fd | 19 | #define FALSE 0 |
mbed2f | 0:f2733793d0fd | 20 | |
mbed2f | 0:f2733793d0fd | 21 | //#define NUM_SAMPLES 48000 |
mbed2f | 0:f2733793d0fd | 22 | /* ADC for the microphone/input, DAC for the speaker/output */ |
mbed2f | 0:f2733793d0fd | 23 | AnalogIn mic(p19); |
mbed2f | 0:f2733793d0fd | 24 | AnalogOut speaker(p18); |
mbed2f | 0:f2733793d0fd | 25 | |
mbed2f | 0:f2733793d0fd | 26 | // Allocate a buffer to be used for the audio recording |
mbed2f | 0:f2733793d0fd | 27 | static const size_t BufferSize = 15 * 1066; |
mbed2f | 0:f2733793d0fd | 28 | static unsigned short Buffer[BufferSize]; |
mbed2f | 0:f2733793d0fd | 29 | //int16_t Buffer[ 32768]; |
mbed2f | 0:f2733793d0fd | 30 | //unsigned short Buffer[NUM_SAMPLES]; |
mbed2f | 0:f2733793d0fd | 31 | |
mbed2f | 0:f2733793d0fd | 32 | |
mbed2f | 0:f2733793d0fd | 33 | int main(void) |
mbed2f | 0:f2733793d0fd | 34 | { |
mbed2f | 0:f2733793d0fd | 35 | |
mbed2f | 0:f2733793d0fd | 36 | int result; |
mbed2f | 0:f2733793d0fd | 37 | result = semihost_powerdown(); |
mbed2f | 0:f2733793d0fd | 38 | //int i; |
mbed2f | 0:f2733793d0fd | 39 | // for (i = 0; ; ) |
mbed2f | 0:f2733793d0fd | 40 | |
mbed2f | 0:f2733793d0fd | 41 | { unsigned short ReadSample = 0xFFFF; |
mbed2f | 0:f2733793d0fd | 42 | // Indices to track where the playback and recording should take place in the |
mbed2f | 0:f2733793d0fd | 43 | // audio buffer. The recording can occur one sample behind the current playback |
mbed2f | 0:f2733793d0fd | 44 | // index since it is no longer required. |
mbed2f | 0:f2733793d0fd | 45 | int Index = 0; |
mbed2f | 0:f2733793d0fd | 46 | // Reverse the direction the buffer is walked between each iteration to save memory |
mbed2f | 0:f2733793d0fd | 47 | int Direction = 1; |
mbed2f | 0:f2733793d0fd | 48 | // Have audio to playback |
mbed2f | 0:f2733793d0fd | 49 | int Playback = FALSE; |
mbed2f | 0:f2733793d0fd | 50 | // The amount of data to be recorded before starting reverse playback |
mbed2f | 0:f2733793d0fd | 51 | // NOTE: Probably want this to be configured at runtime via a knob, etc. |
mbed2f | 0:f2733793d0fd | 52 | //int ChunkSize = 9024; |
mbed2f | 0:f2733793d0fd | 53 | int ChunkSize = BufferSize; |
mbed2f | 0:f2733793d0fd | 54 | // Infinite loop of recording and reverse playback |
mbed2f | 0:f2733793d0fd | 55 | for (;;) |
mbed2f | 0:f2733793d0fd | 56 | { |
mbed2f | 0:f2733793d0fd | 57 | unsigned short PlaySample; |
mbed2f | 0:f2733793d0fd | 58 | |
mbed2f | 0:f2733793d0fd | 59 | // Read out the sample from the buffer to be played back |
mbed2f | 0:f2733793d0fd | 60 | if (Playback) |
mbed2f | 0:f2733793d0fd | 61 | { |
mbed2f | 0:f2733793d0fd | 62 | PlaySample = Buffer[Index]; |
mbed2f | 0:f2733793d0fd | 63 | speaker.write_u16(PlaySample); |
mbed2f | 0:f2733793d0fd | 64 | //i = (i+0) % NUM_SAMPLES; |
mbed2f | 0:f2733793d0fd | 65 | |
mbed2f | 0:f2733793d0fd | 66 | //wait(0.2f); |
mbed2f | 0:f2733793d0fd | 67 | } |
mbed2f | 0:f2733793d0fd | 68 | |
mbed2f | 0:f2733793d0fd | 69 | // Obtain current audio sample from the A/D converter. |
mbed2f | 0:f2733793d0fd | 70 | // NOTE: I am just faking these values in this sample with an incrementing value |
mbed2f | 0:f2733793d0fd | 71 | ReadSample = mic.read_u16(); |
mbed2f | 0:f2733793d0fd | 72 | |
mbed2f | 0:f2733793d0fd | 73 | // Record the sample into the buffer right where a space was freed up from the PlaySample read above |
mbed2f | 0:f2733793d0fd | 74 | Buffer[Index] = ReadSample += mic.read_u16(); |
mbed2f | 0:f2733793d0fd | 75 | |
mbed2f | 0:f2733793d0fd | 76 | // Increment the buffer pointer |
mbed2f | 0:f2733793d0fd | 77 | Index += Direction; |
mbed2f | 0:f2733793d0fd | 78 | |
mbed2f | 0:f2733793d0fd | 79 | // Check to see if the chunk has been filled |
mbed2f | 0:f2733793d0fd | 80 | if (Index < 0) |
mbed2f | 0:f2733793d0fd | 81 | { |
mbed2f | 0:f2733793d0fd | 82 | // Now have a chunk to be played back |
mbed2f | 0:f2733793d0fd | 83 | Playback = TRUE; |
mbed2f | 0:f2733793d0fd | 84 | // Reverse the direction of playback and recording |
mbed2f | 0:f2733793d0fd | 85 | Direction *= -1; |
mbed2f | 0:f2733793d0fd | 86 | Index = 0; |
mbed2f | 0:f2733793d0fd | 87 | } |
mbed2f | 0:f2733793d0fd | 88 | else if (Index >= ChunkSize) |
mbed2f | 0:f2733793d0fd | 89 | { |
mbed2f | 0:f2733793d0fd | 90 | // Now have a chunk to be played back |
mbed2f | 0:f2733793d0fd | 91 | Playback = TRUE; |
mbed2f | 0:f2733793d0fd | 92 | // Reverse the direction of playback and recording |
mbed2f | 0:f2733793d0fd | 93 | Direction *= -1; |
mbed2f | 0:f2733793d0fd | 94 | Index = ChunkSize - 1; |
mbed2f | 0:f2733793d0fd | 95 | } |
mbed2f | 0:f2733793d0fd | 96 | } |
mbed2f | 0:f2733793d0fd | 97 | } |
mbed2f | 0:f2733793d0fd | 98 | } |