Stm32 цап. ЦАП микроконтроллера STM32: возможности и примеры использования

Что такое ЦАП в микроконтроллерах STM32. Как работает ЦАП в STM32. Какие основные возможности у ЦАП STM32. Как использовать ЦАП STM32 для генерации сигналов и звука. Какие примеры применения ЦАП STM32 существуют.

Содержание

Что такое ЦАП в микроконтроллерах STM32

ЦАП (цифро-аналоговый преобразователь) или DAC (Digital-to-Analog Converter) — это устройство для преобразования цифрового сигнала в аналоговый. В микроконтроллерах семейства STM32 встроенный ЦАП позволяет формировать аналоговые сигналы различной формы.

Основные характеристики ЦАП в STM32:

  • Разрядность: 12 бит (4096 уровней)
  • Количество каналов: 1 или 2 (зависит от конкретной модели МК)
  • Диапазон выходного напряжения: от 0 до VREF (обычно 3.3В)
  • Возможность генерации шума и треугольного сигнала
  • Поддержка DMA для автоматической передачи данных
  • Синхронизация с таймерами

Принцип работы ЦАП в STM32

Принцип работы ЦАП в STM32 заключается в следующем:

  1. 12-битное цифровое значение (от 0 до 4095) записывается в регистр данных ЦАП.
  2. ЦАП преобразует это значение в соответствующее аналоговое напряжение от 0 до VREF.
  3. Выходное напряжение определяется по формуле: Vout = VREF * (цифровое значение / 4095)
  4. Обновление выхода ЦАП может выполняться программно или по событию таймера.
  5. Для непрерывной генерации сигнала используется DMA.

Таким образом, изменяя цифровые значения в регистре ЦАП с определенной частотой, можно формировать аналоговые сигналы произвольной формы.


Основные возможности ЦАП STM32

ЦАП микроконтроллеров STM32 обладает следующими ключевыми возможностями:

  • Разрешение 8 или 12 бит
  • Одновременная работа двух каналов (в некоторых моделях)
  • Встроенный генератор шума
  • Встроенный генератор треугольного сигнала
  • Синхронизация с таймерами для точного задания частоты
  • Поддержка DMA для автоматической загрузки данных
  • Программируемый выходной буфер
  • Режим двойной буферизации данных

Эти возможности позволяют гибко настраивать ЦАП под различные задачи генерации сигналов.

Применение ЦАП STM32 для генерации сигналов

ЦАП микроконтроллеров STM32 может использоваться для генерации различных типов сигналов:

  • Синусоидальный сигнал
  • Треугольный сигнал
  • Пилообразный сигнал
  • Прямоугольный сигнал
  • Шумовой сигнал
  • Произвольный сигнал по точкам

Для генерации синусоидального сигнала используется следующий алгоритм:

  1. Создается таблица значений синуса (обычно на период)
  2. Значения из таблицы циклически передаются в ЦАП с помощью DMA
  3. Частота обновления задается таймером
  4. Изменяя частоту таймера, можно менять частоту сигнала

Треугольный и пилообразный сигналы могут генерироваться встроенным генератором ЦАП или программно. Шумовой сигнал формируется с помощью встроенного генератора псевдослучайных чисел.


Использование ЦАП STM32 для генерации звука

ЦАП микроконтроллеров STM32 хорошо подходит для генерации звуковых сигналов. Основные способы генерации звука:

  1. Воспроизведение оцифрованного звука из памяти
  2. Синтез звука в реальном времени
  3. Генерация простых сигналов (синус, треугольник) для создания тонов

Для воспроизведения звуковых файлов используется следующий алгоритм:

  1. Звуковые данные (например, из WAV файла) загружаются в память
  2. Данные передаются в ЦАП с помощью DMA
  3. Частота дискретизации задается таймером
  4. Выход ЦАП подключается к усилителю и динамику

Такой подход позволяет создавать на базе STM32 простые аудиоплееры, диктофоны и другие звуковые устройства.

Примеры применения ЦАП STM32

Вот несколько примеров практического применения ЦАП микроконтроллеров STM32:

  • Генераторы сигналов произвольной формы
  • Аудиоплееры и диктофоны
  • Синтезаторы и электронные музыкальные инструменты
  • Генераторы тестовых сигналов
  • Управление двигателями постоянного тока
  • Формирование опорных напряжений
  • Имитаторы датчиков с аналоговым выходом

Например, для создания простого генератора сигналов можно использовать следующий алгоритм:


  1. Создать массивы с точками различных сигналов (синус, треугольник и т.д.)
  2. Настроить ЦАП на работу с DMA
  3. Использовать таймер для задания частоты обновления ЦАП
  4. По кнопкам переключать форму сигнала, меняя источник для DMA
  5. Энкодером регулировать частоту таймера для изменения частоты сигнала

Таким образом, ЦАП микроконтроллеров STM32 является мощным инструментом для создания различных аналоговых интерфейсов и генераторов сигналов.

Настройка и инициализация ЦАП STM32

Для работы с ЦАП STM32 необходимо выполнить следующие шаги по его настройке и инициализации:

  1. Включить тактирование ЦАП в регистре RCC
  2. Настроить GPIO пин, к которому подключен выход ЦАП
  3. Сконфигурировать регистр DAC_CR:
    • Выбрать разрядность (8 или 12 бит)
    • Настроить выходной буфер
    • Выбрать источник запуска (триггер)
    • Включить DMA, если требуется
  4. Настроить DMA для автоматической передачи данных в ЦАП
  5. Сконфигурировать таймер для синхронизации работы ЦАП
  6. Включить выбранный канал ЦАП

Пример базовой инициализации ЦАП на STM32:



// Включение тактирования
RCC->APB1ENR |= RCC_APB1ENR_DACEN;

// Настройка пина PA4 как аналогового
GPIOA->
MODER |= GPIO_MODER_MODER4; // Настройка ЦАП DAC->CR |= DAC_CR_EN1; // Включение канала 1 DAC->CR |= DAC_CR_TSEL1; // Программный запуск DAC->CR |= DAC_CR_TEN1; // Включение триггера // Запись значения в ЦАП DAC->DHR12R1 = 2048; // Половина диапазона // Обновление выхода ЦАП DAC->SWTRIGR |= DAC_SWTRIGR_SWTRIG1;

После такой инициализации ЦАП готов к работе и формированию аналогового сигнала на выходе.


Микроконтроллеры STM32: использование АЦП и ЦАП

АЦП и ЦАП могут быть полезны в ряде задач, например, если нужно считывать данные с аналоговых датчиков, или при работе со звуком. Многие МК семейства STM32 имеют встроенный АЦП (даже несколько), а некоторые МК также имеют и встроенный ЦАП. В этой заметке мы рассмотрим простой пример использования обоих устройств. Для экспериментов я использовал плату LimeSTM32 на базе STM32F405, имеющего как АЦП, так и ЦАП.

Итак, создаем новый проект. В STM32CubeMX во вкладке Pinout в дереве слева находим Peripherals и ставим галочки ADC1 → IN0 и DAC → OUT1 Configuration. Далее во вкладке Configuration жмем на ADC1 и меняем значение «Continuous Conversion Mode» на «Enabled», а значение «End of Conversion Selection» — на «EOC flag at the end of all conversions». Несмотря на название, последнее значение эквивалентно «Disabled», о чем несколько подробнее можно прочитать на StackExchange. Что же до DAC, то нам подойдут его настройки по умолчанию.

Для успешной компиляции кода дописываем в Makefile в списке C_SOURCES:

$(FIRMWARE)/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc.c \
$(FIRMWARE)/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_adc_ex.c \
$(FIRMWARE)/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac.c \
$(FIRMWARE)/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dac_ex.c \

При настройке ЦАП выяснилось, что аналоговый выход есть только на пинах PA4 и PA5. Проблема в том, что в LimeSTM32 эти пины я вывел на гнезда для подключения Arduino-шилда и использовал, как CS и SCK SPI-шины (D10 и D13 в обозначениях Arduino). Другими словами, приходится выбирать, остаться либо без SPI-устройств на шилде, либо без ЦАП. А мне как раз очень хотелось выводить значения, получаемые от АЦП, на шилд с экранчиком на базе ST7735, который использует SPI. Для решения этой проблемы было решено немного подхачить плату так, чтобы вместо PA4 и PA5 для SPI использовались пины PB5 и PB3. Я сделал себе пометку внести это изменение в будущих ревизиях LimeSTM32.

Основной код прошивки вышел незамысловатым:

void init() {
    ST7735_Init();
    ST7735_FillScreen(ST7735_BLACK);

    HAL_ADC_Start(&hadc1);
    HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
    UART_Printf(«Ready!\r\n»);
     
    // Похоже, что АЦП нужно время на инициализацию.
    // Без этой задержки в зависимости от тела loop() прошивка
    // может повиснуть.
    HAL_Delay(1);
}

void loop() {
    HAL_Delay(100);

    // Без изменения опции «End of Conversion Selection»

    // HAL_ADC_GetValue сработает только один раз, а при
    // втором вызове повиснет.

    HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
    uint32_t adc_val = HAL_ADC_GetValue(&hadc1);

    HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, adc_val);

    char tmp[128];
    snprintf(tmp, sizeof(tmp), «ADC: %04lu», adc_val); // 0 .. 4095
    ST7735_WriteString(11*0, 18*0, tmp, Font_11x18,
                       ST7735_WHITE, ST7735_BLACK);
}

Код просто считывает значение с АЦП и передает его как есть в ЦАП. Значения, используемые обоими устройствами, в данном случае 12-и битные. Интересно, что микроконтроллеры STM32 позволяют понижать разрядность сигнала, получая взамен более быструю работу устройств. Также существуют микроконтроллеры с 16-и битным АЦП.

В LimeSTM32 используется микроконтроллер STM32F405RGT6 (даташит [PDF]), либо его старший брат STM32F415RGT6. В обоих микроконтроллерах частота дискретизации АЦП составляет 2.4 Msps, а частота дискретизации ЦАП — 1 Msps. Следует учитывать, что это максимальные значения, и в даташите есть немало оговорок касаемо того, когда они достигаются. Помимо прочего, частота дискретизации АЦП зависит от напряжения питания, а частота дискретизации ЦАП — от того, насколько сильно изменяется сигнал.

Fun fact! ЦАП в STM32 основаны на R-2R лестнице. Устройство таких ЦАП ранее была описано в заметке Генерация синусоидального сигнала, а следовательно и звука, на FPGA. Используемый же АЦП является так называемым SAR ADC. Его работа основана на ЦАП и бинарном поиске такого его входного значения, чтобы получаемый в итоге сигнал был максимально близок к входному сигналу АЦП.

Проверить работу кода проще всего с помощью потенциометра и светодиода:

А еще можно убрать задержку в loop() и воспользоваться для теста генератором сигналов и осциллографом:

На первом канале мы видим вход АЦП, а на втором — выход ЦАП. Искажения сигнала объясняются тем, что мы его пробрасываем в цикле, как бы «в лоб», а стоило бы использовать прерывания или DMA. Однако эти темы уже выходят за рамками сего поста. Заинтересованный читателю стоит обратиться к статье Учимся передавать звук с использованием протокола I2S, в рамках которой был написан простой WAV-проигрыватель. Используя подход, аналогичный описанному в той статье, можно записывать звук при помощи АЦП и затем воспроизводить его при помощи ЦАП.

Если вы решите сделать такой проект в качестве домашнего задания, то вам может понадобится операционный усилитель, например NE5532. Также на eBay можно найти готовые модули на базе микрофонного усилителя MAX9814 (даташит [PDF]), аудио усилителя для динамиков PAM8403 (даташит [PDF]), и множество других. При использовании PAM8403 не удивляйтесь, если на на выходе у него окажется не синусоида, поскольку он является усилителем класса D.

Исходники к посту вы найдете в этом репозитории на GitHub. Как обычно, буду рад вашим вопросам и дополнениям.

Дополнение: В продолжение темы см заметку Микроконтроллеры STM32: переключение каналов АЦП. Пример использования двух ЦАП одновременно вы найдете в статье Рисуем на осциллографе в режиме X-Y.

Метки: STM32, Электроника.

AN3126: формирование аудиосигнала с помощью DAC STM32 | arm

В этой статье (перевод апноута AN3126 [1]) описываются примеры генерации звука с помощью встроенного в STM32 аналого-цифрового преобразователя (Digital to Analog Converter, DAC).

Модуль DAC микроконтроллера (MCU) STM32 12-разрядный, с тремя каналами вывода сигналов. Этот DAC может использоваться во многих звуковых приложениях, таких как системны сигнализации, гарнитуры Bluetooth®, говорящие игрушки, автоответчики, интерфейс между машиной и человеком, недорогие проигрыватели музыкальных файлов. Также можно использовать DAC для генерации сигналов в различных устройствах измерения и контроля.

В апноуте [1], кроме описания основных возможностей STM32 DAC, приведены 2 примера:

