flopix 0 31 июля, 2013 Опубликовано 31 июля, 2013 (изменено) · Жалоба Колупаю пример Audio_playback_and_record идущий с STM32F4Discovery и заметил что частота воспроизведения файлов заметно отличается от 44100 в меньшую сторону. Как физически замерить реальную частоту не придумал. Вот что генерирует утилита STM32F4xx_Clock_Configuration_V1.1.0.xls *----------------------------------------------------------------------------- * I2S input clock(Hz) | 86000000 * | * To achieve the following I2S config: | * - Master clock output (MCKO): OFF | * - Frame wide : 16bit | * - Audio sampling freq (KHz) : 44,1 | * - Error % : 0,0967 | * - Prescaler Odd factor (ODD): 0 | * - Linear prescaler (DIV) : 2 | *----------------------------------------------------------------------------- Не пойму как тут получается частота 44100 да еще и с погрешностью 0,0967. Согласно даташита если ODD = 0 то real divider value is = I2SDIV *2 86000000/256/(2*2) = 83984,375 Нужно еще делить на 2 канала или на 2 байта так как ширина потока данных 16 бит? Ну и все равно погрешность получается достаточно большой 44100/41992,1875*100-100 = 5,02%. А вот как рассчитывается значения делителя в функции I2S_Init tmp = (uint16_t)(((((i2sclk / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5); /* Remove the flatting point */ tmp = tmp / 10; /* Check the parity of the divider */ i2sodd = (uint16_t)(tmp & (uint16_t)0x0001); /* Compute the i2sdiv prescaler */ i2sdiv = (uint16_t)((tmp - i2sodd) / 2); /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */ i2sodd = (uint16_t) (i2sodd << 8); Тут рассчет понятный за исключением того что такое 5 в первой формуле?? В результате получаются те же i2sdiv = 2 i2sodd = 0 В чем я не прав? Как мне подобрать наименьшую погрешность частоты на выходе учитывая что МК тактируется от внешнего кварца 8МГц? Изменено 31 июля, 2013 пользователем flopix Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 1 августа, 2013 Опубликовано 1 августа, 2013 · Жалоба Поигрался сейчас еще с тулзой, так вот - считает она вроде бы верно. При 8МГц кварце получил такие параметры *----------------------------------------------------------------------------- * System Clock source | PLL (HSE) *----------------------------------------------------------------------------- * SYSCLK(Hz) | 168000000 *----------------------------------------------------------------------------- * HCLK(Hz) | 168000000 *----------------------------------------------------------------------------- * AHB Prescaler | 1 *----------------------------------------------------------------------------- * APB1 Prescaler | 4 *----------------------------------------------------------------------------- * APB2 Prescaler | 2 *----------------------------------------------------------------------------- * HSE Frequency(Hz) | 8000000 *----------------------------------------------------------------------------- * PLL_M | 8 *----------------------------------------------------------------------------- * PLL_N | 336 *----------------------------------------------------------------------------- * PLL_P | 2 *----------------------------------------------------------------------------- * PLL_Q | 7 *----------------------------------------------------------------------------- * PLLI2S_N | 271 *----------------------------------------------------------------------------- * PLLI2S_R | 6 *----------------------------------------------------------------------------- * I2S input clock(Hz) | 45000000 * | * To achieve the following I2S config: | * - Master clock output (MCKO): ON | * - Frame wide : 16bit | * - Audio sampling freq (KHz) : 44,1 | * - Error % : 0,0000 | * - Prescaler Odd factor (ODD): 0 | * - Linear prescaler (DIV) : 2 | *----------------------------------------------------------------------------- Так вот, если посмотреть внимательно на окно экселя и вывод в файл - видим что в файое I2S input clock(Hz) 45000000, однако в экселе - 45.1667МГц, да и если просто посчитать - 1Мгц * 271 / 6 = 45166666Гц и 45166666Гц/ (256 * 4) = 44108Гц, что довольно близко к искомым 44100. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
flopix 0 1 августа, 2013 Опубликовано 1 августа, 2013 · Жалоба Наверно ексель скрипты ожидают другой разделитель дробной части в системе. Сейчас изменю и проверю. Да после установки в региональных настройках точки как разделитель целой и дробной части скрипт стал работать нормально. Со следующими настройками воспроизведения происходит полностью синхронно с ПК. :) *----------------------------------------------------------------------------- * I2S input clock(Hz) | 45166700 * | * To achieve the following I2S config: | * - Master clock output (MCKO): ON | * - Frame wide : 16bit | * - Audio sampling freq (KHz) : 44.1 | * - Error % : 0.0183 | * - Prescaler Odd factor (ODD): 0 | * - Linear prescaler (DIV) : 2 | *----------------------------------------------------------------------------- Вот почему ST выкладывает заведомо некорректно настроенные примеры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться