AUTHOR......: David Rowe\r
DATE CREATED: 30 May 2014\r
\r
- Records a 16 kHz sample rate raw file from the STM32F4 ADC Pin PA1.\r
+ Records a 16 kHz sample rate raw file from one of the ADC channels.\r
+ Note the semi-hosting system isn't fast enough to transfer 2 16 kHz\r
+ streams at once.\r
+ \r
+ ~/stlink$ sudo ./st-util -f ~/codec2-dev/stm32/adc_rec.elf\r
+ ~/codec2-dev/stm32$ ~/gcc-arm-none-eabi-4_7-2013q1/bin/arm-none-eabi-gdb adc_rec.elf\r
+ \r
+ (when finished) \r
+ $ play -r 16000 -s -2 ~/stlink/adc.raw\r
+\r
+ adc1 -> "from radio" \r
+ adc2 -> "mic amp"\r
\r
\*---------------------------------------------------------------------------*/\r
\r
#include <stdlib.h>\r
#include "stm32f4_adc.h"\r
#include "gdb_stdio.h"\r
+#include "stm32f4xx_gpio.h"\r
\r
#define REC_TIME_SECS 10\r
#define N (ADC_BUF_SZ*6)\r
#define FS 16000\r
\r
+extern int adc_overflow1;\r
+extern int adc_overflow2;\r
+\r
int main(void){\r
short buf[N];\r
- FILE *frec;\r
+ FILE *fadc;\r
int i, bufs;\r
\r
- adc_open(2*N);\r
-\r
- frec = fopen("stm_out.raw", "wb");\r
- if (frec == NULL) {\r
- printf("Error opening input file: stm_out.raw\n\nTerminating....\n");\r
+ fadc = fopen("adc.raw", "wb");\r
+ if (fadc == NULL) {\r
+ printf("Error opening input file: adc.raw\n\nTerminating....\n");\r
exit(1);\r
}\r
bufs = FS*REC_TIME_SECS/N;\r
\r
printf("Starting!\n");\r
+ adc_open(4*N);\r
+\r
for(i=0; i<bufs; i++) {\r
- while(adc1_read(buf, N) == -1);\r
- fwrite(buf, sizeof(short), N, frec); \r
- printf(".\n");\r
+ while(adc2_read(buf, N) == -1);\r
+ fwrite(buf, sizeof(short), N, fadc); \r
+ printf("adc_overflow1: %d adc_overflow2: %d \n", adc_overflow1, adc_overflow2);\r
}\r
- fclose(frec);\r
+ fclose(fadc);\r
+\r
printf("Finished!\n");\r
}\r
#include "debugblinky.h"
struct FIFO *adc1_fifo;
+struct FIFO *adc2_fifo;
unsigned short adc_buf[ADC_BUF_SZ];
-int adc_overflow;
+int adc_overflow1, adc_overflow2;
int half,full;
#define ADCx_DR_ADDRESS ((uint32_t)0x4001204C)
void adc_open(int fifo_sz) {
adc1_fifo = fifo_create(fifo_sz);
assert(adc1_fifo != NULL);
+ adc2_fifo = fifo_create(fifo_sz);
+ assert(adc2_fifo != NULL);
tim2_config();
adc_configure();
return fifo_read(adc1_fifo, buf, n);
}
+/* n signed 16 bit samples in buf[] if return != -1 */
+
+int adc2_read(short buf[], int n) {
+ return fifo_read(adc2_fifo, buf, n);
+}
+
static void tim2_config(void)
{
ADC_init_structure.ADC_ContinuousConvMode = DISABLE;
ADC_init_structure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_TRGO;
ADC_init_structure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
- ADC_init_structure.ADC_NbrOfConversion = 1;
- ADC_init_structure.ADC_ScanConvMode = DISABLE;
+ ADC_init_structure.ADC_NbrOfConversion = 2;
+ ADC_init_structure.ADC_ScanConvMode = ENABLE;
ADC_Init(ADCx,&ADC_init_structure);
// Select the channel to be read from
ADC_RegularChannelConfig(ADCx,ADC_Channel_1,1,ADC_SampleTime_144Cycles);
+ ADC_RegularChannelConfig(ADCx,ADC_Channel_2,2,ADC_SampleTime_144Cycles);
//ADC_VBATCmd(ENABLE);
/* DMA configuration **************************************/
*/
void DMA2_Stream0_IRQHandler(void) {
- int i, sam;
- short signed_buf[ADC_BUF_SZ/2];
+ int i, j, sam;
+ short signed_buf1[ADC_BUF_SZ/2];
+ short signed_buf2[ADC_BUF_SZ/2];
GPIOE->ODR = (1 << 0);
/* convert to signed */
- for(i=0; i<ADC_BUF_SZ/2; i++) {
+ for(i=0, j=0; i<ADC_BUF_SZ/2; i+=2,j++) {
sam = (int)adc_buf[i] - 32768;
- signed_buf[i] = sam;
+ signed_buf1[j] = sam;
+ sam = (int)adc_buf[i+1] - 32768;
+ signed_buf2[j] = sam;
}
+ /* write first half to fifo */
- /* write first half to fifo */
-
- if (fifo_write(adc1_fifo, signed_buf, ADC_BUF_SZ/2) == -1) {
- adc_overflow++;
+ if (fifo_write(adc1_fifo, signed_buf1, ADC_BUF_SZ/4) == -1) {
+ adc_overflow1++;
+ }
+ if (fifo_write(adc2_fifo, signed_buf2, ADC_BUF_SZ/4) == -1) {
+ adc_overflow2++;
}
/* Clear DMA Stream Transfer Complete interrupt pending bit */
/* convert to signed */
- for(i=0; i<ADC_BUF_SZ/2; i++) {
+ for(i=0, j=0; i<ADC_BUF_SZ/2; i+=2,j++) {
sam = (int)adc_buf[ADC_BUF_SZ/2 + i] - 32768;
- signed_buf[i] = sam;
+ signed_buf1[j] = sam;
+ sam = (int)adc_buf[ADC_BUF_SZ/2 + i+1] - 32768;
+ signed_buf2[j] = sam;
}
/* write second half to fifo */
- if (fifo_write(adc1_fifo, signed_buf, ADC_BUF_SZ/2) == -1) {
- adc_overflow++;
+ if (fifo_write(adc1_fifo, signed_buf1, ADC_BUF_SZ/4) == -1) {
+ adc_overflow1++;
+ }
+ if (fifo_write(adc2_fifo, signed_buf2, ADC_BUF_SZ/4) == -1) {
+ adc_overflow2++;
}
/* Clear DMA Stream Transfer Complete interrupt pending bit */