Страница 1 из 2

STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV

Добавлено: Вт апр 28, 2015 17:00:53
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;}
       }
}

В динамике треск и писк.
В общем мозги кипят.
Прошу помощи, кто знает. Нужно проиграть мелодию с карточки.

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

Добавлено: Вт апр 28, 2015 21:56:26
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);

Было бы логичнее сначала сделать загрузку полубуфера, а только потом ждать его освобождения.

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

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

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

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

Направте на путь истинный

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

Добавлено: Вт апр 28, 2015 22:45:51
uk8amk
1. читаем данные в буфер (512 байт)

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

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

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

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

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

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

DAC_InitStructure.DAC_OutputBuffer = DAC_OutputBuffer_Disable;

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

Кстати, у вас какая реальная частота или период дискретизации для TIM6 получается?

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

Добавлено: Вт апр 28, 2015 22:59:15
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кГц

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

Добавлено: Чт апр 30, 2015 10:54:57
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);
   }
}

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

Добавлено: Чт апр 30, 2015 11:06:39
loreal1970
С массива, который в функции Init_Sound(), синус на осциллографе хороший.
Как начинаю с карты читать записанный синус, лезет какой то бред.

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

Добавлено: Чт апр 30, 2015 11:56:14
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 !!!!! поскольку конец буфера

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

Добавлено: Чт апр 30, 2015 12:11:01
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;}
         }
}

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

Добавлено: Чт апр 30, 2015 12:21:39
uk8amk
Я уже сказал что во втором полубуфере вы сбрасываете CHTIF вместо CTCIF.

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

Добавлено: Чт апр 30, 2015 12:37:28
loreal1970
Да!
Заменил флаг на DMA_ISR_TCIF3.
Изменений нет.
На экране беспорядочные, не периодические значения.
Вот фото
[img]
как фото вставить?
[/img]

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

Добавлено: Чт апр 30, 2015 12:41:18
loreal1970

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

Добавлено: Чт апр 30, 2015 14:31:34
loreal1970
Ребят! Может поделитесь рабочим примером чтения WAV с карты.
Что то совсем не получается.
В общем заголовок на экран вывожу.
А сами данные не получается вывести. Плиз.

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

Добавлено: Чт апр 30, 2015 17:14:17
uk8amk
На картинке что-то хрень какая-то. Либо данные 16-битные, либо результат закодирован со знаком.
Есть код проигрывателя, но без SPL. Если интересно - в ЛС.

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

Добавлено: Чт апр 30, 2015 18:54:31
loreal1970
Конечно интересно.
Без SPL не помеха. Очень хочется разобраться.
Можно на почту. progel1970@gmail.com

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

Добавлено: Чт апр 30, 2015 22:48:56
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)
  {

  }
}

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

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

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

Добавлено: Чт июл 23, 2015 23:38:00
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

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

Добавлено: Ср июл 29, 2015 16:01:56
ave101
"STM32F103VET6 + DAC + DMA + SDIO + FATFS = WAV"

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

http://alex-exe.ru/radio/stm32/connect- ... stm32-spi/
Кто-нибудь из этой статьи исходник переделывал под CooCox для F103 или F100 или F030?
Я уже неделю ищу в нете рабочий пример и нигде нет. Как найду или сделаю, выложу сюда.

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

Добавлено: Ср июл 29, 2015 21:42:24
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... без слов... - в корзину.