STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Кто любит RISC в жизни, заходим, не стесняемся.
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Ребята помогите! Не могу воспроизвести wav с карточки.
Хочу сказать фразу по нажатию кнопки.
Карта читается.
Проблема то ли с ЦАП-ом, то ли выводом данных. В общем лыжи наглухо в асфальте.
Вот инит ЦАПа:

Код: Выделить всё

void Init_Sound(void)
{
        DAC_InitTypeDef DAC_InitStructure;
   DMA_InitTypeDef DMA_InitStructure;
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   GPIO_InitTypeDef           GPIO_InitStructure;
   
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC | RCC_APB1Periph_TIM6, ENABLE);
   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 ; 
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
   TIM_TimeBaseStructure.TIM_Period = 72-1;   //
   TIM_TimeBaseStructure.TIM_Prescaler = 0;
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);

   TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
   
   DMA_DeInit(DMA2_Channel3);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR8R1;     
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &WAVBuffer[0];
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
   DMA_InitStructure.DMA_BufferSize =512; 
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);

   DMA_Cmd(DMA2_Channel3, ENABLE);
   
   DAC_InitStructure.DAC_LFSRUnmask_TriangleAmplitude = 0;
   DAC_InitStructure.DAC_Trigger = DAC_Trigger_T6_TRGO;
   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
   DAC_Init(DAC_Channel_1, &DAC_InitStructure);

   DAC_Cmd(DAC_Channel_1, ENABLE);

   DAC_DMACmd(DAC_Channel_1, ENABLE);
   
   TIM_Cmd(TIM6, DISABLE);
}


Дальше в основном цикле.

Код: Выделить всё

if(Kn_a==1)    // Kn_a находится в прерывании
{
   Init_Sound();
   load_header();   // Здесь читаются заголовки WAV и настраивается таймер
   sound();
   Kn_a=0;
}

А вот с функцией sound(); наверное проблемы.

Код: Выделить всё

void sound(void)
{
   while(1)
      {
         TIM_Cmd(TIM6, ENABLE);
      while(!(DMA2->ISR & DMA_ISR_HTIF3)) {} 

     f_read (&fsrc, &WAVBuffer[0], 256, &rb);
       DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[0]);
   

     if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;} 

     while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}

     f_read (&fsrc, &WAVBuffer[256], 256, &rb);
       DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[256]);

     if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;}
       }
}

В динамике треск и писк.
В общем мозги кипят.
Прошу помощи, кто знает. Нужно проиграть мелодию с карточки.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение uk8amk »

1) Забейте в WAVBuffer[] табличку синуса и проиграйте с просмотром на осциллографе. Быть может вы неправильно разбираете чанки файла, а так вы убедитесь что хотя бы механизм преобразователя работает корректно.
2) Непонятен смысл вот этих строк:

Код: Выделить всё

DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[0]);
...
DAC_SetChannel1Data(DAC_Align_8b_R, WAVBuffer[256]);

Разве DMA не сделает тоже самое?
3)

Код: Выделить всё

     while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}  
     f_read (&fsrc, &WAVBuffer[0], 256, &rb);

Было бы логичнее сначала сделать загрузку полубуфера, а только потом ждать его освобождения.
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Табличку sin забивал. При 180 значениях синус красивый, но в нижних полуволнах какая то помеха есть.
Если значений меньше, то синус становится похожим на кривую пилу.

По поводу 2 и 3 пункта. Не пинайте сильно.
Прошу разъяснить как происходит вывод данных на динамик (ЦАП).
Прочитал кучу информации и в голове такая же куча.
В общем запутался.

Я так понимаю.
1. читаем данные в буфер (512 байт)
2. потом необходимо передать 256 байт цапу через ДМА
3. ждем какого то флага
4. дальше следующие 256
5. ждем какого то флага

Направте на путь истинный
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение uk8amk »

1. читаем данные в буфер (512 байт)

В общем да. Но если data chunk <=512 байт, то ой.

3. ждем какого то флага
В общем запутался.

Чтобы распутаться, необходимо прочитать ещё раз.
Если совсем кратко, то TIM6 пинает DMA, он передаёт очередное слово в DAC.

При 180 значениях синус красивый, но в нижних полуволнах какая то помеха есть.

Частично из-за этого:

Код: Выделить всё

DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

Но в любом случае при адекватных частотах синус должен быть синусоидальным.

Кстати, у вас какая реальная частота или период дискретизации для TIM6 получается?
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Возможно так.
Завтра попробую.
Есть некоторые непонятки с флагами.


Код: Выделить всё

while(1)    // DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data);
      {
         TIM_Cmd(TIM6, ENABLE);
         f_read (&fsrc, &WAVBuffer[0], 256, &rb);
         if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;}
         while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
         DMA2->IFCR |= DMA_ISR_HTIF3;
            
         f_read (&fsrc, &WAVBuffer[256], 256, &rb);
         if(rb < 256) {TIM_Cmd(TIM6, DISABLE); break;}
         while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
         DMA2->IFCR |= DMA_ISR_HTIF3;
                 }


По поводу TIM6:
При TIM_TimeBaseStructure.TIM_Period = 72-1; частота на выходе ~5.5кГц
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

В общем записал на карту синус (сформированный в программе Audacity 1кгц, 8 бит)
Начинаю читать, на экране осциллографа какой то кривой прямоугольник валит.
Вот настройка с выводом. Что не так? Прошу помощи.

Код: Выделить всё

void Init_Sound(void)
{   
/*   const uint16_t sinus_12bit[180]={
2048, 2119, 2191, 2262, 2333, 2404, 2474, 2543, 2613, 2681, 2748, 2815, 2881, 2946, 3009, 3072, 3133, 3193, 3252, 3309, 3364, 3418, 3471, 3521, 3570, 3617, 3662, 3705,
3746, 3785, 3822, 3856, 3889, 3919, 3947, 3972, 3996, 4017, 4035, 4051, 4065, 4076, 4085, 4091, 4095, 4095, 4095, 4091, 4085, 4076, 4065, 4051, 4035, 4017, 3996, 3972,
3947, 3919, 3889, 3856, 3822, 3785, 3746, 3705, 3662, 3617, 3570, 3521, 3471, 3418, 3364, 3309, 3252, 3193, 3133, 3072, 3009, 2946, 2881, 2815, 2748, 2681, 2613, 2543,
2474, 2404, 2333, 2262, 2191, 2119, 2048, 1977, 1905, 1834, 1763, 1692, 1622, 1553, 1483, 1415, 1348, 1281, 1215, 1150, 1087, 1024, 963, 903, 844, 787, 732, 678, 625,
575, 526, 479, 434, 391, 350, 311, 274, 240, 207, 177, 149, 124, 100, 79, 61, 45, 31, 20, 11, 5, 1, 0, 1, 5, 11, 20, 31, 45, 61, 79, 100, 124, 149, 177, 207, 240, 274,
311, 350, 391, 434, 479, 526, 575, 625, 678, 732, 787, 844, 903, 963, 1024, 1087, 1150, 1215, 1281, 1348, 1415, 1483, 1553, 1622, 1692, 1763, 1834, 1905, 1977
};*/
   

   DAC_InitTypeDef DAC_InitStructure;
   DMA_InitTypeDef DMA_InitStructure;
   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
   GPIO_InitTypeDef           GPIO_InitStructure;
   
   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC | RCC_APB1Periph_TIM2, ENABLE);
   
   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4 ; 
   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
   GPIO_Init(GPIOA, &GPIO_InitStructure);
   
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
   TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;   
   TIM_TimeBaseStructure.TIM_Period = (72000000/8000)-1;   
   TIM_TimeBaseStructure.TIM_Prescaler = 0;
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

   TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Update);
   
   DMA_DeInit(DMA2_Channel3);
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&DAC->DHR8R1;       // (uint32_t) & DAC->DHR12R1
   DMA_InitStructure.DMA_MemoryBaseAddr = (u32) &WAVBuffer[0];                 // sinus_12bit
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
   DMA_InitStructure.DMA_BufferSize = 512;        // (sizeof(sinus_12bit) / sizeof(sinus_12bit[0]))
   DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
   DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
   DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;   // DMA_PeripheralDataSize_HalfWord
   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;           // DMA_MemoryDataSize_HalfWord
   DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
   DMA_InitStructure.DMA_Priority = DMA_Priority_High;
   DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
   DMA_Init(DMA2_Channel3, &DMA_InitStructure);

   DAC_InitStructure.DAC_Trigger = DAC_Trigger_T2_TRGO;
   DAC_InitStructure.DAC_WaveGeneration = DAC_WaveGeneration_None;
   DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Enable;        // DAC_OutputBuffer_Disable;
   DAC_Init(DAC_Channel_1, &DAC_InitStructure);

   DAC_DMACmd(DAC_Channel_1, ENABLE);
   DAC_Cmd(DAC_Channel_1, ENABLE);
   DMA_Cmd(DMA2_Channel3, ENABLE);
   
   TIM_Cmd(TIM2, ENABLE);          //TIM_Cmd(TIM2, DISABLE);
}


Код: Выделить всё

void sound(void)
{
   
   disk_initialize(0);
   f_mount(0,&fs);
   f_open( &fsrc, "200.wav", FA_READ );
        f_read (&fsrc, &WAVBuffer, 512, &rb);
   f_lseek(&fsrc, 44);
   
   while(1)
      {
         while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
         f_read (&fsrc, &WAVBuffer[0], 256, &rb);
         DMA2->IFCR |= DMA_ISR_HTIF3;   
         if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
         
         while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
         f_read (&fsrc, &WAVBuffer[256], 256, &rb);   
         DMA2->IFCR |= DMA_ISR_HTIF3;
         if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
       }
}


Сама задача

Код: Выделить всё

static  void  Task_AudioOUT (void *p_arg)
{
    (void)p_arg;
    OSTimeDlyHMSM(0, 0, 2, 250);
    Status = SD_Init();
    Status = SD_GetCardInfo(&SDCardInfo);
    Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
    Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
    Status = SD_SetDeviceMode(SD_DMA_MODE);
   
   while(1)
  {   
      if(Kn_a==1)                  // Флаг кнопки меняется в прерывании
      {
         
         Init_Sound();
         
         sound();
         Kn_a=0;
      }
      
      OSTimeDlyHMSM(0, 0, 1, 250);
   }
}
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

С массива, который в функции Init_Sound(), синус на осциллографе хороший.
Как начинаю с карты читать записанный синус, лезет какой то бред.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение uk8amk »

Я не знаю что там записывает Audacity, но открывать и играть файл вот так не совсем корректно:

Код: Выделить всё

   f_open( &fsrc, "200.wav", FA_READ );
   f_read (&fsrc, &WAVBuffer, 512, &rb);
   f_lseek(&fsrc, 44);

И хотя секция data в данном случае может идти цельным куском и по определённому смещению, но никто не мешает редактору туда вписывать др. служебную информацию.


Код: Выделить всё

         while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}   
         DMA2->IFCR |= DMA_ISR_HTIF3;  <<< TCIF !!!!! поскольку конец буфера
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Хорошо. Вот так я читаю заголовок. Изменений никаких. В посте выше я просто переместил указатель на 44 байта.

Код: Выделить всё

static
DWORD load_header (void)    /* 0:Invalid format, 1:I/O error, >1:Number of samples */
{
   
    DWORD ChunkID, SamplingRate, sz, Length;
    char str[20];
   
    //----------
    f_mount(0,&fs);
    f_open( &fsrc, "200.wav", FA_READ );
    //----------
    GUI_SetColor(GUI_WHITE);  //RED
    GUI_SetFont(&GUI_Font24_1);
    GUI_DispStringAt(">", 0, 50);
   
    if (f_read(&fsrc, Buff, 12, &rb)) return 1;    /* Load file header (12 bytes) */
    if (rb != 12 || LD_DWORD(Buff+8) != FCC('W','A','V','E')) return 0;
    GUI_DispNextLine(); GUI_DispString("WAV File found:");

    while(1) {
        f_read(&fsrc, Buff, 8, &rb);            /* Get Chunk ID and size */
        if (rb != 8) return 0;
        ChunkID = LD_DWORD(&Buff[0]);
        sz = LD_DWORD(&Buff[4]);        /* Chunk size */   
//----------
        sprintf(str, "%ld", sz);
        GUI_DispNextLine();
        GUI_DispString(str);
//----------       
        switch (ChunkID) {    /* FCC */
            case fmt_chunk:                    /* 'fmt ' chunk */
                if (sz > 100 || sz < 16) return 0;        /* Check chunk size */
                f_read(&fsrc, Buff, sz, &rb);                    /* Get content */
                if (rb != sz) return 0;
                if (Buff[0] != 1) return 0;                /* Check coding type (PCM=1) */

                NumChannels = Buff[2];                    /* Get channel flag */
                if (NumChannels != 1 && NumChannels != 2)         /* Check channels (1/2) */
                    return 0;
                if(NumChannels == 1)     {GUI_DispNextLine(); GUI_DispString("Mono");}
                else if(NumChannels == 2)     {GUI_DispNextLine(); GUI_DispString("Stereo");}               

                BitsPerSample = Buff[14];        /* Resolution flag */
                if (BitsPerSample != 8 && BitsPerSample != 16)    /* Check resolution (8/16) */
                    return 0;
                if(BitsPerSample == 8)     {GUI_DispNextLine(); GUI_DispString("8-bits");}   
                else if(BitsPerSample == 16) {GUI_DispNextLine(); GUI_DispString("16-bits");}               

                SamplingRate = LD_DWORD(Buff+4);
//                set_sampling_rate( SamplingRate );            /* Sampling freq */
                sprintf(str, "%ldHz", SamplingRate);
                GUI_DispNextLine(); GUI_DispString(str);
                break;
   
            case data_chunk:                /* 'data' chunk (start to play) */
                Length = sz / (SamplingRate * NumChannels * (BitsPerSample>>3) );    // length in seconds
                sprintf(str, "%ld:%2ld min", (Length/60), (Length%60));
                GUI_DispNextLine(); GUI_DispString(str);
                return sz;
   
            case LIST_chunk:                /* 'LIST' chunk (skip) */

            case fact_chunk:                /* 'fact' chunk (skip) */
                f_lseek(&fsrc, (fsrc.fptr + sz));           
           
                break;
   
            default :                                                 /* Unknown chunk (error) */
                return 0;
        }
    }
    //return 0;
}


и дальше

Код: Выделить всё

void sound(void)
{
f_read (&fsrc, &WAVBuffer[0], 512, &rb);
   
    while(1)   
        {
            while(!(DMA2->ISR & DMA_ISR_HTIF3)) {}
            f_read (&fsrc, &WAVBuffer[0], 256, &rb);
            DMA2->IFCR |= DMA_ISR_HTIF3;   
            if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
           
            while(!(DMA2->ISR & DMA_ISR_TCIF3)) {}
            f_read (&fsrc, &WAVBuffer[256], 256, &rb);   
            DMA2->IFCR |= DMA_ISR_HTIF3;
            if(rb < 256) {TIM_Cmd(TIM2, DISABLE); break;}
         }
}
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение uk8amk »