– В первом примере DAC используется для генерации синусоидального сигнала.
– Во втором примере показано проигрывание WAV-файлов.

В чипах STM32, основанных на ядре Arm®(a) Cortex®, встроенный DAC может реализован в разных конфигурациях, с различными возможностями:

• С каналами от одного до трех.
• С возможностью генерации шума.
• С возможностью генерации сигнала треугольной формы.
• С поддержкой флага недогрузки DMA (DMA under run).
• С выделенным тактированием аналогового тракта.

Для получения подробной информации по возможностям и функциям определенного DAC обращайтесь к даташиту на используемый MCU STM32. Дополнительную информацию можно найти в апноуте AN4566 [2].

Как показано на рис. 1, модуль DAC принимает данные в трех целочисленных форматах: 8 бит (байт, находящийся в младших разрядах регистра хранения данных, data hold register), 12 бит с выравниванием вправо (двенадцать бит также находятся в младших разрядах data hold register) и 12 с выравниванием влево (двенадцать бит находятся в старших разрядах data hold register).

Рис. 1. Форматы данных DAC.

Уровень аналогового выходного напряжения каждого канала DAC определяется по формуле:

DACOutput = VREF · DOR / 4096

Двухканальный режим. Эта функция поддерживается только в тех MCU, где имеется как минимум два встроенных DAC. На каждом из каналов имеется свой ЦАП. В двухканальном режиме преобразование из цифры в аналог может быть реализовано независимо или одновременно. Когда каналы DAC запускаются от одного источника, оба канала объединяются в группу для синхронных операций обновления, и преобразования осуществляются одновременно.

Выделенные таймеры. В дополнение к программным и внешним триггерам, преобразование DAC может запускаться от разных таймеров. Базовые таймеры TIM6 и TIM7 [7] предназначены для управления запусками преобразований DAC. Каждый раз, когда интерфейс DAC детектирует фронт нарастания на выбранном выходе триггера таймера (TIMx_TRGO), последние данных, сохраненные в регистр DAC_DHRx, передаются в регистр DAC_DORx (пример для STM32F100x показан на рис. 2).

Рис. 2. Каналы триггера (запуска) STM32F10x DAC.

DMA. В чипах MCU STM32 имеется как минимум один модуль DMA с несколькими каналами передачи данных. Каждый канал DAC привязывается к отдельному каналу DMA, формируя поток данных (stream). Например, для STM32F10x DAC channel1 соединяется с DMA channel3, и DAC channel2 соединяется с DMA channel4.

Когда DMA не используется, данные для DAC должен своевременно предоставлять CPU, чтобы корректно сформировать необходимый сигнал. Данные для DAC сохраняются в RAM или энергонезависимой памяти, либо могут генерироваться на лету.

Рис. 3. Взаимодействие с DAC без DMA.

При использовании DMA общая производительность системы увеличивается, потому что CPU освобождается от действий по предоставлению данных для DAC. Причина в том, что данные могут передаваться из памяти в DAC блоком DMA, без участия CPU. Таким образом, процессорное время CPU становится доступным для других операций.

Рис. 4. Взаимодействие с DAC при помощи DMA.

В некоторых случаях может произойти ошибка недогрузки DMA (DMA under run error), когда передачи DMA происходят медленнее, чем преобразования DAC. В этих случаях DAC определяет, что часть данных сигнала не была получена, и корректное формирование сигнала не может быть продолжено, и по этому факту выставляет флаг ошибки «DMA under run error».

[Генератор белого шума]

На рис. 5 показана функция генератора псевдослучайного кода STM32 DAC. В зависимости от того, какие используются отводы от разрядов сдвигового регистра [8], может быть сгенерирована последовательность 2n-1 псевдослучайных чисел до того, как эта последовательность повторяется.

Рис. 5. Генератор псевдослучайных чисел, встроенный в DAC.

Шум, производимый этим генератором, обладает плоским распределением уровня по спектру, и может считаться белым. Вместо Гауссовского выходного распределения, распределение равномерное, см. рис. 6.

Рис. 6. Форма сигнала шума.

Смещение (или постоянная составляющая) шума программируемое. Путем изменения этого смещения по предварительно сконфигурированной таблице смещений (шаблон сигнала), пользователь может получить сигнал, который соответствует сумме сигнала и шума.

Рис. 7. Шум с модифицируемым смещением.

Применение генератора белого шума. Чипы STM32 поставляются с 12-разрядным АЦП (ADC) с частотами дискретизации, которые могут превышать 1 мегасемплов в секунду. В большинстве приложений важна разрешающая способность, и когда нужна большая точность, может быть применена концепция передискретизации и децимации входного сигнала, чтобы не использовать внешний АЦП и тем самым снизить общую стоимость и энергопотребление устройства. Сигнал генерируемого шума может использоваться для расширения точности ADC в процессе применения передискретизации. Более подробно этот метод описан в секции «Oversampling using white noise» апноута AN2668 [3].

Генератор белого шума также может использоваться в индустрии электронной музыки либо напрямую, либо для подачи на вход фильтра для создания шумоподобных сигналов различного типа. Это используется в синтезе звука, обычно для имитации перкуссионных инструментов, таких как цимбалы, у которых в частотном спектре присутствует много шума.

Генератор белого шума может использоваться для управления процессами разработки, например для тестирования усилителей и электронных фильтров.

[Генератор треугольника]

STM32 DAC предоставляет пользователю генератор сигнала треугольной формы с гибко настраиваемыми смещением, амплитудой и частотой. Амплитуда треугольного сигнала может быть фиксирована с помощью бит MAMPx в регистре DAC_CR.

Таблица 2. Предварительно программируемые значения амплитуды треугольного сигнала (при VREF = 3.3V).

Биты MAMPx[3:0] Цифровая амплитуда Аналоговая амплитуда (V)
0 1 0.0008
1 3 0.0024
2 7 0.0056
3 15 0.0121
4 31 0.0250
5 63 0.0508
6 127 0.1023
7 255 0.2054
8 511 0.4117
9 1023 0.8242
10 2047 1.6492
≥ 11 4095 3.2992

Более подробно про генерацию треугольного сигнала см. соответствующие секции в руководстве. Частота сигнала треугольной формы связана с частотой триггера — источника сигнала запуска (trigger source).

Рис. 8. Формирование треугольного сигнала.

Смещение треугольного сигнала программируется (см. рис. 9). Путем изменения смещения треугольника по предварительно запрограммированной таблице смещений (шаблон сигнала), пользователь может получить сигнал, который соответствует сумме сигнала и шума. Поскольку здесь нет аппаратной защиты от переполнения, сумма смещений и амплитуды не должна превышать 4095.

Рис. 9. Синусоидальный сигнал с изменяемым смещением.

Генераторы треугольника часто используется в синтезе звука, так как тембр треугольника менее жесткий, чем у прямоугольного сигнала (амплитуда верхних гармоник падает быстрее).

[Буферизация выхода]

Чтобы подавать сигнал на нагрузки без использования внешнего усилителя, каналы DAC снабжены встроенными буферами выхода, которые можно разрешить или запретить в зависимости от потребностей конкретного приложения.

Когда выход DAC не буферизирован, и в схеме присутствует нагрузка выхода, выходное напряжение становится ниже, чем это необходимо (см. рис. 10) из за выходного сопротивления DAC.

Рис. 10. Выход не буферизированного канала (с нагрузкой и без нагрузки).

Соответствующий параметр выходного импеданса DAC см. в даташите на используемый STM32 (например, для серии STM32F4 резистивная нагрузка должна быть выше 1.5 мегаома, чтобы выходное напряжение упало меньше 1%).

Когда выходной буфер разрешен, уровень выходного сигнала на нагрузке почти не снижается (см. рис. 11).

Рис. 11. Выход буферизированного канала (с нагрузкой и без нагрузки).

[Использование DAC для генерации синуса]

В этом примере показано, как генерировать сигнал синусоидальной формы, в его спектре (при отсутствие искажений) присутствует только одна частота.

Для подготовки цифрового шаблона для сигнала синуса, необходимо создать соответствующую таблицу, где будут рассчитаны уровни сигнала с помощью математических функций. В этом примере сформировано 10 цифровых данных, которые соответствуют форме синуса в диапазоне изменения фазы сигнала от 0 до 2Pi радиан за полный период (от 0 до 360 градусов).

Рис. 12. Цифровая модель синусообразного сигнала.

Шаг изменения фазы от выборки к выборке составляет 2Pi / ns (number of samples, количество выборок в секунду). Значение sin(x) изменяется в диапазоне от -1 до 1, эти значения необходимо сместить вверх, чтобы получить положительные (целые значения без знака) уровни синуса в виде выборок в диапазоне между 0x000 и 0xFFF (что соответствует диапазону изменения напряжения от 0 до 3.3V при VREF = 3.3V).

                          2Pi            0xFFF + 1
ySineDigital(x) = (sin(x · ——) + 1) · (————)
                           ns                 2

Цифровые входные данные прямо пропорционально преобразуются в выходные напряжения в диапазоне между 0 и VREF. Выходные напряжения на ножке каждого канала DAC определяются по формуле:

                             DOR
DACOutput = VREF · ————————-
                    DAC_MaxDigitalValue + 1

Примечание: для 12-битного разрешения с выравниванием вправо DAC_MaxDigitalValue = 0xFFF. Для 8-битного разрешения с выравниванием вправо DAC_MaxDigitalValue = 0xFF.

Уровень аналогового напряжения синуса ySineAnalog можно определить по формуле (при VREF = 3.3V):

                       ySineDigital(x)
ySineAnalog(x) = 3.3V · —————
                         0xFFF + 1

Таблица 3. Цифровые данные и соответствующие значения уровня напряжения для синусообразного сигнала.

Выборка (x) Значение цифровой
выборки
ySineDigital(x)
Аналоговое значение выборки (V)
ySineAnalog(x)
0 2048 1.650
1 3251 2.620
2 3995 3.219
3 3996 3.220
4 3253 2.622
5 2051 1.653
6 847 0.682
7 101 0.081
8 98 0.079
9 839 0.676

Цифровые выборки из таблицы 3 сохраняются в памяти, и передается в DAC с помощью DMA. Передача DMA запускается тем же самым таймером, который запускает преобразование DAC.

Установка частоты синуса. Чтобы установить частоту синусообразного сигнала, пользователь должен установить частоту выхода триггера таймера (fTimerTRGO). Генерируемая частота синуса будет определяться по следующей формуле:

             fTimerTRGO
fSinewave = ————
                ns

Таким образом, если выходная частота триггера TIMx_TRGO равна 1 МГц, то частота, генерируемая DAC, составит 100 кГц.

Примечание: в этом примере для упрощения сформирована маленькая таблица синуса. Чтобы максимально приблизиться к целевой чистой форме тона, рекомендуется использовать как можно большее количество выборок в таблице синуса ns (разница в качестве формирования сигнала показана на рис. 13 и 14).

Рис. 13. Синус, генерируемый с помощью таблицы из 10 выборок (ns = 10).

Рис. 14. Синус, генерируемый с помощью таблицы из 256 выборок (ns = 256).

[Использование DAC для проигрывания звука]

В этом примере реализован аудиоплеер на STM32, который может проигрывать WAV-файлы. В примере используется минимальное количество внешних компонентов. Звуковые файлы сохраняются на карте microSD, доступной для MCU STM32 через шину SPI.

Рис. 15. Поток данных от карты microSD до внешних излучателей звука.

Аудиоплеер, описанный в этой секции, поставляется как часть демонстрационного пакета firmware для платы разработчика STM32100B-EVAL вместе с соответствующим руководством пользователя UM0891, все это можно загрузить с сайта STMicroelectronics www.st.com.

Примечание: для других отладочных плат см. проекты с файлом waveplayer.c из архива [9].

В этом приложении подразумевается, что проигрываемый WAV-файл имеет следующий формат:

• Звук закодирован как PCM. Это данные без компрессии, где каждое значение данных представляет выборку сигнала в моменты дискретизации.
• Частота дискретизации (sample rate): может быть 8000, 11025, 22050 или 44100 Гц.
• Разрядность одной выборки (bits per sample): 8 (диапазон данных уровня звука [0-255]).
• Количество каналов: 1 (mono).

Формат WAV-файла [5] это подмножество спецификации Resource Interchange File Format (RIFF), используемой для хранения мультимедийных файлов. Файл RIFF начинается с заголовка, за которым друг за другом следуют секции секции данных. Часто WAV-файл используется только с одной секцией WAVE, состоящей из двух подсекций:

1. Подсекция fmt, которая описывает формат данных звука.
2. Подсекция data, где содержатся реальные данные звука.

Заголовок RIFF формата WAV-файла указывает длину файла. Далее подсекция fmt определяет формат выборки, здесь содержится информация о том, как закодирован звук (PCM или другой формат), количество каналов (mono или stereo), частота дискретизации (sample rate, количество выборок в секунду, например 22050) и размер (разрядность) одной выборки (например 8 или 16 бит). И наконец, в секции data содержатся данные выборок звука.

