В общем записал на карту синус (сформированный в программе Audacity 1кгц, 8 бит)
Начинаю читать, на экране осциллографа какой то кривой прямоугольник валит.
Вот настройка с выводом. Что не так? Прошу помощи.
CODE
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);
}
}
С массива, который в функции Init_Sound(), синус на осциллографе хороший.
Как начинаю с карты читать записанный синус, лезет какой то бред.
Может подскажите , добрые люди, где запятая не там стоит
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!