Господа, столкнулся с необычной проблемой и нуждаюсь в помощи и совете.
Задача: вывести WAV-файл в DAC-канал микроконтроллера (работаю с платой STM32F4discovery). Задача тривиальная, даже не нужно читать файл с флешки - я сразу выдрал PCM-данные из WAV-файла (файл был специально подготовлен: 8 kHz, 8-bit, mono) и подгружаю их в виде массива из заголовочного файла.
Вывод в ЦАП очередной порции информации происходит по прерываниям от таймера, работающего на частоте 8кГц (что соответствует частоте дискретизации файла). Однако при попытке вывести всё это на динамик, я получаю какие-то хрипы и сипение, что довольно далеко от того, что я хочу слышать.
void Audio_TIM_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
__HAL_RCC_TIM3_CLK_ENABLE();
htim.Instance = TIM3;
htim.Init.Prescaler = (uint16_t) (SystemCoreClock / 1000000) - 1;
htim.Init.CounterMode = TIM_COUNTERMODE_UP;
htim.Init.Period = 125;
htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
HAL_TIM_Base_Init(&htim);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
HAL_TIM_ConfigClockSource(&htim, &sClockSourceConfig);
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
HAL_TIMEx_MasterConfigSynchronization(&htim, &sMasterConfig);
HAL_NVIC_SetPriority(TIM3_IRQn, 0, 1);
HAL_NVIC_EnableIRQ(TIM3_IRQn);
HAL_TIM_Base_Start_IT(&htim);
}
Путём экспериментов я добился нужного звука (хотя и с жуткими помехами) на частоте прерываний в 32 кГц. И теперь я пытаюсь понять, в чём причина такого поведения микроконтроллера и чем мне руководствоваться при настройке прерываний?
UPD: Вопрос решён осциллографом и вдумчивым изучением схемы тактирования STM32. Как оказалось, я задал не тот делитель во время инциализации системной шины и потому таймер тактировался как раз в 4 раза медленнее, чем я рассчитывал.