Пример приложения аудиоплеера основан на использовании внутренних периферийных устройств SPI, DMA, TIM6 и DAC микроконтроллера STM32. В момент запуска приложение сначала использует SPI для подключения к карте microSD, и анализирует её содержимое, используя файловую систему DOS (FAT16 или FAT32), при этом осуществляется поиск файлов с расширением *.WAV в папке USER. Как только найден допустимый WAV-файл, он считывается через SPI, и его данные передаются с помощью CPU в буферный массив RAM. Для передачи данных из буфера RAM в DAC используется блок DMA. TIM6 используется для запуска преобразования DAC, в результате чего цифровые данные звука преобразуются в аналоговый сигнал.

Перед тем, как могут быть воспроизведены звуковые данные WAV-файла, должен быть обработан его заголовок, чтобы определить необходимую частоту выборок (sampling rate) и длину данных. Задача воспроизведения звука осуществляется использованием оцифрованных данных (содержащихся в подсекции data файла *.WAV) для обновления уровня на выходе DAC, в нашем примере данные закодированы 8 битами (принимают значения от 0 до 255).

DAC Channel1 запускается с регулярными интервалами от таймера TIM6, в соответствии с указанной частотой выборок (sample rate) в заголовке WAV-файла. Демонстрационный исходный код, который считывает данные и проигрывает их, написан на языке C, и находится в файлах waveplayer.c и waveplayer.h (см. архив [9]). Воспроизведение начинается с запуска функции WavePlayerMenu_Start() (см. алгоритм работы аудиоплеера на рис. 16).

Рис. 16. Алгоритм работы примера аудиоплеера.

Примечание (*): когда DMA передает данные из буфера SRAM, CPU передает данные из памяти Flash карты microSD™ в другой буфер SRAM, и эти буферы периодически переключаются (это называется двойной буферизацией).

В этом приложении является важной совместная обработка чтения (из внешней памяти, здесь такой памятью служит карта microSD) и записи (в регистр данных DAC) цифровых данных сигнала (см. рис. 17).

Рис. 17. Диаграмма активности CPU и DMA во время воспроизведения звука.

Примечание: вместо считывания с карты данные звука могут быть сгенерированы с помощью вычислений CPU и записаны в буфер DMA, это называется прямым цифровым синтезом сигнала (DDS, Direct Digital Synthesis).

[Ссылки]

1. AN3126 Audio and waveform generation using the DAC in STM32 products site:st.com.
2. AN4566 Extending the DAC performance of STM32 microcontrollers site:st.com.
3. AN2668 Improving STM32F1 Series, STM32F3 Series and STM32Lx Series ADC resolution by oversampling site:st.com.
4. Синтез звуковых сигналов с помощью ШИМ.
5. Wave File Format — формат звукового файла WAV.
6. Начинаем работать в STM32CubeMX. Часть 2 site:habr.com.
7. Руководство по использованию обычных таймеров STM32.
8. LFSR: генерация псевдослучайных чисел на регистре сдвига.
9. 210118AN3126-package.zip — документация и примеры исходного кода.

STM32 DAC. » Хабстаб

Ключевое отличие цифровой электроники от аналоговой заключается в том, что цифровая электроника оперирует лишь двумя уровнями сигнала логическим нулем и единицей. Это не значит, что если мы подключим к ножке микроконтроллера мультиметр, он покажет 0 или 1V. Нуль, образно говоря, можно представить как отсутствие сигнала, а единица как присутствие сигнала, величина же самого сигнала зависит от питающего напряжения микросхемы. Если Ваш МК питается от 3V, то логический нуль будет соответствовать 0V, а логическая единица 3V. Для получения промежуточных значений напряжения на выводе микроконтроллера используют DAC или по-русски ЦАП.

DAC у STM32 обладает следующими особенностями:

  • двухканальный 12 разрядный, может работать в 8 или 12-битном режиме
  • напряжение на выходе от 0 до Vref
  • аппаратная генерация шума и пилы
  • одновременная загрузка данных в оба DAC
  • отдельный DMA канал на каждый DAC
  • запуск преобразования по триггеру

Сразу хотелось бы отметить, что данные сначала загружаются в регистр предварительного хранения (data holding register, DHRx), и лишь потом по событию (если включено) переносятся в выходной регистр (DORx).

Регистр управления DAC_CR:

DMAEN2 (DAC channel2 DMA enable) — единица в этом бите разрешает использовать DMA.

MAMP2[3:0](DAC channel2 mask/amplitude selector) — битовое поле позволяет задавать амплитуду генерируемого.

WAVE2[1:0](DAC channel2 noise/triangle wave generation enable) — битовое поле позволяет включать аппаратный генератор и выбирать форму генерируемого сигнала. 0 — аппаратный генератор отключен, 1 — генерация шума, 2 — генерация пилы.

TSEL2[2:0](DAC channel2 trigger selection) — битовое поле позволяет выбрать источник события по которому данные будут переносится из регистра предварительно хранения (data holding register, DHRx), в выходной регистр (DORx).

TEN2(DAC channel2 trigger enable) — единица в этом бите включает перенос данных из регистра предварительно хранения (data holding register, DHRx), в выходной регистр (DORx) по триггеру. Если событие аппаратное это занимает 3 такта, если программное то 1.

BOFF2(DAC channel2 output buffer disable) — единица в этом бите, отключает буфер на выходе ЦАП, по умолчанию он включен.

EN2(DAC channel2 enable) — единица в этом бите запускает ЦАП.

Образно, регистр можно разделить на две части, они полностью идентичны, но настраивают разные каналы.

DMAEN1(DAC channel1 DMA enable) —
MAMP1[3:0](DAC channel1 mask/amplitude selector) —
WAVE1[1:0](DAC channel1 noise/triangle wave generation enable) —
TSEL1[2:0](DAC channel1 trigger selection) —
TEN1(DAC channel1 trigger enable) —
BOFF1(DAC channel1 output buffer disable) —
EN1(DAC channel1 enable) —

Регистр управления программным триггером DAC_SWTRIGR:

SWTRIG2(DAC channel2 software trigger) — при записи единицы в этот бит генерируется программное событие для второго канала.

SWTRIG1(DAC channel1 software trigger) — при записи единицы в этот бит генерируется программное событие для первого канала.

Данные в регистр предварительного хранения могут загружаться в нескольких форматах: 12 бит выравнивание по правому краю, 12 бит выравнивание по левому краю , 8 бит. Для каждого способа существует свой регистр, что значительно упрощает настройку.

DAC_DHR12Rx — предназначен для загрузки 12 бит выровненных по правому краю.

DAC_DHR12Lx — предназначен для загрузки 12 бит выровненных по левому краю.

DAC_DHR8Rx — предназначен для загрузки 8 бит выровненных по правому краю.

Если данные обоих ЦАП необходимо обновить одновременно, это можно сделать используя следующие регистры.

DAC_DHR12RD — предназначен для одновременного обновления обоих каналов, 12 бит выровненных по правому краю.

DAC_DHR12LD — предназначен для одновременного обновления обоих каналов, 12 бит выровненных по левому краю.

DAC_DHR8RD — предназначен для одновременного обновления обоих каналов, 8 бит выровненных по правому краю.

Регистр данных DAC_DOR1 — позволяет считывать текущее состояние выхода первого ЦАП.

Регистр данных DAC_DOR2 — позволяет считывать текущее состояние выхода второго ЦАП.

Мне ЦАП понадобился для получения напряжения величиной 1V на ножке МК. Код ниже позволяет это сделать.


#include "stm32f4xx.h"

void DAC_Init(void)
{
  //разрешаем тактирование порта
  RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN; 
  //PA5 push-pull
  GPIOA->MODER |= GPIO_MODER_MODER5_1;
  GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR5;
  GPIOA->PUPDR &= ~GPIO_PUPDR_PUPDR5;
 
  //разрешаем тактироваине DAC
  RCC->APB1ENR |= RCC_APB1ENR_DACEN;
  //включаем DAC2
  DAC->CR |= DAC_CR_EN2;  
  //загружаем 12 битные данные в регистр с правым выравниванием          
  DAC->DHR12R2 = 1000;
}

Генератор сигналов ЦАП stm32 — CodeRoad



Я программирую DAC периферийное устройство stm32f2xx. У меня есть массив байтов (звук) & я хотел бы генерировать сигнал с частотой дискретизации = 8K.

Теперь мой вопрос: Как указать частоту дискретизации?

Примечание: Я много гуглил. Я получаю только генерацию трангл-волн и генерацию синусоидальных волн с помощью DMA. Я не хочу использовать DMA.

Заранее спасибо за помощь… С уважением,

c microcontroller stm32
Поделиться Источник Jasim Khan Afridi     02 августа 2012 в 14:06

3 ответа


  • Arduino millis() в stm32

    Я пытаюсь перенести некоторую библиотеку Arduino в stm32. В Arduino, millis() возвращает количество миллисекунд с момента boot. Есть ли эквивалентная функция в stm32? Я использую stm32f0 MCU.

  • Как сгенерировать код в STM32 CUBEMX?

    Я скачал Keil и STM32 CUBEMX (вместе с библиотекой прошивки для моего microcontroller). Я не понимаю, как мне поставить свой код c, чтобы увидеть, что происходит на самом деле? Я попытался подключить Keil к STM32 Cubemx при создании нового проекта, но когда я перехожу на устройство, там нет Куба…



4

Нецелесообразно воспроизводить сигналы из DAC без использования DMA. Вы настроили DMA с вашими образцами, и вы настроили DAC, чтобы использовать таймер в качестве триггера. Затем вы настраиваете таймер на запуск с желаемой частотой дискретизации.

Поделиться TJD     02 августа 2012 в 16:39



2

Я бы согласился с TJD, что в целом нецелесообразно делать это без DMA, однако это не невозможно, особенно при низкой частоте дискретизации.

Можно было бы использовать таймер, установленный для запуска каждые 1/8000 секунды в качестве фиксированной базы времени. Оттуда подпрограмма прерывания должна будет загрузить следующий образец в DAC. Частота дискретизации может быть изменена путем изменения временной базы таймера.

Было бы аналогично написать код для настройки контроллера DMA по сравнению с написанием кода для перемещения правильного образца в буфер. Однако подход DMA будет более надежным, вероятно, будет иметь меньшее дрожание частоты дискретизации и освободит ядро для выполнения другого кода, который может потребоваться. На самом деле, с настройкой TIM/DMA/DACs вы можете остановить ядро или перейти в спящий режим, который поддерживает работу периферийных часов.

Поделиться rjp     22 августа 2012 в 18:52



0

да, я тоже согласен с TJD.
использование DMA эффективно, а также освобождает CPU для другой задачи [хорошо].
управление временем в программном обеспечении(ядро с циклом занятости) [плохо] не даст хороших результатов. (итак, используйте таймер для синхронизации [хорошо]).
теперь для копирования вы должны выделить CPU для выполнения копирования через определенный промежуток времени (от цикла занятости или тайм-аута таймера) до DAC register.[bad]

в конце я рекомендую подключить DMA и таймер, и по таймауту DMA скопирует данные в регистр DAC [хорошо]. это решение только кажется сложным, но на самом деле гораздо проще работать с ним, когда он настроен.
[примечание: написано в pov кого-то, кто пытается понять/начать с чего-то подобного]

Поделиться Kuldeep Dhaka     04 августа 2015 в 23:06


  • Генератор классов доступа к данным Acumatiac не перечисляет имена таблиц

    Я пытаюсь начать курсы T100 для Acumatica, и в инструкциях упоминается, как настроить среду разработки, а затем начать работать над некоторыми примерами. В первом примере вы создаете график для таблицы стран с помощью шаблона PXGraph, создаете проект RB, чтобы использовать созданный график в…

  • STM32 — ESP8266 скачать файл

    я использую STM32 в качестве своего микропроцессора вместе с I2C EEPROM для хранения и ESP8266 для Wifi Как я могу загрузить двоичный файл обновления для загрузчика до flash с помощью ESP8266, хотя файл прошивки будет больше, чем STM32 Ram, поэтому я не могу загрузить файл из ESP8266 одним куском…


Похожие вопросы:


iOS генератор сигналов, подключенный через Аугграф

Я создал простой генератор сигналов, который подключен к AUGraph. Я повторно использовал некоторые примеры кода из Apple, чтобы установить AudioStreamBasicDescription следующим образом void…


Точный Генератор Сигналов

Я хочу создать точный генератор сигналов в Qt. Например, квадратный сигнал, который 10us (микросекунды) генерирует 255, а 10ms (миллисекунды) генерирует 0. Я использую usleep() в своем потоке, но он…


Разработки для STM32 на приведенном

можно ли скомпилировать код stm32 на beaglebone (возможно, черный)? Как кажется, платформа должна иметь доступ к arm-none-eabi-gcc, чтобы иметь возможность компилироваться для stm32?


Arduino millis() в stm32

