STM32F429: аналого-цифровые преобразователи (АЦП) |
![]() |
Добавил(а) microsin | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В микроконтроллер STM32F429 встроено 3 аналого-цифровых преобразователя (analog-to-digital converters, ADC). Каждый ADC поддерживает разрешающую способность до 12 бит, и может оцифровывать сигнал, поступающий по 16 внешним каналам, выполняя преобразования в одиночном режиме (single-shot mode) или режиме сканирования (scan mode). В режим сканирования автоматическое преобразование выполняется на выбранной группе аналоговых входов. Непонятные термины и сокращения см. в Словарике [3]. Дополнительные логические функции, встроенные в интерфейс ADC: • Одновременные выборка и хранение (simultaneous sample and hold). ADC может поддерживаться контроллером DMA. Функция analog watchdog позволяет очень точно мониторить преобразуемое напряжение на одном, нескольких или всех выбранных каналах. Прерывание генерируется, когда преобразуемое напряжение выходит за пределы запрограммированных порогов. Для синхронизации аналого-цифрового преобразования на нужную частоту дискретизации сигнала ADC должен запускаться от одного из таймеров TIM1, TIM2, TIM3, TIM4, TIM5 или TIM8. Таблица 10. Нумерация и функции выводов микроконтроллеров STM32F427xx и STM32F429xx.
Примечания: (1). Имя в этой колонке обозначает функцию вывода по умолчанию, работающую после сброса. Доступность функции зависит от выбранной модели микроконтроллера, см. его даташит. (5) FT = 5V tolerant (входы допускают уровень 5V), за исключением случая, когда активен аналоговый режим или режим генератора (для PC14, PC15, PH0 и PH1). S обозначает вывод для подачи питания. (6) Если микроконтроллер поставляется в корпусах WLCSP143, UFBGA169, UFBGA176, LQFP176 или TFBGA216, и вывод BYPASS_REG установлен на VDD (режим Regulator OFF/internal reset ON), то ножка PA0 используется как внутренний сброс Reset (с активным уровнем лог. 0). [Общее описание ADC] ADC работает по принципу последовательного приближения (successive approximation). У него всего может быть до 19 мультиплексированных каналов, позволяющих измерять сигналы от 16 внешних источников, двух внутренних источников и от канала VBAT. Аналого-цифровое преобразование каналов может производиться в режимах single, continuous, scan или discontinuous. Результат ADC сохраняется в 16-битном регистре данных с выравниванием этих данных влево или вправо. Функция analog watchdog позволяет приложению детектировать ситуацию, когда входное напряжение выходит за пределы верхнего или нижнего порогов, определяемых пользователем. Основные функции и возможности ADC: • Программируемая разрешающая способность 12, 10, 8 или 6 бит. Примечание: вывод VREF–, если он присутствует (в зависимости от типа корпуса микроконтроллера), должен быть подтянут к VSSA. [Важные замечания по использованию АЦП STM32] 1. В микроконтроллере STM32 может быть от 1 до 3 блоков ADC, в зависимости от модели. У STM32F4x их три: ADC1, ADC2 и ADC3 (в описании для обозначения произвольного блока АЦП используется аббревиатура ADCx). 2. Блок ADCx может через мультиплексор подключаться к какому-либо входному каналу. Всего есть 16 внешних каналов от IN0 до IN15 (для ссылки на произвольный канал здесь используется аббревиатура INy), которые могут быть привязаны к ножкам GPIO микроконтроллера. Кроме этих внешних каналов есть еще внутренние дополнительные, через которые можно опрашивать встроенный датчик температуры, VREFINT или VBAT. Обратите внимание, что каждый блок ADCx имеет свой набор каналов, к которым его можно привязать. Т. е. нельзя к любому ADCx привязать любой канал INy. Поэтому ножки портов GPIO, которые могут быть назначены как входы ADC, обозначаются довольно хитрым, не сразу понятным способом. Например, для STM32F4x в корпусе LQFP144 (см. врезку выше): - ADC3_IN4, ADC3_IN5, ADC3_IN6, ADC3_IN7, ADC3_IN8, ADC3_IN9, ADC3_IN14, ADC3_IN15 Эти имена ножек означают, что они могут быть привязаны к блоку ADC3 в качестве каналов 4 .. 9, 14, 15. 3. Имеется встроенный источник опорного напряжения VREFINT (типовая величина напряжения 1.21V), однако для АЦП всегда используется только внешнее опорное напряжение VREF. Таким образом, VREFINT может использоваться только для калибровки внешнего опорного напряжения, если необходимо точно измерять уровень сигнала на входе АЦП. Для внешнего опорного напряжения используются отдельные выводы VREF- и VREF+ (их наличие зависит от модели и корпуса микроконтроллера). Однако их уровни имеют жесткие ограничения, привязанные сооветственно к GND и VDD/VDDA (обычно 3.3V). Поэтому разработчики часто VREF- накоротко замыкают на GND, а VREF+ соединяют c VDD (в простейшем случае напрямую, либо при особых требованиях через RC-цепочку или фильтр). В этом случае, если VDD установлено с невысокой точностью, но требуется повышенная точность измерения абсолютного уровня, то применяют калибровку VREF по внутреннему напряжению VREFINT с учетом калибровочных данных, запрограммированных производителем на заводе. У STM32F4 это ячейка памяти из двух байт по адресам 0x1FFF7A2A и 0x1FFF7A2B, где записаны сырые данные преобразования ADC, снятые при определенных условиях. См. ниже врезку "Параметры ADC", таблицы 83 и 84. 4. Каналы АЦП бывают двух типов: регулярные (regular) и инжектированные (injected). Название "инжектированный" означает, что запуск преобразования этого канала может быть "вставлено" между преобразованиями регулярных каналов, т. е. обработка регулярных каналов при этом приостанавливается. Инжектированные каналы опрашиваются между регулярными. Особенность инжектированного канала заключается в том, что у него есть свой отдельный регистр для сохранения результата. То есть если каналы IN0, IN1, IN2, IN3 настроить как инжектированные, то их результаты преобразования будут сохранены в четыре разных регистра (ADCx_JDR1, ADCx_JDR2, ADCx_JDR3, ADCx_JDR4). Инжектированных каналов для ADCx не может быть больше четырёх. Любой доступный аналоговый вход (доступность зависит от модели и корпуса микроконтроллера) можно настроить как инжектированный канал. Регулярные каналы предназначены для обработки входных сигналов поочередно, с определенной периодичностью. Поэтому они и называются регулярными. У регулярных каналов есть только один регистр для забора результатов, выделенный на все каналы - ADCx_DR. То есть если каналы РА0, РА1, РА2, РА3 настроить как регулярные для какого-то из ADCx, то результат работы каждого канала будет записываться в один и тот же регистр, затирая предыдущие данные. Т. е. если не успели своевременно забрать данные, то они будут потеряны. Эту проблему позволяет решить функция DMA. 5. Используя режим сдвоенных преобразований, можно превратить два ADC в один, работающий на более высокой скорости преобразования. 6. Результат преобразования ADCx имеет беззнаковый тип. Это не всегда удобно для приложений DSP, которые часто применяют числа со знаком. Возможность выравнивания результата влево (в старшие разряды) удобно использовать для получения значения выборки в формате 16-битного числа со знаком (двоичное дополнение, тип short). Подсистема АЦП STM32 намного сложнее в сравнении с традиционными 8-битными микроконтроллерами AVR. По этой причине документация документация обширная, и в ней довольно трудно разобраться. Целесообразно пользоваться готовыми примерами кода, которые можно найти в библиотеке STM32Cube, и на основе их создавать собственные приложения. Рис. 44. Блок-схема одного из ADC. Таблица 65. Выводы ADC.
Примечание (1): на корпусе LQFP144 вывода VREF- нет, он соединен внутри кристалла с выводом VSSA. Управление включением и выключением ADC. ADC включается путем установки бита ADON в регистре ADC_CR2. Когда бит ADON установлен первый раз, это выводит ADC из режима выключения (Power-down mode). Преобразование запускается, когда установлен либо бит SWSTART, либо бит JSWSTART. Вы можете остановить преобразование и перевести ADC в режим выключения (power down mode) очисткой бита ADON. В этом режиме ADC почти не потребляет тока (только несколько микроампер). Тактирование ADC. Существует две схемы тактирования: • Тактирование аналоговых схем: ADCCLK, это общее тактирование для всех ADC. Эти такты генерируются из тактов APB2, поделенных программируемым прескалером, который позволяет ADC работать на частотах fPCLK2/2, /4, /6 или /8. См. даташит для того, чтобы узнать максимальное значение ADCCLK. Выбор канала. Имеется 16 мультиплексированных каналов. Их можно организовать в 2 группы: regular и injected. Группа состоит из последовательности преобразований, которые могут быть выполнены на любом канале и в любом порядке. Например, можно реализовать последовательность преобразования в следующем порядке: ADC_IN3, ADC_IN8, ADC_IN2, ADC_IN2, ADC_IN0, ADC_IN2, ADC_IN2, ADC_IN15. • В группу regular может входить до 16 преобразований. Каналы regular и их порядок в последовательности преобразований должны быть выбраны в регистрах ADC_SQRx. Общее количество преобразований в группе regular должно быть записано в биты L[3:0] регистра ADC_SQR1. Если регистры ADC_SQRx или ADC_JSQR модифицируются во время преобразования, то текущее преобразование сбрасывается, и в ADC отправляется новый импульс запуска для преобразования новой выбранной группы. • В микроконтроллерах STM32F40x и STM32F41x датчик температуры (temperature sensor) подключен внутри кристалла к каналу ADC1_IN16. Внутреннее опорное напряжение VREFINT подключено к ADC1_IN17. Канал VBAT (подключенный к каналу ADC1_IN18) может быть также преобразован как канал injected или канал regular. Примечание: каналы датчика температуры, VREFINT и VBAT доступны только на периферии ADC1. Режим одиночного преобразования (single conversion mode). В этом режиме ADC после запуска делает только одно преобразование. Этот режим запускается с битом CONT, равным 0, от одного из следующих сигналов: • Установка бита SWSTART в регистре ADC_CR2 (только для канала regular). Таблица 80. Характеристики датчика температуры.
Примечания: (1) Гарантируется результатами испытаний характеристик. Таблица 81. Значения калибровки датчика температуры.
Таблица 82. Характеристики мониторинга VBAT.
Примечания: (1) Гарантируется дизайном. Когда выполнится преобразование выбранного канала: • Если был преобразован канал regular: – Преобразованные данные сохраняются в 16-битный регистр ADC_DR. • Если был преобразован канал injected: – Преобразованные данные сохраняются в 16-битный регистр ADC_JDR1. После этого ADC останавливается. Режим непрерывных преобразований (сontinuous conversion mode). В этом режиме ADC немедленно запустит новое преобразование сразу после завершения текущего. Этот режим запускается с битом CONT, равным 1, либо от внешнего триггера, либо установкой бита SWSTRT в регистре ADC_CR2 (только для каналов regular). После каждого преобразования (если преобразовалась группа каналов regular): – Последние преобразованные данные сохраняются в 16-битный регистр ADC_DR. Примечание: каналы injected не могут преобразовываться в режиме continuous. Единственное исключение - когда канал injected сконфигурирован для автоматического преобразования после каналов regular в режиме continuous (с помощью бита JAUTO), см. секцию Auto-injection). Диаграмма времени. Как показано на рис. 45, для ADC требуется время стабилизации tSTAB перед тем, как он сможет точно выполнить преобразование. После старта преобразования ADC и после 15 тактовых импульсов установится флаг EOC, и в 16-битном регистре данных ADC появится результат преобразования. Рис. 45. Диаграмма времени работы ADC. Analog watchdog. Бит статуса AWD для analog watchdog установится, если аналоговое напряжение, преобразуемое ADC, окажется ниже нижнего порога или выше верхнего порога. Эти пороги программируются в 12 младших битах 16-битных регистров ADC_HTR и ADC_LTR. Прерывание может быть разрешено битом AWDIE в регистре ADC_CR1. Значение порога не зависит от выравнивания, выбранного битом ALIGN в регистре ADC_CR2. Аналоговое напряжение сравнивается с нижним и верхним порогами перед выравниванием. Рис. 46. Защищенная область analog watchdog. Таблица 66 показывает, как должен быть сконфигурирован регистр ADC_CR1, чтобы разрешить analog watchdog на одном или большем количестве каналов. Таблица 66. Выбор канала analog watchdog.
Примечание (1): выбирается битами AWDCH[4:0]. Режим сканирования. Этот режим используется для сканирования группы аналоговых каналов. Режим сканирования выбирается установкой бита SCAN в регистре ADC_CR1. Как только этот бит установлен, ADC сканирует все каналы, выбранные регистрами ADC_SQRx (для каналов regular) или в регистре ADC_JSQR (для каналов injected). Одиночное преобразование выполняется для каждого канала группы. После каждого окончания преобразования, автоматически преобразуется следующий канал в группе. Если установлен бит CONT, то преобразование канала regular не останавливается на последнем выбранном канале группы, вместо этого снова запускается преобразование на первом выбранном канале группы. Если установлен бит DMA, то контроллер прямого доступа к памяти (direct memory access, DMA) используется для переноса данных, преобразованных из группы каналов regular (сохраненных в регистре ADC_DR) в SRAM после преобразования каждого канала regular. В регистре ADC_SR установится бит EOC: • По окончании каждой последовательности группы regular, если бит EOCS сброшен в 0. Данные, преобразованные из injected-канала всегда сохраняются в регистрах ADC_JDRx. [Управление инжектированными каналами] Инжектирование по триггеру. Для triggered injection бит JAUTO в регистре ADC_CR1 должен быть сброшен в 0. 1. Запуск преобразования группы каналов regular осуществляется либо внешним триггером, либо установкой бита SWSTART в регистре ADC_CR2. Примечание: при использовании triggered injection необходимо убедиться, что интервал между событиями триггера больше, чем последовательность injection. Например, если длина последовательности 30 тактов ADC (т. е. 2 преобразования со временем выборки 3 тактовых периода), то минимальный интервал между триггерами должен быть 31 такт ADC. Рис. 47. Латентность injected-преобразования. Примечание (1): максимальное значение латентности можно найти в электрических характеристиках даташитов на микроконтроллеры STM32F4xx. Auto-injection. Если установлен бит JAUTO, то каналы в группе injected автоматически преобразуются после regular-группы каналов. Это может использоваться для преобразования последовательности до 20 преобразований, запрограммированных регистрами ADC_SQRx и ADC_JSQR. В этом режиме должен быть запрещен внешний триггер на injected-каналах. Если в дополнение к биту JAUTO также установлен бит CONT, то regular-каналы, за которыми идут injected-каналы, будут непрерывно преобразовываться. Примечание: невозможно использовать одновременно режимы auto-injected и discontinuous. [Прерывистый (discontinuous) режим] Группа regular. Этот режим разрешается установкой бита DISCEN в регистре ADC_CR1. Режим может использоваться для преобразования короткой последовательности из n преобразований (n ≤ 8), это часть последовательности преобразований, выбранных в регистрах ADC_SQRx. Значение n задается записью в биты DISCNUM[2:0] регистра ADC_CR1. Когда срабатывает внешний триггер, это запускает следующие n преобразований, выбранных регистрами ADC_SQRx, пока не выполнятся все преобразования в последовательности. Общая длина последовательности определяется битами L[3:0] регистра ADC_SQR1. Пример: • n = 3, каналы для преобразования 0, 1, 2, 3, 6, 7, 9, 10. Примечание: когда группа regular преобразуется в режиме discontinuous, пролонгация не происходит. Когда все подгруппы преобразованы, следующий триггер запустит преобразование первой подгруппы. В показанном выше примере 4-й триггер заново преобразует каналы 0, 1 и 2 в 1-й подгруппе. Группа injected. Этот режим разрешается установкой бита JDISCEN в регистре ADC_CR1. Режим может использоваться для преобразования последовательности, выбранной регистром ADC_JSQR, канал за каналом, после события внешнего триггера. Когда происходит событие внешнего триггера, оно запускает преобразования следующего канала, выбранного в регистре ADC_JSQR, пока не выполнятся все преобразования в последовательности. Общая длина последовательности определяется битами JL[1:0] в регистре ADC_JSQR. Пример: n = 1, каналы для преобразования 1, 2, 3. • 1-й триггер: преобразуется канал 1. Примечание: когда все injected-каналы преобразованы, следующий триггер запустит преобразование первого injected-канала. В показанном выше примере 4-й триггер снова преобразует 1-й injected канал 1. Невозможно использовать одновременно оба режима auto-injected и discontinuous. Режим discontinuous не должен одновременно устанавливаться для regular-группы и injected-группы. Режим discontinuous должен быть разрешен только для преобразования одной группы каналов. [Выравнивание данных] Бит ALIGN в регистре ADC_CR2 выбирает выравнивание данных, сохраняемых после преобразования. Данные могут быть выравнены вправо или влево, как показано на рисунках 48 и 49. Рис. 48. Правое выравнивание 12-битных данных. Рис. 49. Левое выравнивание 12-битных данных. Значение преобразованных данных из injected группы каналов уменьшается на определяемое пользователем смещение, записанное в регистры ADC_JOFRx, чтобы результат мог стать отрицательным значением. Бит SEXT представляет расширенное значение со знаком. Для каналов в группе regular никакое смещение не вычитается, поэтому всегда значащими будут 12 бит. Специальный случай: при левом выравнивании данные выравниваются на базе половины слова (в 2 байтах), кроме установленной разрядности 6 бит. Для 6-битной разрядности данные выравниваются на базе одного байта, как показано на рис. 50. Рис. 50. Левое выравнивание 6-битных данных. [Программируемое время выборки в каждом канале] ADC оцифровывает входное напряжение за ADCCLK тактов, что может быть изменено битами SMP[2:0] регистров ADC_SMPR1 и ADC_SMPR2. У каждого канала может быть отличающееся время выборки (sampling time). Общее время преобразования вычисляется следующим образом: Tconv = время выборки + 12 тактов Пример: при ADCCLK = 30 MHz и времени выборки 3 такта, Tconv = 3 + 12 = 15 тактов = 0.5 мкс при APB2 на частоте 60 МГц. [Преобразование по внешнему триггеру и полярность триггера] Преобразование может быть запущено от внешнего события (например timer capture, линия EXTI). Если быты управления EXTEN[1:0] (для regular-преобразования) или биты JEXTEN[1:0] (для injected-преобразования) отличаются от 0b00, то внешние события с выбранной полярностью могут запустить преобразование. Таблица 67 предоставляет соответствие между значениями EXTEN[1:0] и JEXTEN[1:0] и полярностью триггера. Таблица 67. Конфигурирование полярности триггера.
Примечание: полярность внешнего триггера можно менять на лету. Биты управления EXTSEL[3:0] и JEXTSEL[3:0] используются для выбора, какое из 16 возможных событий может запустить преобразование для regular или injected группы. В таблице 68 приведен возможный внешний триггер для regular-преобразования. Таблица 68. Внешний триггер для каналов regular.
В таблице 69 приведен возможный внешний триггер для injected-преобразования.
Программно инициируемый триггер может быть сгенерирован установкой бита SWSTART (для regular-преобразования) или бита JSWSTART (для injected-преобразования) в регистре ADC_CR2. Преобразование группы regular может быть прервано injected-триггером. Примечание: выбор триггера может быть осуществлен на лету. Однако при смене выбора есть окно времени 1 такт APB, в течение которого детектирование триггера запрещено. Это сделано для того, чтобы избежать случайного детектирования во время изменений. [Режим быстрого преобразования (fast conversion mode)] Есть возможность ускорить преобразование путем уменьшение разрешающей способности (разрядности) ADC. Биты RES используются для выбора количества бит, доступных в регистре данных. Минимальное время преобразования для каждого варианта разрядности следующее: 12 бит: 3 + 12 = 15 тактов ADCCLK [Управление данными] Использование DMA. Поскольку преобразованные значения regular-канала сохраняются в одном уникальном регистре данных, полезно использовать DMA для преобразования больше одного regular-канала. Это позволит избежать потери данных, которые уже сохранены в регистре ADC_DR. Когда разрешен режим DMA (бит DMA в регистре ADC_CR2 установлен в лог. 1), после каждого преобразования regular-канала генерируется запрос DMA. Это позволяет передать преобразованные данные из регистра ADC_DR в место назначения, выбранное программой. Несмотря на это, в случае потери данных (переполнения) устанавливается бит OVR в регистре ADC_SR, и генерируется прерывание (если установлен бит разрешения прерывания OVRIE). Тогда передачи DMA запрещаются, и запросы DMA больше не принимаются. В этом случае, если делается запрос DMA, regular-преобразования обрываются, и дальнейшие regular-триггеры игнорируются. Необходимо очистить флаг OVR и бит DMAEN в используемом потоке DMA (DMA stream), и заново инициализировать и DMA, и ADC, чтобы преобразованные желаемые данные передавались в правильную ячейку памяти. Только после этого преобразование может быть возобновлено, и передача данных снова разрешена. Преобразования injected-канала не чувствительны к ошибкам overrun. Когда OVR = 1 в режиме DMA, запросы DMA блокируются после последних достоверных переданных данных. Это означает, что все данные, переданные в RAM, можно считать достоверными. После окончания последней передачи DMA (количество передач конфигурируется в регистре DMA_SxNTR контроллера DMA): • Новые запросы DMA не выдаются в контроллер DMA, если бит DDS в регистре ADC_CR2 сброшен в 0 (это позволяет избежать ошибки overrun). Однако бит DMA не очищается аппаратно. В него должен быть записан 0, затем 1 для запуска новой передачи. Для восстановления ADC из состояния OVR, когда используется DMA, выполните следующие шаги: 1. Переинициализируйте DMA (настройте адрес назначения и счетчик NDTR). Управление последовательностью преобразований без использования DMA. Если преобразования происходят достаточно медленно, то последовательность преобразования можно обрабатывать программно. В этом случае бит EOCS в регистре ADC_CR2 должен быть установлен, чтобы бит статуса EOC устанавливался по окончанию каждого преобразования, не только по окончанию последовательности. Когда EOCS = 1, детектирование overrun автоматически разрешается. Поэтому каждый раз по завершению преобразования бит EOC устанавливается, и можно прочитать регистр данных ADC_DR. Обработка overrun та же самая, как и в ситуации использования DMA. Для восстановления ADC из состояния OVR, когда установлен бит EOCS, выполните следующие шаги: 1. Очистите бит ADC OVR в регистре ADC_SR. Преобразования без DMA и без детектирования overrun. Может быть полезно позволить ADC преобразовать один или большее число каналов без чтения данных каждый раз по окончании преобразования (например, если используется analog watchdog). Для этого DMA должен быть запрещен (DMA = 0), и бит EOC должен быть установлен только по окончании последовательности (EOCS = 0). В такой конфигурации детектирование overrun запрещено. [Multi ADC] В микроконтроллерах, где два ADC или больше, могут использоваться режимы Dual (с двумя ADC) и Triple (с тремя ADC), см. рис. 51. Рис. 51. Блок-схема Multi ADC. Примечания к рис. 51: (1) Хотя внешние триггеры присутствуют на ADC2 и ADC3, на этой диаграмме они не показаны. В режиме multi ADC запуск преобразования срабатывает альтернативно или одновременно от ADC1 master для slave ADC2 и ADC3, в зависимости от выбранного режима битами MULTI[4:0] в регистре ADC_CCR. Примечание: в режиме multi ADC, когда конфигурируется триггер преобразования от внешнего события, приложение должно установить триггер только от master, и запретить триггер от slave, чтобы предотвратить случайные триггеры, которые могут запустить нежелательные slave-преобразования. Реализованы 4 возможных режима: • Injected simultaneous mode Также можно использовать предыдущие режимы, сконфигурированные следующими способами: • Injected simultaneous mode + Regular simultaneous mode Примечание: в режиме multi ADC преобразованные данные могут быть прочитаны в регистре данных multi-mode (ADC_CDR). Биты статуса могут быть прочитаны в регистре состояния multi-mode (ADC_CSR). Запросы DMA в режиме Multi ADC. В режиме Multi ADC блок DMA может быть сконфигурирован для передачи преобразованных данных в трех различных режимах. Во всех случаях используются потоки DMA, подключенные к ADC: – DMA mode 1: на каждом запросе DMA (доступен один элемент данных) передается половина слова (2 байта), представляющая данные преобразования ADC. В режиме Triple ADC данные ADC1 передаются на первом запросе, данные ADC2 передаются на втором запросе, и данные ADC3 передаются на третьем запросе; затем последовательность повторяется. Таким образом, DMA сначала передает данные ADC1, затем данные ADC2, затем данные ADC3, и так далее. Режим DMA 1 используется только в режиме simultaneous triple mode. Пример: Regular simultaneous triple mode: генерируются 3 последовательных запроса DMA (по одному на каждый преобразованный элемент данных). 1-й запрос: ADC_CDR[31:0] = ADC1_DR[15:0] – DMA mode 2: на каждом запросе DMA (доступны два элемента данных) 2 полуслова (2 по 2 байта) представляют два преобразованных ADC элемента данных, передаваемых как слово (4 байта). В режиме Dual ADC, данные обоих ADC2 и ADC1 передаются на первом запросе (ADC2 данные занимают старшее полуслово, и данные ADC1 занимают младшее полуслово), и так далее. В режиме Triple ADC генерируются три запроса DMA. На первом запросе передаются данные обоих ADC2 и ADC1 (ADC2 данные занимают старшее полуслово, и данные ADC1 занимают младшее полуслово). На втором запросе предаются данные обоих ADC1 и ADC3 (ADC1 данные занимают старшее полуслово, и данные ADC3 занимают младшее полуслово). На третьем запросе передаются данные обоих ADC3 и ADC2 (ADC3 данные занимают старшее полуслово, и данные ADC2 занимают младшее полуслово), и так далее. DMA mode 2 используется в interleaved mode и в regular simultaneous mode (только режим Dual ADC). Пример: a) Interleaved dual mode: запрос DMA генерируется каждый раз, когда доступны 2 элемента данных: 1-й запрос: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0] b) Interleaved triple mode: запрос DMA генерируется каждый раз, когда доступны 2 элемента данных: 1-й запрос: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0] – DMA mode 3: этот режим подобен DMA mode 2. Единственное различие состоит в том, что в каждом запросе DMA (доступны два элемента данных) два байта, представляющие два элемента данных, преобразованных ADC, передаются в виде полуслова. Порядок передачи данных аналогичен порядку передачи данных в режиме DMA 2. DMA mode 3 используется в interleaved mode с разрядностями 6 и 8 бит (dual и triple mode). Пример: a) Interleaved dual mode: запрос DMA генерируется каждый раз, когда доступны 2 элемента данных. 1-й запрос: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0] b) Interleaved triple mode: запрос DMA генерируется каждый раз, когда доступны 2 элемента данных. 1-й запрос: ADC_CDR[15:0] = ADC2_DR[7:0] | ADC1_DR[7:0] Детектирование overrun: если было определено overrun на одном из задействованных ADC (ADC1 и ADC2 в режимах dual и triple, ADC3 только в режиме triple), запросы DMA больше не выдаются, чтобы гарантировать, что все данные, переданные в RAM, достоверны. Может случиться так, что бит EOC, соответствующий одному из ADC, останется установленным, потому что регистр данных этого ADC содержит достоверные данные. Injected simultaneous mode. Этот режим преобразовывает инжектированную группу каналов. Сигнал внешнего триггера приходит от мультиплексора группы injected ADC1 (выбирается битами JEXTSEL[3:0] в регистре ADC1_CR2). Simultaneous trigger предоставлен для ADC2 и ADC3. Примечание: не следует преобразовывать один и тот же канал на двух/трех ADC (при преобразовании одного и того же канала нет перекрывающихся периодов дискретизации для двух/трех ADC). В simultaneous mode один должен преобразовать последовательности с одинаковой длиной, или гарантировать, чтобы интервалы между триггерами были больше, чем 2 последовательности (режим Dual ADC) / 3 последовательности (режим Triple ADC). Иначе ADC с более короткой последовательностью может перезапуститься, пока ADC с более длинной последовательностью завершает предыдущие преобразования. Regular преобразования можно выполнить на одном или на всех ADC. В этом случае они независимы друг от друга и прерываются при возникновении injected события. Они возобновляются в конце injected-группы преобразования. Режим Dual ADC. На событии завершения преобразования ADC1 или ADC2: • Преобразованные данные сохраняются в регистры ADC_JDRx каждого интерфейса ADC. Рис. 52. Injected simultaneous mode на 4 каналах: dual ADC mode. Режим Triple ADC. На событии завершения преобразования ADC1, ADC2 или ADC3: • Преобразованные данные сохраняются в регистрах ADC_JDRx каждого интерфейса ADC. Рис. 53. Injected simultaneous mode на 4 каналах: triple ADC mode. [Regular simultaneous mode] Этот режим выполняется на regular группе каналов. Сигнал внешнего триггера поступает из мультиплексора группы regular ADC1 (выбирается битами EXTSEL[3:0] в регистре ADC1_CR2). Simultaneous триггер предоставляется для ADC2 и ADC3. Примечание: не преобразуйте один и тот же канал на двух/трех ADC (при преобразовании одного и того же канала нет перекрывающихся периодов дискретизации для двух/трех ADC). В режиме regular simultaneous необходимо преобразовать последовательности с одинаковой длиной, или гарантировать, чтобы интервалы между триггерами были больше, чем 2 последовательности (режим Dual ADC) / 3 последовательности (режим Triple ADC). Иначе ADC с более короткой последовательностью может перезапуститься, пока ADC с более длинной последовательностью завершает предыдущие преобразования. Injected-преобразования должны быть запрещены. Режим Dual ADC. На событии окончания преобразования ADC1 или ADC2: • Генерируется 32-битный запрос DMA (если биты DMA[1:0] в регистре ADC_CCR равны 0b10). Этот запрос перемещает данные, преобразованные ADC2, сохраненные в старшем полуслове 32-битного регистра ADC_CDR, в SRAM, и затем преобразованные данные ADC1, сохраненные в младшем полуслове ADC_CDR, в SRAM. Рис. 54. Regular simultaneous mode на 16 каналах: dual ADC mode. Режим Triple ADC. На событии окончания преобразования ADC1, ADC2 или ADC3: • Генерируется три 32-битных запроса передачи DMA (если биты DMA[1:0] в регистре ADC_CCR равны 0b01). Происходят 3 перемещения данных из 32-битного регистра ADC_CDR в SRAM: сначала преобразованные данные ADC1, затем преобразованные данные ADC2, и затем преобразованные данные ADC3. Процесс повторяется для каждых трех новых преобразований. Рис. 55. Regular simultaneous mode на 16 каналах: triple ADC mode. [Interleaved mode] Этот режим может быть запущен только на группе regular (обычно один канал). Сигнал внешнего триггера поступает из мультиплексора regular канала ADC1. Режим Dual ADC. После внешнего триггера происходит следующее: • ADC1 стартует немедленно. Минимальная задержка, которая разделяет 2 преобразования в режиме interleaved, конфигурируется битами DELAY в регистре ADC_CCR. Однако ADC не может запустить преобразование, если комплементарный ADC все еще оцифровывает свой вход (только один ADC может делать выборку входного сигала в определенное время). В этом случае задержка получается равной времени выборки + 2 такта ADC. Например, если DELAY = 5 тактовых циклов, и выборка занимает 15 тактов на обоих ADC, то 17 тактов будут разделять преобразования ADC1 и ADC2. Если бит CONT установлен на обоих ADC1 и ADC2, то выбранные regular-каналы обоих ADC непрерывно преобразовываются. Примечание: если последовательность преобразования прервана (например, когда произошло завершение передачи DMA), multi-ADC секвенсор должен быть сброшен путем предварительного конфигурирования в режиме independent (биты DUAL[4:0] = 00000) перед повторным программированием режима interleaved. После прерывания EOC, сгенерированного ADC2 (если оно разрешено битом EOCIE), генерируется запрос 32-битной передачи DMA (если биты DMA[1:0] в регистре ADC_CCR равны 0b10). Этот запрос сначала передает преобразованные ADC2 данные, сохраненные в старшей половине 32-битного регистра ADC_CDR, в SRAM, затем передает преобразованные ADC1 данные, сохраненные в младшей половине этого регистра, в SRAM. Рис. 56. Interleaved mode на канале 1 в режиме continuous conversion: dual ADC mode. Режим Triple ADC. После поступления сигнала от внешнего триггера: • Немедленно стартует ADC1, и Минимальная задержка, которая разделяет 2 преобразования в interleaved mode конфигурируется битами DELAY регистра ADC_CCR. Однако ADC не может запустить преобразование, если комплементарный ADC все еще оцифровывает свой вход (только один ADC может делать выборку входного сигнала в любой момент времени). В этом случае задержка становится равной времени выборки + 2 такта ADC. Например, если DELAY = 5 тактов и выборка занимает 15 тактов на трех ADC, то преобразования на ADC1, ADC2 и ADC3 будут разделяться 17 тактами). Если бит CONT установлен на ADC1, ADC2 и ADC3, то выбранные regular-каналы всех ADC непрерывно преобразуют сигнал. Примечание: если последовательность преобразования прервана (например, когда произойдет окончание передачи DMA), то секвенсор multi-ADC должен быть сброшен путем предварительного конфигурирования его в independent-режиме (биты DUAL[4:0] = 00000) перед повторным программированием interleaved-режима. В этом режиме запрос DMA генерируется каждый раз, когда доступно 2 элемента данных (если биты DMA[1:0] регистра ADC_CCR равны 0b10). Запрос сначала передает в SRAM первые преобразованные данные, сохраненные в младшем полуслове 32-битного регистра ADC_CDR, затем передает в SRAM вторые преобразованные данные, сохраненные в старшем полуслове ADC_CDR. Последовательность следующая: 1-й запрос: ADC_CDR[31:0] = ADC2_DR[15:0] | ADC1_DR[15:0] Рис. 57. Interleaved mode на 1 канале в continuous conversion mode: triple ADC mode. Режим alternate trigger. Этот режим может быть запущен только на injected-группе. Сигнал внешнего триггера приходит от мультиплексора injected-группы ADC1. Примечание: regular преобразование может быть разрешено на одном или всех ADC. В этом случае regular преобразования не зависят друг от друга. Преобразование regular прерывается, когда ADC должен выполнить injected преобразование. Преобразование regular возобновится, когда injected преобразование завершится. Если последовательность преобразования была прервана (например, когда произойдет окончание передачи DMA), то секвенсор multi-ADC должен быть сброшен путем предварительного конфигурирования его в independent-режиме (биты DUAL[4:0] = 00000) перед повторным программированием interleaved-режима. Интервал времени между двумя событиями триггера должен быть больше или равен 1 периоду тактов ADC. Минимальный интервал времени между двумя событиями триггера, которые запускают преобразования на том же самом ADC такое же, как в single ADC mode. Режим Dual ADC. Алгоритм следующий: • Когда срабатывает 1-й триггер, преобразуются все injected каналы ADC1 в группе Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC1 в группе. Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC2 в группе. Если сработает другой внешний триггер после преобразования всех injected-каналов в группе, то процесс alternate-триггера перезапустится преобразованием injected каналов ADC1 в группе. Рис. 58. Триггер alternate: injected группа каждого ADC. Если для обоих ADC1 и ADC2 разрешен прерывистый инжектированный режим (injected discontinuous mode): • Когда сработает 1-й триггер, преобразуется первый injected канал ADC1 Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC1 в группе. Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC2 в группе. Если сработает другой внешний триггер после преобразования всех injected-каналов в группе, то процесс alternate-триггера перезапустится. Рис. 59. Триггер alternate: 4 injected канала (каждого ADC) в discontinuous mode. Режим Triple ADC. Алгоритм следующий: • Когда срабатывает 1-й триггер, преобразуются все injected каналы ADC1 в группе Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC1 в группе. Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC2 в группе. Прерывание JEOC, если разрешено, генерируется после того, как преобразуются все injected каналы ADC3 в группе. Если сработает другой внешний триггер после преобразования всех injected-каналов в группе, то процесс alternate-триггера перезапустится преобразованием injected каналов ADC1 в группе. Рис. 60. Триггер alternate: группа injected каждого ADC. [Комбинированный режим regular/injected simultaneous] Есть возможность прервать одновременное (simultaneous) преобразование regular-группы, чтобы запустить simultaneous преобразование injected-группы. Примечание: в комбинированном режиме regular/injected simultaneous необходимо преобразовать последовательность с той же длиной, или гарантировать, что интервал между триггерами больше, чем большое время преобразования 2 последовательностей (режим Dual ADC) / 3 последовательностей (режим Triple ADC). Иначе ADC с самой короткой последовательностью может перезапуститься, когда ADC с самой длинной последовательностью завершает предыдущие преобразования. [Комбинированный режим regular simultaneous + alternate триггер] Есть возможность прервать simultaneous-преобразование regular группы для запуска преобразования alternate-триггера группы injected. Рис. 61 показывает поведение, когда alternate прерывает преобразование simultaneous regular. Рис. 61. Alternate + regular simultaneous. Преобразование injected alternate немедленно запускается после injected-события. Если regular преобразование уже работает, то чтобы гарантировать синхронизацию после injected преобразования, преобразование regular всех (master/slave) ADC останавливается и синхронно возобновляется по окончании injected-преобразования. Примечание: в комбинированном режиме regular simultaneous + alternate триггер необходимо преобразовывать последовательности одинаковой длины, или гарантировать, что интервал между триггерами больше, чем длинное время преобразования 2 последовательностей (режим Dual ADC) / 3 последовательностей (режим Triple ADC). Иначе ADC с самой короткой последовательностью может перезапуститься, когда ADC с самой длинной последовательностью завершает предыдущие преобразования. Если последовательность преобразования была прервана (например, когда произойдет окончание передачи DMA), то секвенсор multi-ADC должен быть сброшен путем предварительного конфигурирования его в independent-режиме (биты DUAL[4:0] = 00000) перед повторным программированием interleaved-режима. Если триггер сработает во время преобразования injected, которое прервало преобразование regular, то триггер игнорируется. Рис. 62 показывает поведение для этого случая (2-й триггер игнорируется). Рис. 62. Случай, когда сработал триггер во время преобразования injected. [Датчик температуры] Датчик температуры можно использовать для измерения температуры окружающей среды (ambient temperature, TA) микроконтроллера. Датчик температуры позволяет измерять значения от –40 до 125 °C с точностью ±1.5 °C. • На чипах STM32F40x и STM32F41x датчик температуры подключен внутри кристалла к каналу ADC1_IN16, который используется для преобразования напряжения выхода датчика в цифровое значение. Рис. 63 показывает блок-схему датчика температуры. Рис. 63. Блок-схема датчика температуры и канала VREFINT. Примечание (1). VSENSE это вход ADC1_IN16 для микроконтроллеров STM23F40x и STM32F41x, и ADC1_IN18 для микроконтроллеров STM32F42x и STM32F43x. Когда датчик температуры не используется, его можно перевести в режим отключения (power down mode). Примечание: бит TSVREFE должен быть установлен, чтобы разрешить преобразование двух внутренних каналов: ADC1_IN16 или ADC1_IN18 (датчик температуры) и ADC1_IN17 (VREFINT). Чтение температуры. Для использования датчика: 1. Выберите входной канал ADC1_IN16 или ADC1_IN18 (в зависимости от используемого микроконтроллера). Температура (°C) = {(VSENSE – V25) / Avg_Slope} + 25 Здесь V25 равно значению VSENSE для 25° C, Avg_Slope равно среднему наклону температуры по отношению к кривой VSENSE (в единицах mV/°C или mkV/°C). См. секцию электрических характеристик даташита для получения актуальных значений V25 и Avg_Slope. Примечание: у этого датчика есть время запуска (startup time) после выхода его из режима power down перед тем, как он может выводить VSENSE с корректным уровнем. У ADC также есть время старта после power-on, поэтому для минимизации задержки биты ADON и TSVREFE должны быть установлены одновременно. Напряжение на выходе датчика температуры линейно меняется с изменением температуры. Смещение этой линейной функции зависит от каждого чипа из-за изменений условий техпроцесса (один чип от другого может отличаться на смещение до 45°C). Внутренний датчик температуры больше подходит для приложений, которые детектируют изменения температуры вместо регистрации абсолютных температур. Если требуется точное измерение температуры, то должен использоваться внешний датчик температуры. [Мониторинг заряда батареи] Бит VBATE в регистре ADC_CCR используется для переключения к измерению напряжения батареи. Поскольку напряжение VBAT может быть выше напряжения VDDA, то для гарантии правильной работы ADC ножка VBAT подключена внутри кристалла к мостовому делителю. Когда установлен бит VBATE мост автоматически разрешается для подключения: • VBAT/2 для входного канала ADC1_IN18 на кристаллах STM32F40xx и STM32F41xx. Примечание: на кристаллах STM32F42xx и STM32F43xx сигналы VBAT и датчика температуры подключены к одному и тому же внутреннему каналу ADC (ADC1_IN18). Одновременно можно измерять только один из сигналов, VBAT или датчик температуры. Если оба этих сигнала выбраны одновременно, то будет измеряться только VBAT. [Прерывания ADC] Может быть сгенерировано прерывание по окончанию преобразования групп regular и injected, когда установлен бит статуса analog watchdog, и когда установлен бит статуса overrun. Для гибкости доступны отдельные биты для разрешения прерывания от этих событий. В регистре ADC_SR имеются 2 других флага, но с ними не связаны прерывания: • JSTRT (старт преобразования для каналов группы injected). Таблица 70. Прерывания ADC.
[Регистры ADC] Карта памяти регистров ADC. Регистры ADC1, ADC2, ADC3 микроконтроллеров STM32F4xx находятся в диапазоне абсолютных адресов 0x40012000 .. 0x400123FF. [Рис. 19 из stm32f429zi.pdf] Таблица 71. Глобальная карта регистров ADC.
Таблица 72. Карта регистров ADC и значения после сброса для каждого ADC. Таблица 73. Карта регистров ADC и значения после сброса (общие регистры ADC). В описании функций регистров используются следующие сокращения: read/write (rw) Программа может читать и записывать эти биты. read-only (r) Программа может только читать эти биты. write-only (w) Программа может только записывать в этот бит. Чтение бита вернет значение сброса. read/clear (rc_w1) Программа может прочитать бит, а также сбросить его путем записью 1. Запись 0 не дает никакого эффекта. read/clear (rc_w0) Программа может прочитать бит, а также сбросить его путем записью 0. Запись 1 не дает никакого эффекта. read/clear by read (rc_r) Программа может прочитать этот бит. Чтение этого бита автоматически сбросит его в 0. Запись 0 в бит не дает никакого эффекта. read/set (rs) Программа может прочитать, а также установить этот бит. Запись 0 в бит не дает никакого эффекта. read-only write trigger (rt_w) Программа может прочитать этот бит. Запись 0 или 1 вызовет появление события (триггер), но не окажет никакого влияния на значение бита. toggle (t) Программа может только переключить этот бит записью 1. Запись 0 не дает никакого эффекта. Reserved (Res.) Зарезервированный бит, его значение должно сохраняться на значении сброса. Регистры периферийного устройства ADC должны записываться на уровне полного слова (32 бита). Доступ на чтение может осуществляться побайтно (8 бит), на половине слова (16 бит) или как слово (32 бита). Смещение адреса 0x00, значение после сброса 0x00000000.
Биты 31:6 зарезервированы, их значение должно сохраняться на значении сброса (все нули). OVR: Overrun. Этот бит устанавливается аппаратно, когда была потеря данных (либо в single mode, либо в dual/triple mode). Бит очищается программно. Детектирование overrun разрешено только когда DMA = 1 или EOCS = 1. 0: не было overrun. STRT: флаг запуска regular-канала. Этот бит устанавливается аппаратно, когда запускается преобразование regular-канала. Бит очищается программно. 0: не было запуска преобразования regular-канала. JSTRT: флаг запуска injected-канала. Этот бит устанавливается аппаратно, когда запускается преобразование группы injected. Бит очищается программно. 0: не было запуска преобразования группы injected. JEOC: завершение преобразования канала injected. Этот бит устанавливается аппаратно, когда завершается преобразование всех каналов группы injected. Бит очищается программно. 0: преобразование не завершено. EOC: завершение преобразования канала regular. Этот бит устанавливается аппаратно по окончании преобразования группы каналов regular. Бит очищается программно, или аппаратно после чтения регистра ADC_DR. 0: преобразование не завершено (EOCS=0), или не завершена последовательность преобразований (EOCS=1). AWD: флаг Analog Watchdog. Этот бит установится аппаратно, когда преобразованное напряжение пересекает предельные значения, запрограммированные в регистрах ADC_LTR и ADC_HTR. Бит очищается программно. 0: не было события analog watchdog. Смещение адреса 0x04, значение после сброса 0x00000000.
Биты 31:27 зарезервированы, их значение должно сохраняться на значении сброса (все нули). OVRIE: разрешение прерывания overrun. Этот бит устанавливается и очищается программно, чтобы разрешить или запретить прерывание overrun. 0: запрещено прерывание overrun. RES[1:0]: Resolution (разрешающая способность АЦП). Эти биты записываются программно, чтобы выбрать разрядность данных преобразования ADC. 00: 12-бит (время преобразования 15 тактов ADCCLK). AWDEN: разрешение сторожевика аналогового сигнала (Analog WatchDog Enable) каналов regular. Этот бит устанавливается и очищается программно. 0: Analog Watchdog на regular-каналах запрещен. JAWDEN: разрешение сторожевика аналогового сигнала (Analog WatchDog Enable) каналов injected. Этот бит устанавливается и очищается программно. 0: Analog Watchdog на injected-каналах запрещен. Биты 21:16 зарезервированы, их значение должно сохраняться на значении сброса (все нули). DISCNUM[2:0]: количество преобразуемых каналов прерывистого режима (discontinuous mode). Эти биты записываются программой, чтобы определить количество преобразуемых regular-каналов в прерывистом режиме, после получения сигнала от внешнего триггера. 000: 1 канал. 111: 8 каналов. JDISCEN: прерывистый режим (discontinuous mode) на injected-каналах. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить прерывистый режим группы injected-каналов. 0: прерывистый режим на injected-каналах запрещен. DISCEN: прерывистый режим (discontinuous mode) на regular-каналах. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить прерывистый режим на regular-каналах. 0: прерывистый режим на regular-каналах запрещен. JAUTO: автоматическое преобразование injected-группы. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить автоматическое преобразование группы injected после преобразования группы regular. 0: автоматическое преобразование injected-группы запрещено. AWDSGL: разрешение сторожевика аналогового сигнала (analog watchdog) на одном канале в режиме сканирования. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить analog watchdog канала, идентифицированного битами AWDCH[4:0]. 0: analog watchdog разрешен на всех каналах. SCAN: режим сканирования. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить режим сканирования. В режиме сканирования преобразуются входы, выбранные через регистры ADC_SQRx или ADC_JSQRx. 0: режим сканирования запрещен. Примечание: прерывание EOC генерируется, если установлен бит EOCIE: – по окончании преобразования последовательности каждой группы regular, если бит EOCS сброшен в 0. Прерывание JEOC генерируется только по окончании преобразования последнего канала, если установлен бит JEOCIE. JEOCIE: разрешение прерывания для injected-каналов. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить прерывание по окончанию преобразования для injected-каналов. 0: прерывание JEOC запрещено. AWDIE: разрешение прерывания Analog Watchdog. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить прерывание сторожевика аналогового сигнала. 0: прерывание analog watchdog запрещено. EOCIE: разрешение прерывания по окончанию преобразования (End Of Conversion, EOC). Этот бит устанавливается и очищается программой, чтобы разрешить/запретить прерывание EOC. 0: EOC прерывание EOC запрещено. AWDCH[4:0]: выбор канала для Analog Watchdog. Эти биты устанавливаются и очищаются программой. Они выбирают входной канал, который обслуживает analog watchdog. 00000: канал 0 ADC. Другие значения зарезервированы. Смещение адреса 0x08, значение после сброса 0x00000000.
Бит 31 зарезервирован, его значение должно сохраняться на значении сброса (0). SWSTART: запуск преобразования на regular-каналах. Этот бит устанавливается программно для старта преобразования, и очищается аппаратно, как только преобразование запустилось. 0: состояние сброса. Примечание: этот бит можно установить только когда ADON = 1, иначе никакое преобразование не запустится. EXTEN: разрешение внешнего триггера для regular-каналов. Эти биты устанавливаются и сбрасываются программой для выбора полярности внешнего триггера и разрешения триггера группы regular. 00: детектирование триггера запрещено. EXTSEL[3:0]: выбор внешнего события для группы regular. Биты выбирают внешнее событие, используемое как триггер для запуска преобразования группы regular: 0000: событие Timer 1 CC1 Бит 23 зарезервирован, его значение должно сохраняться на значении сброса (0). JSWSTART: запуск преобразования injected-каналов. Этот бит устанавливается программно и сбрасывается аппаратно, как только запустится преобразование. 0: состояние сброса. Примечание: этот бит можно установить только когда ADON = 1, иначе никакое преобразование не запустится. JEXTEN: разрешение внешнего триггера для injected-каналов. Эти биты устанавливаются и сбрасываются программой для выбора полярности внешнего триггера и разрешения триггера группы injected. 00: детектирование триггера запрещено. JEXTSEL[3:0]: выбор внешнего события для группы injected. Биты выбирают внешнее событие, используемое как триггер для запуска преобразования группы injected: 0000: событие Timer 1 CC4 Биты 15:12 зарезервированы, их значение должно сохраняться на значении сброса (все нули). ALIGN: выравнивание выходных данных. Этот бит устанавливается и очищается программой, см. рисунки 48 и 49. 0: выравнивание вправо. EOCS: выбор завершения преобразования (End Of Conversion Selection). Этот бит устанавливается и очищается программой. 0: бит EOC устанавливается по окончании каждой последовательности regular-преобразований. Детектирование overrun разрешено только если DMA=1. DDS: выбор запрета DMA (только для режима single ADC). Этот бит устанавливается и очищается программой. 0: не выдается новый запрос DMA после последней передачи (как сконфигурировано в контроллера DMA). DMA: режим прямого доступа к памяти (для режима single ADC). Этот бит устанавливается и очищается программой. Для получения подробной информации см. описание контролера DMA в даташите. 0: режим DMA запрещен. Биты 7:2 зарезервированы, их значение должно сохраняться на значении сброса (все нули). CONT: непрерывное преобразование (continuous conversion). Этот бит устанавливается и очищается программой. Если он установлен, то преобразования работают до тех пор, пока этот бит не будет очищен. 0: режим одиночного преобразования (single conversion mode). ADON: включение/выключение аналого-цифрового преобразователя. Этот бит устанавливается и очищается программой. 0: запрещает преобразование ADC и переводит аппаратуру ADC в режим выключения (power down mode). Смещение адреса 0x0C, значение после сброса 0x00000000.
Биты 31:27 зарезервированы, их значение должно сохраняться на значении сброса (все нули). SMPx[2:0]: установка времени выборки (sampling time) канала x. Эти биты записываются программой для выбора времени оцифровки индивидуально для каждого канала. Во время циклов выборки биты выбора канала должны оставаться неизменными. 000: 3 такта Смещение адреса 0x10, значение после сброса 0x00000000.
Биты 31:30 зарезервированы, их значение должно сохраняться на значении сброса (все нули). SMPx[2:0]: установка времени выборки (sampling time) канала x. Эти биты записываются программой для выбора времени оцифровки индивидуально для каждого канала. Во время циклов выборки биты выбора канала должны оставаться неизменными. 000: 3 такта Здесь x может меняться от 1 до 4, давая соответственно имена регистров ADC_JOFR1, ADC_JOFR2, ADC_JOFR3, ADC_JOFR4. Смещение адреса 0x14 .. 0x20, значение после сброса 0x00000000.
Биты 31:12 зарезервированы, их значение должно сохраняться на значении сброса (все нули). JOFFSETx[11:0]: смещение данных для injected канала x. Эти биты записываются программой, чтобы определить смещение, вычитаемое из сырых преобразованных данных, когда преобразуются injected-каналы. Результат преобразования может быть прочитан в регистрах ADC_JDRx. Смещение адреса 0x24, значение после сброса 0x00000FFF.
Биты 31:12 зарезервированы, их значение должно сохраняться на значении сброса (все нули). HT[11:0]: верхний порог сторожевика аналогового сигнала (analog watchdog). Эти биты записываются программно, чтобы определить верхний порог уровня для analog watchdog. Программа может записать в этот регистр, когда выполняется операция преобразования ADC. Запрограммированное значение вступит в силу, когда завершится следующее преобразование. Запись в этот регистр выполнится с задержкой записи, которая может создать неопределенность для эффективного времени преобразования, на котором значение было записано. Смещение адреса 0x28, значение после сброса 0x00000000.
Биты 31:12 зарезервированы, их значение должно сохраняться на значении сброса (все нули). LT[11:0]: нижний порог сторожевика аналогового сигнала (analog watchdog). Эти биты записываются программно, чтобы определить нижний порог уровня для analog watchdog. Программа может записать в этот регистр, когда выполняется операция преобразования ADC. Запрограммированное значение вступит в силу, когда завершится следующее преобразование. Запись в этот регистр выполнится с задержкой записи, которая может создать неопределенность для эффективного времени преобразования, на котором значение было записано. Смещение адреса 0x2C, значение после сброса 0x00000000.
Биты 31:24 зарезервированы, их значение должно сохраняться на значении сброса (все нули). L[3:0]: длина последовательности regular каналов. Эти биты записываются программой, чтобы определить общее количество преобразований в последовательности преобразований каналов regular. 0000: 1 преобразование. SQ16[4:0]: 16-е преобразование в regular-последовательности. Эти биты записываются программой в номер канала (0..18), назначенный в качестве 16-го в последовательности преобразования. SQ15[4:0]: 15-е преобразование в regular-последовательности. SQ14[4:0]: 14-е преобразование в regular-последовательности. SQ13[4:0]: 13-е преобразование в regular-последовательности. Смещение адреса 0x30, значение после сброса 0x00000000.
Биты 31:30 зарезервированы, их значение должно сохраняться на значении сброса (все нули). SQ12[4:0]: 12-е преобразование в regular-последовательности. Эти биты записываются программой в номер канала (0..18), назначенный в качестве 12-го в последовательности преобразования. SQ11[4:0]: 11-е преобразование в regular-последовательности. SQ10[4:0]: 10-е преобразование в regular-последовательности. SQ9[4:0]: 9-е преобразование в regular-последовательности. SQ8[4:0]: 8-е преобразование в regular-последовательности. SQ7[4:0]: 7-е преобразование в regular-последовательности. Смещение адреса 0x34, значение после сброса 0x00000000.
Биты 31:30 зарезервированы, их значение должно сохраняться на значении сброса (все нули). SQ6[4:0]: 6-е преобразование в regular-последовательности. Эти биты записываются программой в номер канала (0..18), назначенный в качестве 6-го в последовательности преобразования. SQ5[4:0]: 5-е преобразование в regular-последовательности. SQ4[4:0]: 4-е преобразование в regular-последовательности. SQ3[4:0]: 3-е преобразование в regular-последовательности. SQ2[4:0]: 2-е преобразование в regular-последовательности. SQ1[4:0]: 1-е преобразование в regular-последовательности. Смещение адреса 0x38, значение после сброса 0x00000000.
Биты 31:22 зарезервированы, их значение должно сохраняться на значении сброса (все нули). JL[1:0]: длина injected-последовательности. Эти биты записываются программой, чтобы определить общее количество преобразований в последовательности преобразований injected канала. 00: 1 преобразование. JSQ4[4:0]: 4-е преобразование в injected-последовательности (когда JL[1:0]=3, см. примечание далее). В эти биты программа записывает номер канала (0..18), назначенный в качестве 4-го в последовательности преобразований. JSQ3[4:0]: 3-е преобразование в injected-последовательности (когда JL[1:0]=3, см. примечание далее). JSQ2[4:0]: 2-е преобразование в injected-последовательности (когда JL[1:0]=3, см. примечание далее). JSQ1[4:0]: 1-е преобразование в injected-последовательности (когда JL[1:0]=3, см. примечание далее). Примечание: когда JL[1:0]=3 (4 injected-преобразования в секвенсоре), ADC преобразует каналы в следующем порядке: JSQ1[4:0], JSQ2[4:0], JSQ3[4:0], JSQ4[4:0]. Когда JL=2 (3 injected-преобразования в секвенсоре), ADC преобразует каналы в следующем порядке: JSQ2[4:0], JSQ3[4:0], JSQ4[4:0]. Когда JL=1 (2 injected-преобразования в секвенсоре), ADC преобразует каналы, начиная с JSQ3[4:0], и затем JSQ4[4:0]. Когда JL=0 (1 injected-преобразование в секвенсоре), ADC преобразует только канал JSQ4[4:0]. Здесь x может меняться от 1 до 4, давая соответственно имена регистров ADC_JDR1, .., ADC_JDR4. Смещение адреса 0x3C .. 0x48, значение после сброса 0x00000000.
Биты 31:16 зарезервированы, их значение должно сохраняться на значении сброса (все нули). JDATA[15:0]: данные injected. Эти биты только для чтения, они содержат результат преобразования injected-канала x. Данные могут получать правое или левое выравнивание, как показано на рисунках 48 и 49. Смещение адреса 0x4C, значение после сброса 0x00000000.
Биты 31:16 зарезервированы, их значение должно сохраняться на значении сброса (все нули). DATA[15:0]: regular данные преобразования. Эти биты только для чтения. Они содержат результат преобразования каналов regular. Данные результата могут получать правое или левое выравнивание, как показано на рисунках 48 и 49. Смещение адреса 0x00 относительно базового адреса ADC1+0x300, значение после сброса 0x00000000. Этот регистр предоставляет образ бит статуса различных ADC. Тем не менее, эти биты только для чтения, и их нельзя очистить напрямую. Вместо этого каждый бит статуса должен быть очищен записью 0 в соответствующий регистр ADC_SR.
Биты 31:22 зарезервированы, их значение должно сохраняться на значении сброса (все нули). OVR3: флаг overrun ADC3. Этот бит - копия бита OVR в регистре ADC3_SR. STRT3: флаг старта regular-канала ADC3. Этот бит - копия бита STRT в регистре ADC3_SR. JSTRT3: флаг старта injected-канала ADC3. Этот бит - копия бита JSTRT в регистре ADC3_SR. JEOC3: завершение преобразования injected-канала ADC3. Этот бит - копия бита JEOC в регистре ADC3_SR. EOC3: завершение преобразования ADC3. Этот бит - копия бита EOC в регистре ADC3_SR. AWD3: флаг analog watchdog ADC3. Этот бит - копия бита AWD в регистре ADC3_SR. Биты 15:14 зарезервированы, их значение должно сохраняться на значении сброса (все нули). OVR2: флаг overrun ADC2. Этот бит - копия бита OVR в регистре ADC2_SR. STRT2: флаг старта regular-канала ADC2. Этот бит - копия бита STRT в регистре ADC2_SR. JSTRT2: флаг старта injected-канала ADC2. Этот бит - копия бита JSTRT в регистре ADC2_SR. JEOC2: завершение преобразования injected-канала ADC2. Этот бит - копия бита JEOC в регистре ADC2_SR. EOC2: завершение преобразования ADC2. Этот бит - копия бита EOC в регистре ADC2_SR. AWD2: флаг analog watchdog ADC2. Этот бит - копия бита AWD в регистре ADC2_SR. Биты 7:6 зарезервированы, их значение должно сохраняться на значении сброса (все нули). OVR1: флаг overrun ADC1. Этот бит - копия бита OVR в регистре ADC1_SR. STRT1: флаг старта regular-канала ADC1. Этот бит - копия бита STRT в регистре ADC1_SR. JSTRT1: флаг старта injected-канала ADC1. Этот бит - копия бита JSTRT в регистре ADC1_SR. JEOC1: завершение преобразования injected-канала ADC1. Этот бит - копия бита JEOC в регистре ADC1_SR. EOC1: завершение преобразования ADC1. Этот бит - копия бита EOC в регистре ADC1_SR. AWD1: флаг analog watchdog ADC1. Этот бит - копия бита AWD в регистре ADC1_SR. Смещение адреса 0x04 относительно базового адреса ADC1+0x300, значение после сброса 0x00000000.
Биты 31:24 зарезервированы, их значение должно сохраняться на значении сброса (все нули). TSVREFE: разрешение датчика температуры и VREFINT. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить датчик температуры и канал VREFINT. 0: датчик температуры и канал VREFINT запрещены. Примечание: на микроконтроллерах STM32F42x и STM32F43x должен быть запрещен (сброшен) бит VBATE, когда установлен TSVREFE. Если же оба этих бита установлены, то будет выполняться только преобразование VBAT. VBATE: разрешение VBAT. Этот бит устанавливается и очищается программой, чтобы разрешить/запретить канал VBAT. 0: канал VBAT запрещен. Биты 21:18 зарезервированы, их значение должно сохраняться на значении сброса (все нули). ADCPRE: прескалер ADC. Эти биты устанавливаются и очищается программой, чтобы выбрать частоту тактов ADC. Частота тактов одинаковая для всех ADC. 00: PCLK2, поделенная на 2. DMA: режим прямого доступа к памяти для режима multi ADC. Это поле бит устанавливается и очищается программой. Для получения дополнительной информации см. секцию даташита с описанием контроллера DMA. 00: режим DMA запрещен. DDS: выбор запрета DMA (для режима multi-ADC). Этот бит устанавливается и очищается программно. 0: не выдается новый запрос DMA после последней передачи (как было сконфигурировано в контроллере DMA). Биты DMA не очищаются аппаратно, однако они должны быть очищены и установлены программной в желаемый режим перед тем, как могут быть сгенерированы новые запросы DMA. Биты 12 зарезервирован, его значение должно сохраняться на значении сброса (0). DELAY: задержка между двумя фазами выборки. Эти биты устанавливаются и сбрасываются программой. Они используются в режимах dual interleaved или triple interleaved. 0000: 5 * TADCCLK Биты 7:5 зарезервированы, их значение должно сохраняться на значении сброса (все нули). MULTI[4:0]: выбор режима Multi ADC. Эти биты записываются программой, чтобы выбрать рабочий режим. Режим, когда все ADC не зависят друг от друга: 00000: independent mode Значения от 00001 до 01001: Dual mode, ADC1 и ADC2 работают совместно, ADC3 работает независимо. 00001: комбинация режимов regular simultaneous + injected simultaneous. Значения от 10001 до 11001: Triple mode: ADC1, 2 и 3 работают совместно. 10001: комбинация режимов regular simultaneous + injected simultaneous. Все другие комбинации зарезервированы и не должны программироваться. Примечание: в multi-режиме изменение конфигурации канала генерирует аборт, что может привести к потере синхронизации. Рекомендуется запретить режим multi ADC перед любым изменением конфигурации. Смещение адреса 0x08 относительно базового адреса ADC1+0x300, значение после сброса 0x00000000.
DATA2[15:0]: второй элемент данных пары regular-преобразований. – В режиме dual эти биты содержат regular-данные ADC2. См. выше описание режима Dual ADC. DATA1[15:0]: первый элемент данных пары regular-преобразований. - В режиме dual эти биты содержат regular-данные ADC1. См. выше описание режима Dual ADC. Таблица 17. Основные рабочие условия [1].
Примечания: (1) Режим over-drive не поддерживается в диапазоне напряжений от 1.7 до 2.1 V. Таблица 18. Ограничения, накладываемые в зависимости от рабочего напряжения источника питания VDD.
Примечания: (1) Применяется только когда код выполняется из памяти FLASH. Когда код выполняется из RAM, не требуется циклов ожидания (no wait state). Таблица 35. Токи потребления периферии. Здесь приведена только часть таблицы 35 даташита [1], касающаяся периферийных устройств ADC1, ADC2, ADC3.
Примечания: (1) Когда ячейка компенсации I/O включена, типовое значение IDD увеличивается на 0.22 мА.2. Параметры в таблице 83 получены из результатов тестов при окружающей температуре и VDD, приведенных в таблице 17, если не указано что-то другое. Таблица 83. Внутреннее опорное напряжение.
Примечания: (1) Самое короткое время выборки может быть определено в приложении путем выполнения нескольких итераций. Таблица 84. Значения калибровки внутреннего опорного напряжения.
[Характеристики 12-битного ADC] Если не указано что-то иное, приведенные в таблице 74 параметры получены из результатов тестов, выполненных при окружающей температуре, частоте fPCLK2 и напряжении питания VDDA из таблицы 17. Таблица 74. Характеристики ADC.
Примечания: (1) Минимальное значение VDDA 1.7V получено с использованием внешнего супервизора питания (см. секцию 3.17.2: Internal reset OFF даташита [1]). Формула 1 для максимального значения RAIN: (k - 0.5) Эта формула используется для определения максимального внешнего допустимого сопротивления, чтобы гарантировалась ошибка не выше 1/4 от LSB. N = 12 (для 12-разрядной разрешающей способности), и k это количество период выборок, определенных в регистре ADC_SMPR1. [Простые примеры использования АЦП STM32] В этом примере ADC2 измеряет уровень напряжения на ножке порта PC3 процессора STM32F429 (контакт 15 разъема P2 платы разработчика 32F429IDISCAVERY). Это вход ADC123_IN13, т. е. канал 13, который можно привязать к любому блоку АЦП - ADC1, ADC2 или ADC3. [Функция инициализации в stm32f4xx_hal_msp.c] /**
* @brief Инициализация ADC
* Эта функция конфигурирует аппаратные ресурсы ADC.
* @param hadc: указатель на дескриптор ADC.
*/
void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc) { GPIO_InitTypeDef GPIO_InitStruct = {0}; if(hadc->Instance==ADC2) { /* Разрешение тактов периферийного устройства */ __HAL_RCC_ADC2_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); /** Конфигурация ножек ADC2: PC3 ------> ADC123_IN13 */ GPIO_InitStruct.Pin = ADC123_IN13; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(BATT_ADC_PORT, &GPIO_InitStruct); } else if(hadc->Instance==ADC3) { /* Разрешение тактов периферийного устройства */ __HAL_RCC_ADC3_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); /** Конфигурация ножек ADC3: PF6 ------> ADC3_IN4 */ GPIO_InitStruct.Pin = ADC3_IN4; GPIO_InitStruct.Mode = GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(ADC_PORT, &GPIO_InitStruct); } } [Модуль battadc.c] Этом модуле реализован код потока FreeRTOS, который инициализирует АЦП и периодически опрашивает его. Если вычисленное в процентах значение напряжения батареи поменялось, то запускается обновление на экране индикатора состояния батареи. #include < stdint.h>
#include < stdbool.h>
#include "battadc.h"
#include "screenthread.h"
#include "errors.h"
#include "stm32f4xx_hal.h"
// АЦП сконфигурирован в 12 битном режиме, поэтому при выравнивании
// вправо максимальное считанное значение из регистра результата
// ADC2_DR будет равно 4095:
#define BATT_ADC_MAX_SAMPLE_VALUE ((1 < < 12)-1)
// Максимальное значение счетчика для усреднения 244, подогнанное
// для удобства расчета процентов заряда батареи. Здесь за 100%
// условно принято измеряемое напряжение 3.3V:
#define BATTMAXCNT (1000000/BATT_ADC_MAX_SAMPLE_VALUE)
__no_init static ADC_HandleTypeDef hbattadc @ "SDRAM_DATA"; static uint8_t battpercent; static void MX_ADC2_Init(void) { memset(&hbattadc, 0, sizeof(ADC_HandleTypeDef)); ADC_ChannelConfTypeDef sConfig = {0}; /** Конфигурирование глобальных функций ADC (такты, разрешение,
* выравнивание данных и количество преобразований) */ hbattadc.Instance = ADC2; hbattadc.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hbattadc.Init.Resolution = ADC_RESOLUTION_12B; hbattadc.Init.ScanConvMode = DISABLE; hbattadc.Init.ContinuousConvMode = DISABLE; hbattadc.Init.DiscontinuousConvMode = DISABLE; hbattadc.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hbattadc.Init.ExternalTrigConv = ADC_SOFTWARE_START; hbattadc.Init.DataAlign = ADC_DATAALIGN_RIGHT; hbattadc.Init.NbrOfConversion = 1; hbattadc.Init.EOCSelection = ADC_EOC_SINGLE_CONV; hbattadc.Init.EOCSelection = DISABLE; if (HAL_ADC_Init(&hbattadc) != HAL_OK) HALerrorHandler(__FILE__, __LINE__); /** Конфигурирование выбранного обычного канала ADC его соответствующим * рангом в секвенсоре и его временем выборки. */ sConfig.Channel = ADC_CHANNEL_13; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; sConfig.Offset = 0; if (HAL_ADC_ConfigChannel(&hbattadc, &sConfig) != HAL_OK) HALerrorHandler(__FILE__, __LINE__); } void battmeastask (void const * argument) { uint8_t battbuffcnt = 0; uint32_t battsumm = 0; uint8_t battpercent_old; MX_ADC2_Init(); battpercent_old = 101; while(1) { if(HAL_ADC_Start(&hbattadc) != HAL_OK) { /* Ошибка запуска преобразования */ HALerrorHandler(__FILE__, __LINE__); } HAL_ADC_PollForConversion(&hbattadc, 10); if(HAL_ADC_GetState(&hbattadc) & HAL_ADC_STATE_EOC_REG) { // Усреднение результата измерения напряжения: battsumm += HAL_ADC_GetValue(&hbattadc); if (BATTMAXCNT == battbuffcnt) { battpercent = battsumm/10000; if (battpercent>100) battpercent = 100; if (battpercent_old != battpercent) { battpercent_old = battpercent; UpdateAtScreen(SCR_UPDATE_BATT); } battsumm = 0; battbuffcnt = 0; } else battbuffcnt++; } osDelay(3); } } В этом примере АЦП используется для оцифровки звука с частотой выборок 12000 Гц. Преобразования запускает таймер TIM3 в своем обработчике прерывания TIM3_IRQHandler, который имеет максимальный приоритет. Данные из АЦП считывает обработчик прерывания ADC_IRQHandler, у которого установлен меньший приоритет. В нем считанные из АЦП данные преобразуются в формат short и накапливаются в половинке буфера adcbuf. Как только половинка заполняется, её данные с помощью очереди dataQueue передаются потоку обработки (он здесь не показан), и происходит переключение на заполнение другой половинки буфера. Функция инициализации HAL_ADC_MspInit модуля stm32f4xx_hal_msp.c такая же, как в примере 1 выше. Обратите внимание, что оба блока ADC2 (Пример 1) и ADC3 (Пример 2) могут работать одновременно, не влияя друг на друга. #define SNDBUFLEN 512
TIM_HandleTypeDef adctim; ADC_HandleTypeDef hadc3; int16_t adcbuf[2][SNDBUFLEN]; uint8_t adcbufidx = 0; TSoundBuf soundbuf; void TIM3_IRQHandler (void) { HAL_TIM_IRQHandler(&adctim); HAL_ADC_Start_IT(&hadc3); } void ADC_IRQHandler (void) { HAL_ADC_IRQHandler(&hadc3); } /**
* @brief Функция преобразует unsigned int32 в signed int16 (short).
* @param Результат ADC, сдвинутый влево, до 16 разрядов.
* Этот алгоритм преобразования описан в AN5012 "Analog-to-digital
* audio conversion example using STM32L4 Series microcontroller
* peripherals"
*/
static int16_t ADC_to_USB_Dataformat(uint32_t ADC_sample) { int32_t temp_val=0x0; // Изменение формата данных из 32-битного беззнакового // (где используется 16 бит), в формат 16 бит со знаком: temp_val = (int32_t)(ADC_sample-32768); return (int16_t)temp_val; } void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) { static uint16_t adcidx = 0; TSoundBuf *psndbuf; static uint32_t period; if (adcidx < SNDBUFLEN) { adcbuf[adcbufidx][adcidx] = ADC_to_USB_Dataformat((uint32_t)HAL_ADC_GetValue(&hadc3)); adcidx++; } else { if (IFSK_receive == ifskmode) { soundbuf.rawdata = adcbuf[adcbufidx]; soundbuf.size = SNDBUFLEN; psndbuf = &soundbuf; xQueueSendFromISR( dataQueue, &psndbuf, NULL ); } adcidx = 0; adcbufidx = adcbufidx?0:1; adcbuf[adcbufidx][adcidx] = ADC_to_USB_Dataformat((uint32_t)HAL_ADC_GetValue(&hadc3)); adcidx++; } } void MX_ADC3_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; /** Конфигурирование глобальных функций ADC (такты, разрешение, выравнивание
* данных и количество преобразований) */ hadc3.Instance = ADC3; hadc3.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4; hadc3.Init.Resolution = ADC_RESOLUTION_12B; hadc3.Init.ScanConvMode = DISABLE; hadc3.Init.ContinuousConvMode = DISABLE; hadc3.Init.DiscontinuousConvMode = DISABLE; hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START; hadc3.Init.DataAlign = ADC_DATAALIGN_LEFT; hadc3.Init.NbrOfConversion = 1; hadc3.Init.DMAContinuousRequests = DISABLE; hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV; if (HAL_ADC_Init(&hadc3) != HAL_OK) HALerrorHandler(__FILE__, __LINE__); /** Конфигурирование выбранного обычного канала ADC его соответствующим * рангом в секвенсоре и его временем выборки. */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if (HAL_ADC_ConfigChannel(&hadc3, &sConfig) != HAL_OK) HALerrorHandler(__FILE__, __LINE__); HAL_NVIC_SetPriority(ADC_IRQn, ADC_HW_INTERRUPT_PRIORITY, 0); HAL_NVIC_EnableIRQ(ADC_IRQn); } void TIM3_init (void) { /* ----------------------------------------------------------------------- Частота входных тактов TIM3 (TIM3CLK) устанавливается на частоту тактов
2 * APB1 (PCLK1), поскольку прескалер APB1 отличается от 1.
TIM3CLK = 2 * PCLK1 PCLK1 = HCLK / 4 => TIM3CLK = HCLK / 2 = SystemCoreClock /2 Чтобы получить частоту тактов TIM3 10 кГц, прескалер вычисляется следующим
образом:
Prescaler = (TIM3CLK / частота тактов счетчика TIM3) - 1
Prescaler = ((SystemCoreClock /2) / 10 кГц) - 1
Примечание: переменная SystemCoreClock хранит частоту HCLK. Каждый раз, когда изменяется частота ядра (HCLK), пользователь должен обновить переменную
SystemCoreClock. Иначе любая конфигурация, основанная на значении этой
переменной, будет некорректной. Эта переменная обновляется тремя способами:
1) Вызовом CMSIS-функции SystemCoreClockUpdate().
2) Вызовом HAL API-функции HAL_RCC_GetSysClockFreq().
3) Каждый раз, когда вызывается HAL_RCC_ClockConfig() для конфигурирования
системной тактовой частоты.
----------------------------------------------------------------------- */ adctim.Instance = TIM3; /* Запрет глобального прерывания TIMx */ __HAL_TIM_DISABLE(&adctim); HAL_NVIC_DisableIRQ(TIMx_IRQn); __HAL_RCC_TIM3_CLK_DISABLE(); /* Инициализация аппаратуры TIM3: + Period = 10000 - 1
+ Prescaler = ((SystemCoreClock/2)/10000) - 1
+ ClockDivision = 0
+ Counter direction = Up
*/ adctim.Init.Period = (uint32_t)((SystemCoreClock/2) / NOMINAL_SAMPLING_RATE) - 1; adctim.Init.Prescaler = 0; adctim.Init.ClockDivision = 0; adctim.Init.CounterMode = TIM_COUNTERMODE_UP; __HAL_RCC_TIM3_CLK_ENABLE(); HAL_NVIC_SetPriority(TIMx_IRQn, TIMADC_HW_INTERRUPT_PRIORITY, 0); /* Разрешение глобального прерывания TIMx */ HAL_NVIC_EnableIRQ(TIMx_IRQn); TIM_Base_SetConfig(adctim.Instance, &adctim.Init); __HAL_TIM_ENABLE_IT(&adctim, TIM_IT_UPDATE); /* Разрешение периферийного устройства таймера */ __HAL_TIM_ENABLE(&adctim); } [Ссылки] 1. STM32F427xx STM32F429xx Datasheet site:st.com. |