Я уже сказал что во втором полубуфере вы сбрасываете CHTIF вместо CTCIF.
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Да!
Заменил флаг на DMA_ISR_TCIF3.
Изменений нет.
На экране беспорядочные, не периодические значения.
Вот фото
[img]
как фото вставить?
[/img]
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Ребят! Может поделитесь рабочим примером чтения WAV с карты.
Что то совсем не получается.
В общем заголовок на экран вывожу.
А сами данные не получается вывести. Плиз.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение uk8amk »

На картинке что-то хрень какая-то. Либо данные 16-битные, либо результат закодирован со знаком.
Есть код проигрывателя, но без SPL. Если интересно - в ЛС.
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Конечно интересно.
Без SPL не помеха. Очень хочется разобраться.
Можно на почту. progel1970@gmail.com
Аватара пользователя
Andrey27
Первый раз сказал Мяу!
Сообщения: 24
Зарегистрирован: Вс май 11, 2014 23:24:21

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение Andrey27 »

Вот рабочий код проигрывания WAV 44100, 8bit stereo с карты microSD подключенной к SDIO 4bit мк STM32F4 Discovery, писал на кокосе:

Код: Выделить всё

#include "main.h"
#include "stm32_ub_fatfs.h"   // Стандартная библиотека для работы с карточками FAT12 - FAT16
#include "stm32f4xx_dac.h"
#include "stm32f4xx_tim.h"

FIL myFile;   
uint8_t buff[1024];
volatile uint16_t n = 0;

void TIM6_DAC_IRQHandler(void) {
  TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
  DAC_SetChannel1Data(DAC_Align_8b_R, buff[n]); // Записываем в ЦАП очередной элемент массива
  DAC_SetChannel2Data(DAC_Align_8b_R, buff[n+1]);
  n = n + 2;
  if (n > 1023) n = 0;                                   // Перебираем все значения и начинаем с начала
}

void Play(void)
 {
  uint32_t bt = 0;
  uint8_t p = 0;
  while(1)
   {
    if (!p && n > 511)  // Если первая половина буфера проиграна то...
     {
      UB_Fatfs_ReadBlock(&myFile, &buff[0], 512, &bt); // Заполняем первую половину буфера
      p = 1;
      if (bt < 512) break;           // Конец файла.
     }
     if (p && n < 512)  // Если вторая половина буфера проиграна то...
     {
      UB_Fatfs_ReadBlock(&myFile, &buff[512], 512, &bt);  // Заполняем вторую половину буфера
      p = 0;
      if (bt < 512) break;          // Конец файла.
     }
   }
 }

int main(void)
{
    GPIO_InitTypeDef GPIO_Init_LED;
    uint32_t b = 0;

              SystemInit(); // Инициализация настроек кварца

   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
   GPIO_Init_LED.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
   GPIO_Init_LED.GPIO_Mode = GPIO_Mode_OUT;
   GPIO_Init_LED.GPIO_Speed = GPIO_Speed_2MHz;
   GPIO_Init_LED.GPIO_OType = GPIO_OType_PP;
   GPIO_Init_LED.GPIO_PuPd = GPIO_PuPd_NOPULL;

   GPIO_Init(GPIOD, &GPIO_Init_LED);

   RCC_APB1PeriphClockCmd(RCC_APB1Periph_DAC, ENABLE);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);

   TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
   TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
   TIM_TimeBaseStructure.TIM_Period        = 1904; // частота перебора значений массива
   TIM_TimeBaseStructure.TIM_Prescaler     = 0;
   TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
   TIM_TimeBaseStructure.TIM_CounterMode   = TIM_CounterMode_Up;
   TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
   TIM_Cmd(TIM6, ENABLE);

   TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); // включаем прерывания по переполнению
   NVIC_EnableIRQ(TIM6_DAC_IRQn);             //Разрешение TIM6_DAC_IRQn прерывания

   // Включаем DAC2
   DAC_Cmd(DAC_Channel_1, ENABLE);
   DAC_Cmd(DAC_Channel_2, ENABLE);

   GPIO_ResetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);

  // инициализации функций FATFS
  UB_Fatfs_Init();

  // проверка наличия карты
  if(UB_Fatfs_CheckMedia(MMC_0)==FATFS_OK) {
   // Смонтировать карту
    if(UB_Fatfs_Mount(MMC_0)==FATFS_OK) {
      // открыть файл в коневом каталоге
      if(UB_Fatfs_OpenFile(&myFile, "0:/1.wav", F_RD)==FATFS_OK) {
       //читать файл
        UB_Fatfs_ReadBlock(&myFile, &buff[0], 512, &b);

        if (buff[0] == 0x52) {GPIO_SetBits(GPIOD, GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);} // если файл WAV то зажигаем все светодиоды

        Play();

       DAC_Cmd(DAC_Channel_1, DISABLE);
       DAC_Cmd(DAC_Channel_2, DISABLE);
        // закрыть файл
        UB_Fatfs_CloseFile(&myFile);
      }
      // отключить карту
        UB_Fatfs_UnMount(MMC_0);
    }
  }

  while(1)
  {

  }
}
loreal1970
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вт апр 28, 2015 15:51:12

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение loreal1970 »

Ребята!!! Всем спасибо кто откликнулся. Особенно uk8amk.
В общем пару дней отдохнул и доделал чтение WAV.
Конечно было неправильное преобразование. Пока написано коряво (по быстрому), но работает.
Приведу в порядок выложу - если надо. :)
Еще раз благодарю и с ПРАЗДНИКОМ 9 МАЯ!
Аватара пользователя
ave101
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт янв 02, 2015 14:45:31

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение ave101 »

uk8amk писал(а):Есть код проигрывателя, но без SPL. Если интересно - в ЛС.

Интересно.

Andrey27 писал(а):Вот рабочий код проигрывания WAV 44100, 8bit stereo с карты microSD подключенной к SDIO 4bit мк STM32F4 Discovery, писал на кокосе:

Код: Выделить всё

#include "main.h"
#include "stm32_ub_fatfs.h"   // Стандартная библиотека для работы с карточками FAT12 - FAT16
#include "stm32f4xx_dac.h"
#include "stm32f4xx_tim.h"

...

Где main.h и остальные файлы? Какая среда разработки?

loreal1970 писал(а):Ребята!!! Всем спасибо кто откликнулся. Особенно uk8amk.
В общем пару дней отдохнул и доделал чтение WAV.
Конечно было неправильное преобразование. Пока написано коряво (по быстрому), но работает.
Приведу в порядок выложу - если надо. :)
Еще раз благодарю и с ПРАЗДНИКОМ 9 МАЯ!

Конечно надо! Я только начал с аппаратным SPI разбираться: STM32F030 (STM32F103) и генератор до 40 МГц AD9850
Аватара пользователя
ave101
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт янв 02, 2015 14:45:31

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение ave101 »

"STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV"

А разве существует SDIO для STM32F103? Я читал, что SDIO есть только для серии F4.

http://alex-exe.ru/radio/stm32/connect- ... stm32-spi/
Кто-нибудь из этой статьи исходник переделывал под CooCox для F103 или F100 или F030?
Я уже неделю ищу в нете рабочий пример и нигде нет. Как найду или сделаю, выложу сюда.
Аватара пользователя
ave101
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Пт янв 02, 2015 14:45:31

Re: STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Сообщение ave101 »

Наконец то сегодня нашел рабочие проекты с SD-картами для F100 серии под CooCox.

1. STM32 Discovery SD+WEB+ENC28J60
2. W5500+STM32+SD web сервер
3. STM32+ENC28j60+DMA+косяки

P.S.
Stm32 Урок 1: Создание проекта в Keil UVision
Посмотрел урок по созданию первого проекта в Keil - по сравнению с CooCox... без слов... - в корзину.
Ответить

Вернуться в «ARM»