Я пытаюсь перенести некоторую библиотеку Arduino в stm32. В Arduino, millis() возвращает количество миллисекунд с момента boot. Есть ли эквивалентная функция в stm32? Я использую stm32f0 MCU.


Как сгенерировать код в STM32 CUBEMX?

Я скачал Keil и STM32 CUBEMX (вместе с библиотекой прошивки для моего microcontroller). Я не понимаю, как мне поставить свой код c, чтобы увидеть, что происходит на самом деле? Я попытался…


Генератор классов доступа к данным Acumatiac не перечисляет имена таблиц

Я пытаюсь начать курсы T100 для Acumatica, и в инструкциях упоминается, как настроить среду разработки, а затем начать работать над некоторыми примерами. В первом примере вы создаете график для…


STM32 — ESP8266 скачать файл

я использую STM32 в качестве своего микропроцессора вместе с I2C EEPROM для хранения и ESP8266 для Wifi Как я могу загрузить двоичный файл обновления для загрузчика до flash с помощью ESP8266, хотя…


Работает ли mbedTLS на STM32 F1?

Стек mbedTLS предоставляется ST для его STM32 F7 microcontrollers , но не для STM32 F1 . Поэтому я хотел знать, есть ли причина и можно ли заставить mbedTLS работать на STM32 F1 . Спасибо.


Генератор многоадресных сигналов

Я работаю с устройством DAQ, которое пробует 32 аналоговых канала и отправляет его по udp с помощью многоадресной рассылки. Я сохраняю все данные с помощью ноутбука Ubuntu linux. Для целей…


STM32 искусственный интеллект

Я работаю над STM32l476g-DISCO и хочу попробовать функцию искусственного интеллекта с помощью STM32 CUBEMX, но я не мог видеть вывод (prediction/decision) и не понимал валидации (валидация на…

Построение ЦАП разрешением выше 12 бит на примере STM32

Если у вас имеется несколько ЦАП низкого разрешения на микроконтроллере, то на их основе вы всегда можете построить ЦАП более высокого разрешения. В простейшем случае это 2 порта, являющие собой два однобитных ЦАП. Создав общую точку соединения выходов портов резисторами, соотношение которых 1:2 получим один 2-битный ЦАП, построенный на базе двух однобитных:

Оценим потребную точность ∆ резисторов R1 и R2, применяемых для создания одного 24-битного ЦАП из двух 12-битных: где:
∆ — класс точности резисторов,
Res – разрешение одного ЦАП в битах.

Таким образом, для получения выходного разрешения ЦАП 24 бит, составленного из двух 12-ти битных ЦАП, мы обязаны использовать резисторы с классом точности 0.025% или выше, если такое вообще бывает. Если использовать более реальные резисторы с классом точности 0.1%, то мы потеряем 4 бита разрешения, то есть получим на выходе 20-ти битный ЦАП с характерной дифференциальной нелинейностью.

Что можно сделать? Если использовать не 2, а 4 ЦАП с ещё более низким разрешением (в случае построения 24-битного ЦАП, это 4 шт 6-ти битных ЦАП), то количество нелинейностей увеличится в 16 раз, зато их величина уменьшится в те же 16 раз, таким образом, мы вытащим ещё несколько бит. Вместо достигнутых 20-ти бит на базе резисторов 0.1% в прошлом варианте, мы получим 24 битный ЦАП, в идеале.

Все нелинейности ЦАП низкого разрешения окажутся на выходе составного ЦАП, это очевидно. Более того, выход полученного ЦАП должен быть буферизирован. Малейшие токи ЦАП старших разрядов будут вызывать просадку их выходного напряжения, что создаст интегральную нелинейность преобразования. Речь идёт о сотне нановольт, когда идёт построение 24-битного ЦАП. Токи должны быть минимизированы. Это ограничение на номиналы применяемых резисторов снизу и предпосылка установки повторителя напряжения на выходе ЦАП. Однако, установив буферный повторитель – помните, что все нелинейности и смещения повторителя окажутся на выходе.

В качестве исходных ЦАП, на которых будет происходить преобразование низкого разрешения в контроллерах STM8/32 можно взять пару 12-ти битных ЦАП, если таковая периферия имеется на борту, либо задействовать ШИМ выходы таймеров с последующим усреднением выходного сигнала.

В случае использования пары 12-ти битных ЦАП программно придётся разбивать значение выходного сигнала на 2 части по 12 бит и записывать их в соответствующие регистры данных. В случае использования ШИМ сигналов, их количество может быть увеличено. Каждый таймер общего назначения в STM32 имеет 4 выхода ШИМ. Более того можно синхронизировать работу нескольких таймеров и иметь большее число ШИМ каналов, что повысит общую разрешающую способность всей системы. Например, если использовать 8 каналов ШИМ = 2 таймера общего назначения, то 24-битный ЦАП вполне достижим при использовании резисторов классом 0.1%.

При построении ЦАП высокого разрешения на ШИМ каналах требуется усреднение выходного сигнала установкой ёмкости непосредственно за резистивным делителем. Главным образом, установка ёмкости требуется для подавления частоты ШИМ сигнала. Чем выше частота ШИМ, тем проще её будет подавить. Установка ёмкости усреднения непосредственно за резистивным делителем хороша ещё и тем, что изменение младших битов величины выходного сигнала приводит к току заряда ёмкости через резисторы большого номинала, а старших — через сопротивление меньшего номинала. Всё это приводит к быстрому заряду выходной ёмкости на резких изменениях выходных сигналов и малому – на малых, что позитивно сказывается на динамических параметрах ЦАП.

Задача: Имеем контроллер с тактовой частотой 36МГц (например, семейство STM32L1xxx). Таймер 16 бит тактируется частотой ядра. Вопрос: Какую частоту будет иметь ШИМ сигнал при указанных параметрах? Ответ простой: 36Мгц/65536 = 549 Гц. Т.е имеем верхнюю границу скорости работы ЦАП высокого разрешения. В реальности значение выхода с точностью 24бит установится на порядок медленнее. Если снизить разрешение, с 16-ти до 6-ти бит, то частота ШИМ вырастет в 1000 раз до 562 кГц. Таким образом, стратегия повышения скорости работы и разрешения выходного ЦАП путём увеличения числа и снижения разрядности ШИМ имеет место быть.

Таймеры общего назначения регистров сравнения контроллеров STM32/8 имеют регистры предзагрузки. Таким образом, после переполнения таймера ядро может спокойно загрузить в эти регистры следующее значение выхода ЦАП, разбив его на соответствующие группы битов. При переполнении, эти значения одновременно автоматически попадут в регистры сравнения ШИМ. Если речь идёт о 4-х 6-ти битных ШИМ сигналах, то у ядра будет 64 такта процессорного времени для решения этой задачи (для Cortex – этого более чем достаточно). Работу разбиения сигнала разрядностью 24 бита на несколько с меньшей разрядностью можно поручить ядру, как показано выше. Альтернативой будет запись сигнала высокой разрядности в готовом виде для регистров сравнения. В этом случае появляется возможность задействовать контроллер прямого доступа к памяти (DMA) для работы нескольких ЦАП параллельно. Ядро, в этом случае, окажется незадействованным, а на выходе системы – сигнал высокой разрядности.

Контроллеры фирмы STMicroelectronics позволяют осуществлять генерацию и измерение сигналов высокой разрядности.

Компания «Промэлектроника» желает вам успешных разработок.

Получить более подробную информацию вы можете, обратившись:

Ягов Денис
E-mail: [email protected]
Телефон: +7 (343) 372-92-27

По вопросам оптовых продаж обращайтесь:
E-mail: [email protected]
Телефон: +7 (343) 372 92 28
Единый телефон отдела продаж: 8 800 1000 321

  «ПРОМЭЛЕКТРОНИКА» — официальный прямой дистрибьютор компании «STMicroelectronics»

Последние новости — одной лентой:

Линейка микроконтроллеров STM32 F4 от STMicroelectronics

Линейка микроконтроллеров от STMicroelectronics расширяет платформу STM32 новым ядром ARM Cortex™-M4, добавляя цифровую обработку сигналов и еще большую производительность в номенклатуру продуктов семейства STM32.

Благодаря тому, что DSP-инструкции в STM32 F4 выполняются за один такт, стали доступны новые сегменты рынка встраиваемых приложений. Компания ST предлагает своим заказчикам, ныне использующим двухчиповое решение МК+DSP, совместить оба чипа в одном, применив микроконтроллеры новой серии.

Данная линейка по выводам и программно совместима с серией STM32 F2, работает на большей тактовой частоте(168 МГц вместо 120 МГц), поддерживает вычисления с плавающей запятой, имеет большой объем оперативной памяти 192 кбайт и встроенного ПЗУ (от 512 кбайт до 1 Mбайт). Новые микроконтроллеры построены по 90-нм технологии. Интегрированный адаптивный акселератор реального времени “ART Accelerator” обеспечивает непревзойденную производительность с нулевыми задержками выполнения программы из ПЗУ на частоте 168 МГц. Кроме того, примененная технология обеспечивает отличные динамические параметры энергопотребления.

Ключевые особенности серии STM32 F4:

  • Ядро Cortex-M4 с инструкциями DSP, FPU
  • ART акселератор, выполнение с 0 циклов задержки до 168 МГц
  • До 1 Мбайт Flash и 192 кбайт SRAM
  • Производительность:
    • Coremark: 363,17 на 168 МГц, Coremark/МГц: 2.162 
    • Dhrystone: 210 на 168 МГц 
    • 7 ведущих, 8 ведомых устройств на матричной шине multi AHB
  • Энергопотребление:
    • 230 мкА/МГц на 168 МГц при прогоне Coremark из Flash-памяти (периферия выключена)
    • питание 1,7…3,6 В VDD
    • < мкА типовое потребление календаря
  • Ethernet MAC10/100 с поддержкой IEEE 1588V2
  • 2 USB OTG (один из них HS)
  • Интерфейс камеры
  • Интерфейс внешней памяти
  • Аналоговый генератор случайных чисел
  • Crypto/hash аппаратный ускоритель
  • Периферия:
    • до 6 × USART: 10,5 Мбит/с
    • 3 × SPI: 37,5 Мбит/с
    • 3 × 12-разрядных АЦП: 2,44 MSPS (7,2 MSPS в режиме чередования)
    • 3 × I2C
    • 2 × CAN — SDIO
    • SDIO
    • 2 × I2S full duplex с независимым умножителем частоты
    • 2 × 12-разрядных ЦАП
    • до 17 таймеров: 16 и 32 разряда на частоте 168 МГц

На данный момент доступны следующие средства проектирования и ознакомления:

  • набор STM32 F4 Discovery, код для заказа: STM32F4DISCOVERY
  • ознакомительная плата STM32 F4, коды для заказа: STM3240G-EVAL и STM3241G-EVAL (с криптоподдержкой)

 

Микроконтроллеры серии STM32 F4 выпускаются в четырех вариантах:

STM32F405x: полный набор периферии и USB On-The-Go (OTG) full-speed/high-speed интерфейс. Доступны в четырех корпусах (WLCSP64, LQFP64, LQFP100, LQFP144) с 1 Мбайт Flash.

В STM32F407 к периферии имеющейся в STM32F405 добавляются: второй USB OTG full-speed интерфейс; встроенный Ethernet MAC 10/100 MII и RMII и аппаратной поддержкой IEEE1588 Precise Time Protocol v2, а также 8…14-разрядный параллельный интерфейс камеры для присоединения КМОП-камеры, поддерживающий до 67,2 Мбайт/с. Доступны в четырех корпусах (LQFP100, LQFP144, LQFP/BGA176), от 512 кбайт до 1 Mбайт Flash.

STM32F415 и STM32F417 несут на борту crypto/hash-процессор дополнительно к тому, что имеется в STM32F405 и STM32F407. Этот процессор обеспечивает аппаратное ускорение AES 128, 192, 256, Triple DES, HASH (MD5, SHA-1). Пропускная способность шифрования по AES-256 достигает 149,33 Мбайт/с.

STM32 запись звука и воспроизведение через ЦАП.Opus кодек кодирование и декодирование речи. | БоряЭлектрик

Opus кодек кодирование и декодирование аудио .SW4STM32.Запись звука и воспроизведение через stm32 ЦАП. Как залить аудио в память микроконтроллера.Размер прошивки в 200 КИЛО?

00:00 Тест кодирование и декодирование Opus кодек воспроизведение звука через ЦАП STM32 микроконтроллера

00:45 Opus кодек размер проекта и ограничение бесплатной версии Keil

00:54 SW4STM32 среда разработки от STM

00:54 Opus это…

01:38 Кодирование и декодирование короткого участка аудио на STM32

01:54 Как загрузить аудио файл в память микроконтроллера?(Audacity экспорт raw данных)

03:21 SW4STM32 сборка и размер проекта

03:25 Прошивка микроконтроллера через ST-Link utility

03:37 Задержки при кодировании и декодировании аудио,размер закодированных участков..

03:51 Вкратце о работе проекта

04:53 Вывод аудио данных через UART

05:08 Импорт .raw данных в программу Аudacity.Сравнение кодированного и декодированного участка аудио с оригиналом

05:45 SW4STM32 команды препроцессору и пути для сборки проекта

06:10 Реализация проекта с Opus кодеком под Keil.

06:37 Тест запись звука, кодирование, сохранение на flash,чтение и декодирование Opus кодеком. Воспроизведение звука через ЦАП STM32 микроконтроллера

06:57 STM32 CUBE HAL_LL настройка АЦП,Таймера,ЦАП,SPI, тактирование….

08:03 Keil HAL_LL настройка АЦП,Таймера,ЦАП,SPI и как это все работает..

12:42 Загружаем записанные через микрофон затем кодированные и декодированные данные через UART на компьютер, как .raw и слушаем в Audacity

13:25 Задержки при кодировании и декодировании Opus кодеком и размер кодированных данных на выходе Opus кодека

исходный код stm32-dac-core.h [linux / drivers / iio / dac / stm32-dac-core.h] — Браузер кода Woboq

8MORE_CORE_H 8MORE_H 8 0x08 0x14_DAC **
1 / * Идентификатор лицензии SPDX: GPL-2.0 * /
2 / *
3 * Этот файл является частью драйвера STM32 DAC
4 * 000 000 9009 * Copyright (C) 2017, STMicroelectronics — Все права защищены
6 * Автор: Fabrice Gasnier .
7 * /
8
9 #ifndef __STM32_DAC_CORE_H
10
12 #include
13
14 / * Регистры STM32 DAC * /
15
15
STM32_DAC_CR 0x00
16 #define STM32_DAC_DHR12R1
17 #define STM32_DAC_DHR12R2
18 #define STM32_DAC_DOR1 0x2c
19 # определить STM32_DAC _DOR2 0x30
20
21 / * битовые поля STM32_DAC_CR * /
22 #define 9IT5000
#define STM32H7_DAC_CR_HFSEL BIT (15)
24 #define STM32_DAC_CR_EN2 BIT (16)
24 25 9000
24 25 9000 9000
27 * struct stm32_dac_common — общие данные драйвера DAC stm32 (для всех экземпляров)
28 * @regmap: регистры DAC совместно используются через regmap
29 m : опорное напряжение (мВ)
30 * @hfsel: выбрана частота высокоскоростной шины
31 * /
32 struct stm32_dac_common {
33 struct regmap * regmap * regmap
34 внутр vref_mv ;
35 bool hfsel ;
36};
37
38 #endif
39

stm32f4xx_hal :: stm32 :: dac — Rust

Цифро-аналоговый преобразователь

кр

регистр управления

dhr8rd

ДВОЙНОЙ ЦАП, 8-битный регистр хранения данных с выравниванием по правому краю

dhr12rd

Двойной ЦАП, 12-разрядный регистр хранения данных с выравниванием по правому краю

dhr12ld

ДВОЙНОЙ ЦАП 12-битный регистр хранения данных с выравниванием по левому краю

dhr12l1

канал1 12-битный регистр хранения данных с выравниванием по левому краю

dhr12l2

channel2 12-битный регистр хранения данных с выравниванием по левому краю

dhr12r1

канал1 12-битный регистр хранения данных с выравниванием по правому краю

dhr12r2

channel2 12-битный регистр хранения данных с выравниванием по правому краю

dhr8r1

канал1 8-битный регистр хранения данных с выравниванием по правому краю

dhr8r2

channel2 8-битный регистр хранения данных с выравниванием по правому краю

дор1

регистр вывода данных канал1

дор2

регистр вывода данных канал2

ср

регистр состояния

swtrigr

регистр программного запуска

CR

регистр управления

DHR8RD

ДВОЙНОЙ ЦАП, 8-битный регистр хранения данных с выравниванием по правому краю

DHR12RD

Двойной ЦАП, 12-битный регистр хранения данных с выравниванием по правому краю

DHR12LD

ДВОЙНОЙ ЦАП 12-битный регистр хранения данных с выравниванием по левому краю

DHR12L1

канал1 12-битный регистр хранения данных с выравниванием по левому краю

DHR12L2

channel2 12-битный регистр хранения данных с выравниванием по левому краю

DHR12R1

channel1 12-битный регистр хранения данных с выравниванием по правому краю

DHR12R2

channel2 12-битный регистр хранения данных с выравниванием по правому краю

DHR8R1

канал 1 8-битный регистр хранения данных с выравниванием по правому краю

DHR8R2

channel2 8-битный регистр хранения данных с выравниванием по правому краю

DOR1

регистр вывода данных канал1

DOR2

регистр вывода данных канал2

РегистрБлок

Блок регистров

SR

регистр состояния

SWTRIGR

регистр программного запуска

[STM32] Пример программы ЦАП — 文章 整合

00.Каталог

01. Краткое описание DAC

STM32F4 Модульный ЦАП (модуль числового / аналогового преобразования) да 12 Цифровой вход, тип выхода напряжения ЦАП ЦАП Может быть настроен как 8-битный или 12-битный режим, с DMA Контроллер используется вместе. ЦАП, работающий в 12-битном режиме, данные можно настроить для выравнивания влево или вправо. Модуль DAC имеет 2 выходных канала, каждый канал имеет отдельный преобразователь. В режиме двойного ЦАП In 2 канала могут быть преобразованы независимо, вы также можете преобразовывать и обновлять одновременно 2 выходных канала.ЦАП Опорное напряжение может быть введено через вывод Vref + (через долю АЦП) для получения более точных результатов преобразования.

STM32F4 ЦАП Основными характеристиками модуля являются: :
① 2 отдельных преобразователя ЦАП : Каждый преобразователь соответствует 1 выходным каналам
② 8-битный или 12-битный монотонный выход
③ 12 Данные выравниваются по левому или правому краю в битовом режиме
④ Синхронно функция обновления
⑤ Генерация сигнала шума
⑥ Генерация треугольной формы сигнала
⑦ Двойное переключение каналов ЦАП одновременно или по отдельности
⑧ Каждый канал имеет функцию прямого доступа к памяти

02.Аппаратные модули

Используемые аппаратные ресурсы: :
1) Световой индикатор DS0
2) KEY_UP и KEY1 Key
3) Последовательный порт
4) Модульный TFTLCD
5) ADC
6) DAC

[Не удалось передать изображение внешней цепочки. Станция-источник может иметь цепной механизм защиты от кражи. Предлагается сохранить изображения и загрузить их напрямую (img-HO0gJXb7-1601197306284) (assets / image-20200927164845298.png)]

03. Программирование

цап.h файл

  #ifndef __DAC_H
#define __DAC_H
#include "sys.h"

void Dac1_Init (недействителен);
void Dac1_Set_Vol (u16 vol);
#endif


  

файл dac.c

  #include "dac.h"


недействительным Dac1_Init (недействительным)
{
      
  GPIO_InitTypeDef GPIO_InitStructure;
DAC_InitTypeDef DAC_InitType;

    RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ВКЛЮЧИТЬ);
    RCC_APB1PeriphClockCmd (RCC_APB1Periph_DAC, ВКЛЮЧИТЬ);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
    GPIO_Init (GPIOA, & GPIO_InitStructure);

DAC_InitType.DAC_Trigger = DAC_Trigger_None;
DAC_InitType.DAC_WaveGeneration = DAC_WaveGeneration_None;
DAC_InitType.DAC_LFSRUnmask_TriangleAmplitude = DAC_LFSRUnmask_Bit0;
DAC_InitType.DAC_OutputBuffer = DAC_OutputBuffer_Disable;
  DAC_Init (DAC_Channel_1, & DAC_InitType);

DAC_Cmd (DAC_Channel_1, ВКЛЮЧИТЬ);
  
  DAC_SetChannel1Data (DAC_Align_12b_R, 0);
}


void Dac1_Set_Vol (u16 vol)
{
    
двойная температура = объем;
темп / = 1000;
темп = темп * 4096/3.3;
DAC_SetChannel1Data (DAC_Align_12b_R, temp);
}
  

Файл main.c

  int main (пусто)
{
     
u16 adcx;
температура поплавка;
 u8 t = 0;
u16 dacval = 0;
клавиша u8;
NVIC_PriorityGroupConfig (NVIC_PriorityGroup_2);
delay_init (168);
uart_init (115200);

LED_Init ();
 LCD_Init ();
Adc_Init ();
KEY_Init ();
Dac1_Init ();
ТОЧКА_ЦВЕТА = КРАСНЫЙ;
LCD_ShowString (30,50,200,16,16, «Проводник STM32F4»);
LCD_ShowString (30,70,200,16,16, «ТЕСТ ЦАП»);
LCD_ShowString (30,90,200,16,16, «ATOM @ ALIENTEK»);
LCD_ShowString (30,110,200,16,16, «2014/5/6»);
LCD_ShowString (30,130,200,16,16, «WK_UP: + KEY1: -»);
POINT_COLOR = СИНИЙ;
LCD_ShowString (30,150,200,16,16, «ЦАП VAL:»);
LCD_ShowString (30,170,200,16,16, "DAC VOL: 0.000V ");
LCD_ShowString (30,190,200,16,16, «ADC VOL: 0,000V»);
 
DAC_SetChannel1Data (DAC_Align_12b_R, dacval);
в то время как (1)
{
    
t ++;
ключ = KEY_Scan (0);
если (ключ == WKUP_PRES)
{
    
если (dacval <4000) dacval + = 200;
DAC_SetChannel1Data (DAC_Align_12b_R, dacval);
} else if (ключ == 2)
{
    
если (dacval> 200) dacval- = 200;
иначе dacval = 0;
DAC_SetChannel1Data (DAC_Align_12b_R, dacval);
}
if (t == 10 || ключ == KEY1_PRES || ключ == WKUP_PRES)
{
    
 adcx = DAC_GetDataOutputValue (DAC_Channel_1);
LCD_ShowxNum (94,150, adcx, 4,16,0);
temp = (float) adcx * (3.3/4096);
adcx = temp;
 LCD_ShowxNum (94,170, темп, 1,16,0);
 temp- = adcx;
темп * = 1000;
LCD_ShowxNum (110,170, темп, 3,16,0X80);
 adcx = Get_Adc_Average (ADC_Channel_5,10);
temp = (float) adcx * (3,3 / 4096);
adcx = temp;
 LCD_ShowxNum (94,190, темп, 1,16,0);
 temp- = adcx;
темп * = 1000;
LCD_ShowxNum (110,190, темп, 3,16,0X80);
LED0 =! LED0;
t = 0;
}
delay_ms (10);
}
}
  

04. Результаты подтверждают, что

В то же время DS0 Мерцание, программа подсказки работает.Здесь мы нажимаем кнопку KEY_UP, вы можете видеть, что выходное напряжение увеличивается, нажимаем KEY1, оно становится меньше.

05. резерв

06. приложение

6.1 【STM32】 STM32 Сборник руководств

Веб-сайт

: 【STM32】 STM32 Сборник руководств

07. Заявление

.

Этот учебник относится к точке атома 《STM32 F4 Разработка руководящих принципов》

Документация ядра Linux / devicetree / bindings / iio / dac / st, stm32-dac.yaml

На основе версии ядра 5.13 . Страница создана 2021-06-28 07:05 EST .

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 год 22 23 24 25 26 год 27 28 год 29 30 31 год 32 33 34 35 год 36 37 38 39 40 41 год 42 43 год 44 год 45 46 47 48 49 50 51 52 53 54 55 56 57 год 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 год 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
 # Идентификатор лицензии SPDX: (GPL-2.0 OR BSD-2-Clause)
% YAML 1.2
---
$ id: "http://devicetree.org/schemas/iio/dac/st,stm32-dac.yaml#"
$ schema: "http://devicetree.org/meta-schemas/core.yaml#"

название: STMicroelectronics STM32 DAC bindings

описание: |
  ЦАП STM32 представляет собой 12-разрядный цифро-аналоговый преобразователь с выходным напряжением. ЦАП
  может быть настроен в 8- или 12-битном режиме. Он имеет два выходных канала, каждый с
  собственный конвертер.
  Он имеет встроенный генератор шума и треугольных сигналов и поддерживает внешние
  триггеры для конверсий.Выходной буфер ЦАП обеспечивает высокую производительность привода.
  Текущий.

сопровождающие:
  - Фабрис Гаснье 

характеристики:
  совместимый:
    перечисление:
      - st, stm32f4-dac-core
      - st, stm32h7-dac-core

  рег:
    maxItems: 1

  сбрасывает:
    maxItems: 1

  часы:
    maxItems: 1

  часы-имена:
    Предметы:
      - const: pclk

  vref-supply:
    Описание: Фандл к входному аналоговому опорному напряжению vref. dac @ [1-2] + $":
    тип: объект
    описание:
      Узел блока DAC должен содержать по крайней мере один подузел, представляющий
      Экземпляр / канал DAC, доступный на машине.характеристики:
      совместимый:
        const: st, stm32-dac

      рег:
        описание: должно быть либо 1, либо 2, чтобы определить (один) используемый канал.
        enum: [1, 2]

      '# io-channel-cells':
        const: 1

    additionalProperties: false

    требуется:
      - совместимый
      - рег
      - '# io-канал-ячейки'

Примеры:
  - |
    // Пример на stm32mp157c
    # включить 
    dac: dac @ 40017000 {
      совместимый = "st, stm32h7-dac-core";
      reg = <0x40017000 0x400>;
      clocks = <& rcc DAC12>;
      часы-имена = "pclk";
      vref-supply = <& vref>;
      # адрес-ячейки = <1>;
      # размер-ячейки = <0>;

      dac @ 1 {
        совместимый = "st, stm32-dac";
        # io-канал-ячейки = <1>;
        рег = <1>;
      };

      dac @ 2 {
        совместимый = "st, stm32-dac";
        # io-канал-ячейки = <1>;
        рег = <2>;
      };
    };

...


  • << [iio]
  • ad5755.txt
  • adi, ad5592r.yaml
  • adi, ad5696.yaml
  • adi, ad5758.yaml
  • adi, ad5766.yaml
  • adi, ad5770r.yaml
  • adi, ad7303.yaml
  • dpot-dac.yaml
  • fsl, vf610-dac.yaml
  • lltc, ltc1660.yaml
  • lltc, ltc2632.yaml
  • максим, ds4424.yaml
  • максим, max5821.yaml
  • Микрочип
  • , mcp4725.yaml
  • nxp, lpc1850-dac.yaml
  • ул, стм32-дак.ямл
  • ti, dac5571.yaml
  • ti, dac7311.yaml
  • ti, dac7512.yaml
  • ti, dac7612.yaml
  • ti-dac082s085.txt

  • Права на информацию принадлежат ее автору.
  • Все материалы доступны из исходного кода ядра Linux, распространяемого по лицензии GPL.
  • Размещено на mjmwired.net.

DAC — Опасные прототипы

Дилшан Джаякоди опубликовал новую сборку: этот проект представляет собой 24-битный стерео ЦАП, который мы создаем для плат Raspberry Pi.Этот лестничный ЦАП R-2R разрабатывается на базе Intel / Altera EPM240T100C5N CPLD. Мы разработали этот модуль после обзора ЦАП PT8211, который мы тестировали несколько месяцев назад. Сравните с ЦАП PT8211, этот модуль […]

Давиде Жирони пишет: Управлять этой ИС довольно просто, особенно если у вас есть выделенный аппаратный интерфейс SPI, как у многих микрочипов. ATmega8, используемый в этом примере, имеет специальный регистр управления SPI (SPSR), который можно использовать для настройки интерфейса SPI. Эта библиотека может управлять несколькими MCP49XX одного и того же […]

В максимально возможной степени мы хотели бы передать управление всем периферийным оборудованием Bus Pirate ПЛИС.Тогда всем можно будет управлять через командный конвейер конечного автомата. В Ultra v1c мы перенесли аналоговое измерение напряжения на FPGA, добавив SPI ADC. В будущей редакции будет иметь смысл […]

Сами Пиетикайнен написал статью, в которой подробно описывается сборка его ЦАП Bluetooth с использованием Raspberry Pi Zero W. Моя машина оснащена встроенной функцией громкой связи Bluetooth, но, к сожалению, она не поддерживает потоковую передачу звука. К счастью, есть вход AUX с обычным разъемом 3,5 мм.Прекрасная возможность для проекта DIY. Я построил […]

Повышение выходной мощности ЦАП для увеличения напряжения, о котором говорится в этом примечании к приложению от MAXIM Integrated. Ссылка здесь (PDF) Многие современные системы имеют большую часть своей электроники, питаемой от 3,3 В или ниже, но должны управлять внешними нагрузками с напряжением ± 10 В, диапазон, который все еще очень распространен в промышленных приложениях. Существуют цифро-аналоговые преобразователи […]

Тишам Дхар написал в блоге о своем 3-фазном синтезаторе: «Найти 3-фазный синтезатор сложно, еще сложнее убедить владельца упомянутого источника питания протестировать домашнее оборудование.После создания трехфазного монитора энергии мои возможности тестирования оказались очень ограниченными. Поэтому я приступил к созданию собственной недорогой системы калибровки трехфазного монитора энергии. См. […]

Очень старые заметки по применению от Analog Devices, в которых рассказывается о теореме Найквиста, частоте дискретизации и квантовании, используемых в ЦАП. Ссылка здесь (PDF) В основе каждой системы воспроизведения цифрового звука лежит самый важный компонент для высококачественного звука: цифро-аналоговый преобразователь (ЦАП). Эти преобразователи выполняют деликатную задачу преобразования 16-битного двоичного кода […]

Интересное примечание к приложению от Cirrus Logic о том, как минимизировать треск на выходе при включении / выключении ЦАП на их цифро-аналоговом преобразователе WM8731.Ссылка здесь (PDF) Как и в случае с любым другим потребительским аудиоустройством, важно свести к минимуму любой шум при включении / выключении питания. Обычно это делается с помощью […]

Thomas Fischl пишет: Некоторым приложениям необходимо управлять выходным напряжением преобразователя постоянного / постоянного тока вместо использования фиксированного выходного напряжения. Например, зарядные устройства должны регулировать выходное напряжение в соответствии с текущим уровнем заряда батареи. На этой странице показано, как добавить такую ​​функцию управления в схему понижающего преобразователя. Управляющий выход через внешний […]

Функциональный генератор из заметки по применению ЦАП C8051 (PDF) от Silicon Labs В этом документе описывается, как реализовать многофункциональный генератор, управляемый прерываниями, на устройствах C8051 с использованием встроенного цифро-аналогового преобразователя (ЦАП).Четыре различных сигнала, расширяемых до любой периодической функции, определенной в таблице. — Синусоидальная волна (определена в таблице) — Прямоугольная волна (рассчитана) — Треугольник […]

Шарль Дувье из PNW / Electronics пишет: Оказалось, что ЦАП — это, вероятно, самое простое периферийное устройство, которое я использовал на PIC. Мне потребовалось больше времени, чтобы ждать, пока PICKit обновит конфигурацию 18F до 16F. НО … если у вас возникли проблемы … вот вам: простой повторитель напряжения (или, как вам кажется, вы хотите буферизовать выход) […]

Керри Вонг пишет: Один из способов увеличить разрешающую способность цифро-аналогового преобразователя (ЦАП) — это использование сигма-дельта преобразователя в программном обеспечении.Главный недостаток такого подхода — низкая скорость. В качестве альтернативы мы можем использовать дополнительное оборудование для увеличения полезного разрешения ЦАП. В этом посте я проиллюстрирую один такой […]

Примечание по приложению об использовании встроенного ЦАП на вашем STM32 micro. В этом примечании к применению приведены примеры генерации выходных аудиосигналов с использованием периферийного устройства цифроаналогового преобразователя (ЦАП), встроенного в семейство микроконтроллеров STM32F10xx. Модуль ЦАП STM32 представляет собой 12-битный преобразователь слов с двумя выходными каналами для поддержки стереозвука.ЦАП может […]

Керри Вонг пишет: ШИМ-выходы Arduino (ATmega328P) через analogWrite можно удобно преобразовать в аналоговые уровни напряжения с помощью простых RC-фильтров. Поскольку выходы ШИМ не изолированы, их использование для непосредственного управления другими устройствами может быть потенциально опасным. Это особенно верно, если целевая цепь использует более высокое напряжение питания. […]

Берто работает над монтажной платой для АЦП WM8782 I2S и ЦАП WM8523 I2S. Платы предназначены для сопряжения с микроконтроллером ARM.Я работаю над проектом, который требует реального звука, и я всегда хотел поиграть с I2S (прикрепленным к микроконтроллеру руки). Я решил […]

Как выбрать микросхемы опорного напряжения и цифро-аналогового преобразователя, чтобы получить необходимую точность и стабильность: В этой заметке по применению основное внимание уделяется трехконтактным источникам опорного напряжения и прецизионным ЦАП Maxim. Чтобы спроектировать систему, нужно сначала понять, как определяются детали, а затем как взаимодействуют их рабочие характеристики.Эталоны напряжения и […]

Analog Devices описывает основы работы с цифро-аналоговыми преобразователями: В этом руководстве рассматриваются некоторые важные вопросы, касающиеся схемы интерфейса ЦАП, включая опорное напряжение, аналоговый выход, ввод данных и драйвер часов. Поскольку для АЦП также требуются ссылки и часы, большинство представленных в этом руководстве концепций по этим вопросам в равной степени применимы и к АЦП.

Это программируемый приемник тока, обычно используемый для моделирования различных токовых нагрузок для источников питания.Мы всегда хотели построить такой, но несколько раз тормозили. Этот дизайн основан на простой аналоговой нагрузке, опубликованной Bearmos. Это не финальный проект, это просто экспериментальный прототип […]

Брайан усердно работает над проектированием цифрового стереофонического музыкального плеера HiFi с открытым исходным кодом. Cortex M3 декодирует различные аудиоформаты и отправляет их на аудио-микросхему цифро-аналогового преобразователя через интерфейс I2S. Все это реализовано на его плате разработки Procyon. В этом видео он тестирует свою прошивку на кастомном […]

Наличие стабильного внешнего опорного сигнала очень важно при проектировании цифро-аналогового преобразователя, и это примечание к приложению поможет.Для правильной работы ЦАП он должен иметь стабильный опорный сигнал для создания точного выходного сигнала. К сожалению, поскольку это простая концепция, правильному эталонному дизайну обычно не уделяется должного внимания. В этом примечании к приложению от TI простая сила и […]

stm32% 20dac техническое описание и примечания по применению

2010 — STM32F100

Аннотация: stm32f102 stm32f105 stm32 pwm STM32F100C4 stm32f100c8 STM32L151 stm32f103 spi dma STM32F100 семейство микропрограмм библиотеки STM32
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM32 16 бит STM32F100 stm32f102 stm32f105 stm32 pwm STM32F100C4 stm32f100c8 STM32L151 stm32f103 spi dma Семейство STM32F100 Библиотека прошивки STM32
УСТРОЙСТВА СОЛИТРОН

Реферат: солитронные транзисторы 2Н3469 СОЛИТРОН 2Н2657 rfft 2N265
Текст: ТЕМПЕРАТУРА — 65 ° C до + 20D ° C fyjc ТЕПЛОВОЕ СОПРОТИВЛЕНИЕ, ПРИСОЕДИНЕНИЕ К СЛУЧАЮ 25 ° C / Вт РАССЕЯНИЕ МОЩНОСТИ ЧР


Сканирование OCR
PDF 2N3469 500 мА, 200 мА, 10 МГц) 100 мА, 2N2657, г. 2N265I 330 / тсек; СОЛИТРОН УСТРОЙСТВА 2N3469 солитронные транзисторы СОЛИТРОН 2N2657 rfft 2N265
2011-STM32F2

Аннотация: STLink nRST_STDBY stm32 STM32F2xx UM0892 0x08003000 stm32 10 0x08002000 STM8 USB-отправка
Текст: нет текста в файле


Оригинал
PDF UM0892 STM32 STM32 STM32F2 STLink nRST_STDBY STM32F2xx UM0892 0x08003000 stm32 10 0x08002000 STM8 USB отправка
2008-STM32F103E

Аннотация: STM32F103B STM32-PRIMER stm32 spi STM32-PRIMER2 stm32 usb смарт-карта цвет жк-дисплей 128×160 128×160 stm32 stm32 приложение для графического отображения
Текст: нет текста в файле


Оригинал
PDF СТМ32-ПРАЙМЕР STM3210B-ПРАЙМЕР STM32 STM32 STM32F103E STM32F103B 128×160 STM32F103E STM32F103B stm32 spi STM32-PRIMER2 stm32 usb смарт-карта цветной жк 128×160 приложение с графическим дисплеем stm32
2010 — STM32L15xxx Руководство по программированию Flash

Аннотация: STM32L STM32L15xxx STM32L1 код stm32 на чипе программирования STM32 stm32 10 STM32L15x STM32 STLink
Текст: нет текста в файле


Оригинал
PDF UM0892 STM32 STM32 STM32L15xxx Руководство по программированию Flash STM32L STM32L15xxx STM32L1 код stm32 на чипе программирования STM32 stm32 10 STM32L15x STLink
2008 — stm32f102

Аннотация: Комплект разработчика STM32f102 USB STM32F103vC STM32F103RD ПЛК с использованием ПРОЕКТОВ на базе ARM STM32F102CB STM32F103VD STM32F102C8 STM32F10x sdio программирование stm32f103 spi dma
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM32 STM3210B-EVAL STM3210E-EVAL STM32F103, com / stm32 stm32f102 Комплект разработчика USB STM32f102 STM32F103vC STM32F103RD ПЛК с использованием ПРОЕКТОВ на базе ARM STM32F102CB STM32F103VD STM32F102C8 STM32F10x sdio программирование stm32f103 spi dma
2009 — c исходный код скорость двигателя STM32

Аннотация: Комплект разработчика USB STM32 встраиваемая система проектирует бесплатную реализацию FIR FILTER на языке c для keil stm32 управление двигателем keil PMSM stm32 stm32 кодировщик stm32f107rct6 stm32f105 графический ЖК-дисплей stm32
Текст: нет текста в файле


Оригинал
PDF STM32 STM32 STM3210B-ПРАЙМЕР STM3210E-PRIMER STM32, BRSTMTOOLS0909 c исходный код скорость двигателя STM32 Комплект разработчика STM32 USB проекты встроенных систем бесплатно Реализация FIR FILTER на языке c для keil stm32 управление двигателем keil PMSM stm32 кодировщик stm32 stm32f107rct6 stm32f105 графический ЖК-дисплей stm32
2014 — STM32F030

Аннотация: абстрактный текст недоступен
Текст: нет текста в файле


Оригинал
PDF STM32 LQFP64 DocID025838 STM32F030
2009 — STM32F107VCT6

Аннотация: stm32f105 stm32f107 STM32F105RCT6 STM32F107VCT STM32F105RBT6 STM32F105VCT6 stm32f107 USB I2S USB мост USB-клавиатура stm32
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM3210C-EVAL СТМ32-КОМСТИК STM3210C-SK / IAR STM3210C-SK / KEIL STM3210C-SK / RAIS STM32107C-D / RAIS STM32F107VCT6 stm32f105 stm32f107 STM32F105RCT6 STM32F107VCT STM32F105RBT6 STM32F105VCT6 stm32f107 usb I2S USB-мост usb-клавиатура stm32
2009 — приложение графического дисплея stm32

Аннотация: Комплект разработчика USB STM32 графический ЖК-дисплей stm32 stm3210e-eval кодек speex графический ЖК-дисплей stm32 emwin stm32 spi speex кодер ARM trace32 авионика STM32f10xxe
Текст: нет текста в файле


Оригинал
PDF STM32 STM32F103ZE STM32F103RB BRSTMTOOLS0209 приложение с графическим дисплеем stm32 Комплект разработчика STM32 USB графический ЖК-дисплей stm32 stm3210e-eval кодек speex графический ЖК-дисплей stm32 emwin stm32 spi кодировщик speex ARM trace32 авионика STM32f10xxe
2008 — формат кода даты STMicroelectronics stm32

Аннотация: stm32 10 stm32 pwm MCBSTM32 Форматы кода даты St Microelectronics STM32 stm32 код таймера stm32 на программировании микросхемы STM32 hitex hitop tantino
Текст: нет текста в файле


Оригинал
PDF TN0072 STM32 Формат кода даты STMicroelectronics stm32 stm32 10 stm32 pwm MCBSTM32 Форматы кодов даты St Microelectronics stm32 таймер код stm32 на чипе программирования STM32 hitex хитоп тантино
RS485 STM32

Аннотация: stm32 spi STOD03 КЛАСС D АУДИОУСИЛИТЕЛЬ 3w стерео светодиодный драйвер lis302dl акселерометр stm32 usb смарт-карта amoled stm32 pwm LDLN015
Текст: нет текста в файле


Оригинал
PDF STM32 STM32 150 мА Сотый M41T00S, M41T81S, M41T6x, M41T83 / 93, M41ST87, rs485 stm32 stm32 spi STOD03 АУДИОУСИЛИТЕЛЬ КЛАССА D, стерео, 3 Вт светодиодный драйвер lis302dl акселерометр stm32 usb смарт-карта амолед stm32 pwm LDLN015
2010 — PM0042 STM32F10xxx Flash-программирование

Аннотация: stm32 10 на программировании чипа STM32 PM0042 Руководство по программированию STLink ST-LINK pm0042 UM0892 STM32F10xxx jtag STM32
Текст: нет текста в файле


Оригинал
PDF UM0892 STM32 STM32 PM0042 STM32F10xxx Flash-программирование stm32 10 на чипе программирования STM32 PM0042 Руководство по программированию STLink СТ-ЛИНК pm0042 UM0892 STM32F10xxx jtag
2010 — stm32f100

Аннотация: проекты встроенных систем stm32f105 STM32L151 stm32f107 STM32F103VG ST STM32F102 QFN48 stm32 LQFP100 посадочное место STM32F100rb
Текст: нет текста в файле


Оригинал
PDF STM32 32 бит STM32 16 бит com / stm32tools BRSTM320910 stm32f100 stm32f105 STM32L151 stm32f107 STM32F103VG СТ STM32F102 проекты встроенных систем QFN48 stm32 Площадь основания LQFP100 STM32F100rb
2010 — stm32f105

Аннотация: проекты встроенных систем ieee бесплатная клавиатура usb stm32 STM32F107VCT6 проекты встроенных систем STM32F105 LQFP100 stm32f105 ссылка на usb stm32f107 USART загрузчик stm32f107 STM32F107
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM32 256 Кбайт 64 Кбайт STM32CMICOSEVAL STM32CMICOS-EVAL STM32F107, stm32f105 IEee встраиваемые системные проекты бесплатно usb-клавиатура stm32 STM32F107VCT6 проекты встроенных систем STM32F105 LQFP100 stm32f105 ссылка на usb stm32f107 USART stm32f107 загрузчик STM32F107
2007 — графический ЖК-дисплей stm32

Аннотация: STM3210B-PRIMER LCD 128×128 STM32-PRIMER STM32 STM32F103 STM32F1 lcd 128 * 128
Текст: нет текста в файле


Оригинал
PDF STM3210B-ПРАЙМЕР STM32 STM32 STM32F103B 128×128 графический ЖК-дисплей stm32 STM3210B-ПРАЙМЕР ЖК-дисплей 128×128 СТМ32-ПРАЙМЕР STM32F103 STM32F1 жк 128 * 128
2008 — Комплект разработчика вывода STM32 PWM

Аннотация: библиотека прошивки STM32 STM32 USB комплект разработчика JTAG stm32f101 STM32F103 STM32F10x stm32f103 spi dma STM32F103 ethernet stm32 pwm rs232 STM32F103
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM32 STM32F103, STM3210B-EVAL STM3210E-EVAL com / stm32 Комплект разработчика вывода STM32 PWM Библиотека прошивки STM32 Комплект разработчика STM32 USB JTAG stm32f101 STM32F103 STM32F10x stm32f103 spi dma STM32F103 Ethernet stm32 pwm rs232 STM32F103
2011 — CN702

Аннотация: ST7590 ST7590 руководство пользователя CN701 EVALST7590-1 UM1038 ST7570 EVALST7570-1 ST758 CN704
Текст: нет текста в файле


Оригинал
PDF UM1038 STM32TM, ST75xx 32-битный CN702 ST7590 ST7590 руководство пользователя CN701 EVALST7590-1 ST7570 EVALST7570-1 ST758 CN704
2007 — stm32-performancestick

Аннотация: Комплект разработчика STM32 USB STM32 STM32F10 * Код таймера USB stm32 stm32 STM3210b Панель управления библиотекой STM32
Текст: нет текста в файле


Оригинал
PDF STM3210B-PFSTICK STM32-PerformanceStick STM32 STM32-PerformanceStick STM32F103B STM32 Комплект разработчика STM32 USB STM32F10 * USB stm32 таймер код stm32 STM3210b STM32-библиотека щиток приборов
2007 — Двигатель STM32F103

Аннотация: STM32F101 пользователь STM32F10x USB HOST rs232 STM32F103 STM32F103 ethernet STM32F10x ADC c исходный код скорость двигателя STM32 STM32F101 STM32F10x STM32F103
Текст: нет текста в файле


Оригинал
PDF STM32 32-битный STM32 STM3210B-EVAL STM32F103, com / stm32 BRSTM320807 Двигатель STM32F103 STM32F101 пользователь STM32F10x USB-ХОСТ rs232 STM32F103 STM32F103 Ethernet STM32F10x АЦП c исходный код скорость двигателя STM32 STM32F101 STM32F10x STM32F103
2008 — 64-точечная система счисления 4 БПФ

Аннотация: Руководство по библиотеке STM32F10xxx pid stm32 UM0585 Каноническое скользящее среднее 16 на 16 IIR Руководство по библиотеке STM32F10xxx 2.3 UM0585 Руководство пользователя radix4 c code iir filter
Текст: нет текста в файле


Оригинал
PDF UM0585 STM32F10xxx STM32F10xxx 64-точечная система счисления 4 БПФ Руководство по библиотеке STM32F10xxx pid stm32 UM0585 16 на 16 Каноническое скользящее среднее IIR Руководство библиотеки STM32F10xxx 2.3 UM0585 Руководство пользователя основание системы счисления4 c код iir фильтр
2010 — STM32F100rb

Аннотация: ESA8.00000F20D25F fcm1608-0603 STM32-DISCOVERY FCM1608 5075BMR-05-SM MB913 STM32F100 MC306-G-06Q-32.768 UM0627
Текст: нет текста в файле


Оригинал
PDF UM0919 STM32VLDISCOVERY STM32 STM32F100RB STM32F100RBT6B 64-контактный ESA8.00000F20D25F fcm1608-0603 STM32-ОТКРЫТИЕ FCM1608 5075БМР-05-СМ MB913 STM32F100 MC306-G-06Q-32.768 UM0627
2010 — АН3165

Реферат: stm32 foc STM32 управление асинхронным двигателем PMSM stm32 CCMR-2 TD352 stm32 MB459 дуговой сварочный инвертор viper12 design
Текст: нет текста в файле


Оригинал
PDF AN3165 STM32.STM32 AN3165 stm32 foc Управление асинхронным двигателем STM32 PMSM stm32 CCMR-2 TD352 MB459 инвертор для дуговой сварки viper12 дизайн
2010 — STM32F100RBT6B

Аннотация: stm32-Discovery UM0919 fcm1608-0603 STM32 Discovery MB913 FCM1608 ESA8.00000F20D25F Конфигурация контактов обнаружения линии значений stm32 STM32F10 * I2C
Текст: нет текста в файле


Оригинал
PDF UM0919 STM32VLDISCOVERY STM32 STM32F100RBT6B STM32F100RBT6B stm32-открытие UM0919 fcm1608-0603 STM32 Открытие MB913 FCM1608 ESA8.00000F20D25F Конфигурация вывода обнаружения строки значения stm32 STM32F10 * I2C
2009-2 7-сегментный

Аннотация: приложение графического дисплея stm32 JTAG CONNECTOR 20 PIN STM32-PerfStick-2 stm32-performancestick STM32 STM32-SK ЖК-дисплей STM32 Комплект разработчика USB 34-контактный разъем
Текст: нет текста в файле


Оригинал
PDF STM32-SK / HIT STR91X-SK / HIT, STM32 2 7-сегментный приложение с графическим дисплеем stm32 РАЗЪЕМ JTAG 20 КОНТАКТОВ STM32-PerfStick-2 stm32-performancestick СТМ32-СК ЖК дисплей Комплект разработчика STM32 USB 34-контактный разъем

Аудио ЦАП: STM32

Когда я начал проект Audio DAC, я хотел сосредоточиться на секции DAC и усилителя, а не увязнуть в хрень протокола.С этой целью я решил купить готовую микросхему USB to I2S и построил вокруг нее плату. К счастью, это сработало как рекламируется! Однако, когда я проектировал свою плату ЦАП, обнаружились некоторые ограничения.

В частности, проблема заключалась в главных часах I2S. Выбранная мной микросхема ЦАП требует мощности входного аудиосигнала, кратной 2. частота (например, если входная частота составляет 48 кГц, тактовая частота I2S должна быть кратной мощности 2, например, 12,288 МГц). Однако Выбранная мной микросхема (CP2615) выдает фиксированные основные тактовые частоты I2S 12 МГц.Поэтому вместо того, чтобы пытаться найти другую микросхему ЦАП, я глядя на разные пути.

Вариант: использование ЦАП для создания собственных часов

PCM5242 имеет возможность принимать входные часы в GPIO, умножать их, а затем, при желании, выводить через GPIO. Похоже, это сработало, как я показал в своем последнем посте. Однако меня это раздражает по паре причин. Во-первых, это не то место, где можно сбивать тактовые сигналы — мне нужен чип ЦАП. делать одно и делать это хорошо: создавать аналоговые аудиосигналы.Во-вторых, для этого нужно что-то запрограммировать Регистры I2C для настройки микросхемы. Это означает добавление микроконтроллера, который также может делать некоторые другие вещи…

Вариант: Замена микросхемы USB-2-I2S с микроконтроллером

… другие вещи, такие как фактическое получение аудиопакетов через USB и вывод их на ЦАП через I2S. Итак, давайте посмотрим как это могло бы выглядеть. Одним из недостатков является то, что микроконтроллер имеет приличное количество зависимостей (например, кристаллы, конденсаторы, загрузчики и т. д.), которых я надеялся избежать.

В предыдущей компании мы много использовали микроконтроллеры STM32. Они относительно дешевы, мощны и имеют хорошую документацию и инструменты поддержки. У меня оказался NUCLEO-F746ZG под рукой, так что я начал там. Этот конкретный чип довольно силен для этой задачи, но это хорошая отправная точка. Кроме того, он поддерживает режим USB-устройства и выход I2S, что для меня сейчас важно.

STM32CubeMX

В экосистеме STM32 хорошо то, что у них есть инструмент настройки, позволяющий довольно быстро начать работу.Этот инструмент называется STM32CubeMX, и это хороший графический интерфейс, который помогает настроить периферийные устройства, часы и тому подобное. По крайней мере, для меня это экономит много времени!

У них также есть собственная установка Eclipse, которую они распространяют как STM32CubeIDE. В него встроен STM32CubeMX, так что это довольно приличный способ запустить проект, скомпилировать его, загрузить на плату и отладить (используя ручку Nucleo board’s встроенный интерфейс отладки). Все это хорошо!

Тем не менее, я столкнулся с некоторыми раздражающими вещами, которые хотел задокументировать, как для себя в будущем, так и для всего остального!

Создать новый проект CubeMX довольно просто.Я просто выбрал свою доску из списка, и мы поехали!

Создание проекта

Назовите проект

Инициализировать все периферийные устройства

Примечание: важно выбрать Да на этом экране, если вы не хотите вручную выяснить, как настроить все часы. источники.

Создан проект

Отладка проекта

На этом шаге проект компилируется, выгружается на плату и инициализируется отладчик, останавливается на main () .Первый раз если выбрать этот вариант (сочетание клавиш: F11 ), откроется окно конфигурации. Я оставил значения по умолчанию.

Остановлено

Запускаем проект

При выборе «Возобновить» ( F8 ) программа запускается, и все кажется выключенным и работающим.

Хорошо, похоже, плата загружается и работает нормально. Теперь давайте включим аудиоинтерфейс USB.

Вернувшись в перспективу C / C ++ , откройте файл .ioc , который вызывает инструмент настройки CubeMX.

Включение промежуточного программного обеспечения USB Audio

Выберите «Middleware», а затем «USB_DEVICE»:

Выберите «Класс аудиоустройства» в раскрывающемся списке «Класс для IP-адресации FS».

Измените параметр USBD_AUDIO_FREQ

Обратите внимание, что в этом поле по умолчанию установлено 22100 выборок / сек. Я не уверен, почему это так, поскольку код, похоже, не поддерживает это; согласно комментарию вверху usbd_audio.c , поддерживается только 48 кГц:

  Текущая версия аудио класса поддерживает следующие аудио функции:
- Формат импульсной модуляции (PCM)
- частота дискретизации: 48 кГц.- Разрядность: 16
- Количество каналов: 2
- Нет регулятора громкости
- Возможность отключения / включения звука
- Асинхронные конечные точки
  

Измените это значение на 48000 . Нажмите «Сохранить», чтобы сгенерировать обновленный код.

Отладка проекта

Еще раз выберите F11 для отладки проекта. Это перестраивает файл .ELF, мигает плату и подготавливает ее к бег. При нажатии F8 для возобновления проект запускается.

Подключите USB

Затем я подключил свою плату Nucleo к своему рабочему столу Windows 10 и….

Ну, это не весело. Используя Windows USB Device Viewer , я получил немного больше информации об этом:

  [Port4] FailedEnumeration: Неизвестное USB-устройство (ошибка запроса дескриптора устройства)


Возможность подключения пользователя порта: да
Возможность отладки порта: нет
Номер порта компаньона: 0
Символическое имя ссылки Companion Hub:
Поддерживаемые протоколы:
 USB 1.1: есть
 USB 2.0: есть
 USB 3.0: нет

       --- ===> Информация об устройстве <=== ---

ConnectionStatus: FailedEnumeration
Текущее значение конфигурации: 0x00 -> Скорость шины устройства: полная (не поддерживает SuperSpeed ​​или выше)
Адрес устройства: 0x00
Открытые трубы: 0
*! * ОШИБКА: Нет открытых каналов!

          ===> Дескриптор устройства <===
*! * ОШИБКА: неверно bLength, равное 0, должно быть 18
b Длина: 0x00
bDescriptorType: 0x00
bcdUSB: 0x0000
bDeviceClass: 0x00
*! * ОШИБКА: сбой при перечислении устройств.
  

Ха, в этом нет особого смысла.После небольшого поиска в Google я нашел несколько полезных указаний: эта проблема связана с отсутствием пространства кучи; проект необходимо перенастроить, чтобы увеличить его кучу, чтобы разместить аудиобуфер.

Вернувшись в перспективу C / C ++ , снова откройте файл .ioc . На этот раз перейдите на вкладку «Диспетчер проектов»:

Обновите поле «Минимальный размер кучи» до 0x2800 . Обратите внимание, что это поле странное, и кажется, что если вы переместите мышь вне текстового поля, он потеряет фокус.Снова сохраните проект (при этом будут повторно сгенерированы исходные файлы).

Перезапустите проект ( F11 -> F8 -> Подключить USB), и… та же проблема!

Удаление устройства

Хорошо, я знаю, что Windows пытается с умом запоминать устройства, поэтому, возможно, она не выполняет полное перечисление для устройства. Я удалил устройство и снова подключил его, но возникла та же проблема.

Посмотрите файлы компоновщика

Интересно, что проект содержит два файла компоновщика: один для нехватки Flash, а другой для нехватки RAM (предположительно).Это два файла: STM32F746ZGTX_FLASH.ld и STM32F746ZGTX_RAM.ld .

Файл _FLASH.ld обновлен правильно:

  _Min_Heap_Size = 0x2800; / * необходимое количество кучи * /
_Min_Stack_Size = 0x400; / * необходимое количество стека * /
  

, но в файле _RAM.ld нет:

  _Min_Heap_Size = 0x200; / * необходимое количество кучи * /
_Min_Stack_Size = 0x400; / * необходимое количество стека * /
  

Я не уверен, почему это так, но меняю _RAM.ld , чтобы иметь тот же _Min_Heap_Size не имело значения.

Хорошо, у меня был заведомо хороший проект, который работал, поэтому я сравнил с ним. По большей части разницы не было! Однако по какой-то причине в заведомо исправном проекте был вызов MX_USB_DEVICE_Init () , который отсутствовал в этом проекте. Я создавал для этого сообщения в блоге. Я не совсем уверен, как это настраивается через интерфейс CubeMX, но в итоге я отключение параметров промежуточного ПО USB и USB-устройства, повторное создание проекта и повторное включение USB-устройства.На что страницы, я включил глобальное прерывание USB On The Go FS сначала , а затем , затем , чтобы включить промежуточное ПО USB.

Как только я это сделал, затем заново сгенерировал проект, перестроил проект и запустил его на целевом оборудовании, ура, устройство правильно пронумеровано в Windows!

Вот обновленный вывод средства просмотра USB-устройств:

  [Port4]: композитное USB-устройство  Возможность подключения пользователя порта: да
Возможность отладки порта: нет
Номер порта компаньона: 0
Символическое имя ссылки Companion Hub:
Поддерживаемые протоколы:
 USB 1.1: да
 USB 2.0: есть
 USB 3.0: нет  Состояние питания устройства: PowerDeviceD0  --- ===> Информация об устройстве <=== ---
Название продукта на английском языке: "STM32 Audio Class"  Состояние подключения:
Текущее значение конфигурации: 0x01 -> Скорость шины устройства: полная (не поддерживает SuperSpeed ​​или выше)
Адрес устройства: 0x30
Открытые трубы: 0
*! * ОШИБКА: Нет открытых каналов!  ===> Дескриптор устройства <===
b Длина: 0x12
bDescriptorType: 0x01
bcdUSB: 0x0201
bDeviceClass: 0x00 -> Это устройство, определяемое классом интерфейса
bDeviceSubClass: 0x00
bDeviceProtocol: 0x00
bMaxPacketSize0: 0x40 = (64) байта
idVendor: 0x0483 = STMicroelectronics
idProduct: 0x5740
bcdУстройство: 0x0200
Производитель: 0x01
 Английский (США) «STMicroelectronics»
iProduct: 0x02
 Английский (США) "STM32 Audio Class"
iSerialNumber: 0x03
 Английский (США) "377C315A3234"
bNumConfigurations: 0x01  --- ===> Полный дескриптор конфигурации <=== ---  ===> Дескриптор конфигурации <===
b Длина: 0x09
bDescriptorType: 0x02
wTotalLength: 0x006D -> Подтверждено
bNumInterfaces: 0x02
bConfigurationValue: 0x01
iConfiguration: 0x00
Атрибуты bmA: 0xC0 -> Автономное питание
MaxPower: 0x32 = 100 мА  ===> Дескриптор интерфейса <===
b Длина: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x00
bAlternateSetting: 0x00
bNumEndpoints: 0x00
bInterfaceClass: 0x01 -> Класс аудиоинтерфейса
bInterfaceSubClass: 0x01 -> Подкласс интерфейса управления звуком
bInterfaceProtocol: 0x00
iInterface: 0x00  ===> Дескриптор заголовка интерфейса управления звуком <===
b Длина: 0x09
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x01 (ЗАГОЛОВОК)
bcdADC: 0x0100
wTotalLength: 0x0027
bInCollection: 0x01
baInterfaceNr [1]: 0x01  ===> Дескриптор входного терминала управления звуком <===
bДлина: 0x0C
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x02 (INPUT_TERMINAL)
bTerminalID: 0x01
wTerminalType: 0x0101 (потоковая передача по USB)
bAssocTerminal: 0x00
bNrChannels: 0x01
wChannelConfig: 0x0000
iChannelNames: 0x00
iTerminal: 0x00  ===> Дескриптор устройства управления звуком <===
b Длина: 0x09
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x06 (FEATURE_UNIT)
bUnitID: 0x02
bSourceID: 0x01
bControlSize: 0x01
bmaControls [мастер]: 01
 (Немой)
bmaControls [канал 0]: 00
iFeature: 0x00  ===> Дескриптор выходного терминала управления звуком <===
b Длина: 0x09
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x03 (OUTPUT_TERMINAL)
bTerminalID: 0x03
wTerminalType: 0x0301 (динамик)
bAssocTerminal: 0x00
bSourceID: 0x02
iTerminal: 0x00  ===> Дескриптор интерфейса <===
b Длина: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x01
bAlternateSetting: 0x00
bNumEndpoints: 0x00
bInterfaceClass: 0x01 -> Класс аудиоинтерфейса
bInterfaceSubClass: 0x02 -> Подкласс интерфейса аудиопотока
bInterfaceProtocol: 0x00
iInterface: 0x00  ===> Дескриптор интерфейса <===
b Длина: 0x09
bDescriptorType: 0x04
bInterfaceNumber: 0x01
bAlternateSetting: 0x01
bNumEndpoints: 0x01
bInterfaceClass: 0x01 -> Класс аудиоинтерфейса
bInterfaceSubClass: 0x02 -> Подкласс интерфейса аудиопотока
bInterfaceProtocol: 0x00
iInterface: 0x00  ===> Дескриптор интерфейса, специфичный для класса потокового аудио <===
b Длина: 0x07
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x01 (AS_GENERAL)
bTerminalLink: 0x01
b Задержка: 0x01
wFormatTag: 0x0001 (PCM)  ===> Дескриптор типа формата аудиопотока <===
bДлина: 0x0B
bDescriptorType: 0x24 (CS_INTERFACE)
bDescriptorSubtype: 0x02 (FORMAT_TYPE)
bFormatType: 0x01 (FORMAT_TYPE_I)
bNrChannels: 0x02
bSubframeSize: 0x02
bBit Разрешение: 0x10 (16)
bSamFreqType: 0x01 (дискретный)
tSamFreq [1]: 0x00BB80 (48000 Гц)  ===> Дескриптор конечной точки <===
b Длина: 0x09
bDescriptorType: 0x05
bEndpointAddress: 0x01 -> Направление: OUT - EndpointID: 1
Атрибуты bmA: 0x01 -> Тип изохронной передачи, Тип синхронизации = Нет синхронизации, Тип использования = Конечная точка данных
wMaxPacketSize: 0x00C0 = 0xC0 байт
wInterval: 0x0001
bSyncAddress: 0x00  ===> Дескриптор конечной точки аудиоданных, специфичный для класса потоковой передачи аудио <===
b Длина: 0x07
bDescriptorType: 0x25 (CS_ENDPOINT)
bDescriptorSubtype: 0x01 (EP_GENERAL)
bmAttributes: 0x00
bLockDelayUnits: 0x00 (Не определено)
wLockDelay: 0x0000  ===> Дескриптор BOS <===
b Длина: 0x05
bDescriptorType: 0x0F
wTotalLength: 0x000C
bNumDeviceCaps: 0x01  ===> USB 2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *