Управление питанием и спящие режимы
Я изучил множество книг по микроконтроллерам, и, к моему удивлению, сведений о спящих режимах в этих книгах крайне мало. Поэтому думаю, что перевод документации из этого раздела будет многим полезен.
Высокая производительность и ведущая в отрасли эффективность кода делают микроконтроллеры AVR наилучшим выбором для приложений с низким энергопотреблением. Кроме того, спящие режимы позволяют приложению отключать неиспользуемые модули в микроконтроллере, тем самым экономя электроэнергию. AVR обеспечивает различные режимы энергосбережения, позволяя пользователю приспосабливать потребление энергии к требованиям приложения.
Переход в энергосберегающий режим происходит с помощью команды SLEEP, если разряд SE регистра MCUCR (0х35) установлен в единицу.
Выбор режима энергосбережения определяется состоянием разрядов SM регистра MCUCR (подробнее об этом см. ниже).
Выход из спящего режима происходит при поступлении разрешённого запроса прерывания или перезапуске микроконтроллера.
Спящие режимы AVR
Вот здесь показаны различные тактовые сигналы в ATtiny13A и их распределение. Этот рисунок будет вам полезен при выборе спящего режима. Ниже в таблице 7-1 показаны спящие режимы и источники выхода из спящего режима.
Чтобы войти в любой из трех спящих режимов, бит SE в MCUCR должен быть записан в логическую единицу и инструкция SLEEP должна быть выполнена. Биты SM[1:0] в регистре MCUCR определяют, какой режим энергосбережения (холостой ход — бездействие, подавление шума АЦП или выключение питания) будет задействован командой SLEEP. Подробнее об этом будет рассказано в следующих статьях.
Если прерывание происходит, когда микроконтроллер находится в спящем режиме, то микроконтроллер просыпается. Затем микроконтроллер останавливается на четыре такта в дополнение к времени запуска, выполняет процедуру прерывания и возобновляет выполнение инструкции, которая следует за командой SLEEP. Содержимое файла регистра и SRAM остаются неизменными, когда устройство выходит из спящего режима. Если сброс происходит во время спящего режима, MCU просыпается и начинает выполнение от вектора сброса (Reset Vector).
Обратите внимание, что если прерывание срабатывания по уровню используется для пробуждения из режима отключения питания, измененный уровень должен удерживаться в течение некоторого времени, чтобы разбудить микроконтроллер. Подробнее об этом можно прочитать в документации в разделе “Внешние прерывания” на стр. 46 (на этом сайте также будет в следующих статьях).
Режим холостого хода микроконтроллера (Idle Mode)
Когда биты SM[1:0] записываются в 00, команда SLEEP переводит устройство в режим ожидания, останавливая процессор, но позволяя аналоговому компаратору, АЦП, таймеру/счетчику, сторожевому таймеру и системе прерываний продолжать работать. Этот спящий режим в основном останавливает тактовые генераторы CPU и FLASH, позволяя другим генераторам работать.
Режим ожидания (режим холостого хода) позволяет микроконтроллеру просыпаться от внешних прерываний, а также внутренних, таких как переполнение таймера (Timer Overflow). Если пробуждение от прерывания аналогового компаратора не требуется, аналоговый компаратор можно отключить, установив бит АЦП в регистре ACSR — регистре управления и состояния аналогового компаратора. Это позволит снизить энергопотребление в режиме ожидания. Если АЦП включен, преобразование начинается автоматически при входе в этот режим.
В режиме холостого хода процессор остановлен, периферийные устройства продолжают работать, данные в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода, расположенных в пассивных периферийных устройствах, сохраняются неизменными.
Ток потребления (в зависимости от модели микроконтроллера) уменьшается в 2. 4 раза.
Режим подавления шума АЦП (ADC Noise Reduction Mode)
Если в битах SM[1:0] записано 01, то команда SLEEP заставляет микроконтроллер войти в режим шумоподавления АЦП, останавливая процессор, но позволяя АЦП, внешним прерываниям и сторожевому таймеру продолжать работать (если это включено). Этот спящий режим останавливает генераторы тактовой частоты для ввода-вывода (I/O), процессора (CPU) и FLASH-памяти, позволяя при этом работать другим генераторам.
Это улучшает шумовую среду для АЦП, позволяя проводить измерения с более высоким разрешением. Если АЦП включен, преобразование начинается автоматически при входе в этот режим. Кроме прерывания завершения преобразования АЦП, только внешний сброс, сброс сторожевого таймера, сброс системы слежения за питанием (Brown-out), прерывание готовности SPM/EEPROM, внешнее прерывание уровня INT0 или прерывание изменения сигнала на выводе, могут вывести микроконтроллер из режима шумоподавления АЦП.
Режим пониженного энергопотребления (Power-down Mode)
Если в битах SM[1:0] записано 10,то после выполнения команды SLEEP микроконтроллер переходит в режим пониженного энергопотребления. В этом режиме генератор останавливается, в то время как внешние прерывания и сторожевой таймер продолжают работать (если они включены). Только внешний сброс, сброс сторожевого таймера, сброс системы слежения за питанием (Brown-out), внешнее прерывание уровня INT0 или прерывание изменения сигнала на выводе могут вывести микроконтроллер из этого режима. Этот спящий режим останавливает все тактовые генераторы, позволяя работать только асинхронным модулям.
В этом режиме периферийные устройства (кроме сторожевого таймера и блока прерываний) не работают. Данные в регистрах общего назначения, ячейках SRAM и регистрах ввода-вывода сохраняются неизменными.
Ток потребления (в зависимости от модели микроконтроллера) имеет величину от нескольких единиц до нескольких десятков мкА. Напряжение питания может быть снижено до 2В.
Вспомогательные аппаратные средства микроконтроллера
Малый уровень энергопотребления является зачастую определяющим фактором при выборе способа реализации цифровой управляющей системы . Современные МК предоставляют пользователю большие возможности в плане экономии энергопотребления и имеют, как правило, следующие основные режимы работы:
- активный режим (Run mode) — основной режим работы МК. В этом режиме МК исполняет рабочую программу, и все его ресурсы доступны. Потребляемая мощность имеет максимальное значение PRUN. Большинство современных МК выполнено по КМОП-технологии, поэтому мощность потребления в активном режиме сильно зависит от тактовой частоты;
- режим ожидания (Wait mode, Idle mode или Halt mode). В этом режиме прекращает работу центральный процессор, но продолжают функционировать периферийные модули, которые контролируют состояние объекта управления. При необходимости сигналы от периферийных модулей переводят МК в активный режим, и рабочая программа формирует необходимые управляющие воздействия. Перевод МК из режима ожидания в рабочий режим осуществляется по прерываниям от внешних источников или периферийных модулей, либо при сбросе МК. В режиме ожидания мощность потребления МК PWAIT снижается по сравнению с активным режимом в 5…10 раз;
- режим останова (Stop mode, Sleep mode или Power Down mode). В этом режиме прекращает работу как центральный процессор, так и большинство периферийных модулей. Переход МК из состояния останова в рабочий режим возможен, как правило, только по прерываниям от внешних источников или после подачи сигнала сброса. В режиме останова мощность потребления МК PSTOP снижается по сравнению с активным режимом примерно на три порядка и составляет единицы микроватт.
Два последних режима называют режимами пониженного энергопотребления . Минимизация энергопотребления системы на МК достигается за счет оптимизации мощности потребления МК в активном режиме, а также использования режимов пониженного энергопотребления . При этом необходимо иметь в виду, что режимы ожидания и останова существенно отличаются временем перехода из режима пониженного энергопотребления в активный режим. Выход из режима ожидания обычно происходит в течение 3…5 периодов синхронизации МК, в то время как задержка выхода из режима останова составляет несколько тысяч периодов синхронизации. Кроме снижения динамики работы системы значительное время перехода в активный режим является причиной дополнительного расхода энергии.
Мощность потребления МК в активном режиме является одной из важнейших характеристик контроллера. Она в значительной степени зависит от напряжения питания МК и частоты тактирования.
В зависимости от диапазона питающих напряжений все МК можно разделить на три основные группы:
- МК с напряжением питания 5,0 В±10%. Эти МК предназначены, как правило, для работы в составе устройств с питанием от промышленной или бытовой сети, имеют развитые функциональные возможности и высокий уровень энергопотребления .
- МК с расширенным диапазоном напряжений питания: от 2,0…3,0 В до 5,0-7,0 В. МК данной группы могут работать в составе устройств как с сетевым, так и с автономным питанием.
- МК с пониженным напряжением питания: от 1,8 до 3 В. Эти МК предназначены для работы в устройствах с автономным питанием и обеспечивают экономный расход энергии элементов питания.
Зависимость тока потребления от напряжения питания МК почти прямо пропорциональная. Поэтому снижение напряжения питания весьма существенно понижает мощность потребления МК. Необходимо, однако, иметь в виду, что для многих типов МК с понижением напряжения питания уменьшается максимально допустимая частота тактирования, то есть выигрыш в потребляемой мощности сопровождается снижением производительности системы.
Большинство современных МК выполнено по технологии КМОП, поэтому мощность потребления в активном режиме PRUN практически прямо пропорциональна тактовой частоте. Поэтому, выбирая частоту тактового генератора , не следует стремиться к предельно высокому быстродействию МК в задачах, которые этого не требуют. Часто определяющим фактором оказывается разрешающая способность измерителей или формирователей временных интервалов на основе таймера или скорость передачи данных по последовательному каналу.
В большинстве современных МК используется статическая КМОП-технология, поэтому они способны работать при сколь угодно низких тактовых частотах вплоть до нулевых. В справочных данных при этом указывается, что минимальная частота тактирования равна dc ( direct current ). Это означает, что возможно использование МК в пошаговом режиме, например, для отладки. Мощность потребления МК при низких частотах тактирования обычно отражает значение тока потребления при fOSC = 32768 Гц (часовой кварцевый резонатор).
4.8. Тактовые генераторы МК
Современные МК содержат встроенные тактовые генераторы , которые требуют минимального числа внешних времязадающих элементов. На практике используются три основных способа определения тактовой частоты генератора: с помощью кварцевого резонатора, керамического резонатора и внешней RC-цепи.
Типовая схема подключения кварцевого или керамического резонатора приведена на рис. 4.9а.
Кварцевый или керамический резонатор Q подключается к выводам XTAL1 и XTAL2 , которые обычно представляют собой вход и выход инвертирующего усилителя. Номиналы конденсаторов C1 и C2 определяются производителем МК для конкретной частоты резонатора. Иногда требуется включить резистор порядка нескольких мегаом между выводами XTAL1 и XTAL2 для стабильной работы генератора.
Использование кварцевого резонатора позволяет обеспечить высокую точность и стабильность тактовой частоты (разброс частот кварцевого резонатора обычно составляет менее 0,01%). Такой уровень точности требуется для обеспечения точного хода часов реального времени или организации интерфейса с другими устройствами. Основными недостатками кварцевого резонатора являются его низкая механическая прочность (высокая хрупкость) и относительно высокая стоимость .
При менее жестких требованиях к стабильности тактовой частоты возможно использование более стойких к ударной нагрузке керамических резонаторов. Многие керамические резонаторы имеют встроенные конденсаторы, что позволяет уменьшить количество внешних подключаемых элементов с трех до одного. Керамические резонаторы имеют разброс частот порядка нескольких десятых долей процента (обычно около 0,5 %).
Самым дешевым способом задания тактовой частоты МК является использование внешней RС-цепи, как показано на рис. 4.9б. Внешняя RC-цепь не обеспечивает высокой точности задания тактовой частоты (разброс частот может доходить до десятков процентов). Это неприемлемо для многих приложений, где требуется точный подсчет времени. Однако имеется масса практических задач, где точность задания тактовой частоты не имеет большого значения.
Зависимость тактовой частоты МК от номиналов RC-цепи зависит от конкретной реализации внутреннего генератора и приводится в руководстве по применению контроллера.
Практически все МК допускают работу от внешнего источника тактового сигнала , который подключается ко входу XTAL1 внутреннего усилителя. При помощи внешнего тактового генератора можно задать любую тактовую частоту МК (в пределах рабочего диапазона) и обеспечить синхронную работу нескольких устройств.
Некоторые современные МК содержат встроенные RC или кольцевые генераторы, которые позволяют контроллеру работать без внешних цепей синхронизации. Работа внутреннего генератора обычно разрешается путем программирования соответствующего бита регистра конфигурации МК.
В большинстве моделей МК частота времязадающего элемента (резонатора или RC-цепи) и частота тактирования fBUS жестко связаны коэффициентом деления встроенного делителя частоты . Поэтому изменение частоты программным путем не представляется возможным. Однако ряд последних семейств МК (например, HC08 фирмы Motorola) имеют в своем составе схему тактирования, основанную на принципе синтезатора частоты с контуром фазовой автоподстройки ( PLL — phase loop lock). Такая схема работает как умножитель частоты и позволяет задавать тактовую частоту с помощью низкочастотного кварцевого резонатора, что снижает уровень электромагнитного излучения МК. Коэффициенты деления контура PLL могут быть изменены программным путем, что позволяет снизить тактовую частоту (и, соответственно, потребляемую мощность ) в промежутки времени, когда высокое быстродействие не требуется.
В некоторых МК семейства AVR фирмы Atmel тактовая частота контроллера, задаваемая внутренней RC-цепью, также может изменяться программными средствами.
Микроконтроллеры STM32G0: Периферия и таймеры
Продолжаем изучать новую серию микроконтроллеров STM32G0 производства STMicroelectronics. В третьей статье из цикла, основанного на публикации STM32G0 Online Training, рассматривается периферия этих микроконтроллеров – АЦП, ЦАП, встроенные ИОН, аналоговые компараторы – а также работа интерфейсов, таймеров и часов реального времени.
ADC: Аналогово-цифровой преобразователь
В составе микроконтроллеров STM32G0 присутствует многоканальный 12-битный аналого-цифровой преобразователь (АЦП) последовательного приближения. Благодаря встроенному блоку передискретизации разрядность АЦП может быть увеличена до 16 бит. Отличительными особенностями АЦП также являются возможность гибкой настройки, наличие собственных режимов пониженного потребления, широкий выбор алгоритмов работы, встроенный цифровой компаратор и возможность накопления результатов измерений с помощью DMA без участия процессора. Основные характеристики АЦП микроконтроллеров STM32G0 представлены в таблице 20.
Таблица 20. Основные характеристики АЦП микроконтроллеров STM32G0
Параметр | Значение |
---|---|
Число входных каналов | 16 внешних + 3 внутренних |
Тип | АЦП последовательного приближения |
Разрядность | 12 бит |
Скорость преобразования (12-битные измерения), MSPS | 2,5 (400 нс) |
Скорость преобразования (10-битные измерения), MSPS | 2,9 |
Скорость преобразования (8-битные измерения), MSPS | 3,5 |
Режимы работы | Single, Continous, Scan, Discontinous |
Триггерные сигналы | Программные или аппаратные (от таймеров или портов GPIO) |
Специальные функции | Режим цифрового компаратора, предискретизация, самокалибровка |
Обработка данных | Полинг, прерывания и DMA |
Собственные режимы пониженного потребления | Wait, Auto-off, Power down |
Дифференциальная нелинейность, LSB | ±1,2 |
Интегральная нелинейность, LSB | ±2,5 |
Эффективное число битов (ENOB) (12-битные измерения) | 10,2 |
Потребление, мкА | 475 (2,5 MSPS), 17 (10 kSPS) |
Рассмотрим структуру АЦП (рисунок 26). В его состав входят мультиплексор входных каналов, блок управления очередностью сканирования, схема запуска и остановки с поддержкой аппаратных и программных триггерных сигналов, 12-битный АЦП последовательного приближения со входным конденсатором, блок передискретизации, три цифровых компаратора, конфигурационные регистры, система управления питанием. Встроенный конденсатор необходим для поддержания входного напряжения в процессе выборки. Питание АЦП производится от внешнего источника, подключенного к выводу VDDA, но во многих случаях для питания контроллера и АЦП используется один и тот же внешний источник. Конфигурационные регистры АЦП подключены к шине APB.
Рис. 26. Блок-схема 12-битного АЦП микроконтроллеров STM32G0
Встроенный АЦП может измерять напряжение с 19 входных каналов. Коммутация каналов производится с помощью встроенного мультиплексора (рисунок 27). 16 каналов являются внешними, они подключены к выводам микроконтроллера. На каналы 12…14 подаются внутренние сигналы: напряжение с датчика температуры, напряжение VREF, напряжение с дежурной батарейки VBAT/3. Переключение между каналами может производиться вручную или по одному из выбранных алгоритмов, в том числе – с привлечением триггерных сигналов.
Рис. 27. Мультиплексирование входных каналов АЦП
АЦП имеет гибкую систему тактирования (рисунок 28). По умолчанию используется синхронное тактирование (сигнал PCLK, поделенный с помощью встроенного делителя на 1, 2 или 4). Однако если пользователю необходимо «развязать» тактовую частоту процессора и АЦП, то возможно организовать тактирование с помощью асинхронного сигнала ADC_CLK. В качестве ADC_CLK могут выступать HSI16, PLLPCLK или SYSCLK. Асинхронное тактирование необходимо в тех случаях, когда, например, требуется высокая производительность АЦП и невысокая частота процессорного ядра. Управление выбором источника тактирования выполняется с помощью битов CKMODE[3:0] регистра ADC_CFGR2.
Рис. 28. Схема тактирования АЦП
Работа АЦП состоит из двух фаз: фазы выборки и фазы преобразования. В фазе выборки происходит заряд входного конденсатора АЦП. Чем выше импеданс источника напряжения, тем больше времени потребуется, чтобы зарядить входной конденсатор. В случае со встроенным АЦП микроконтроллеров STM32G0 пользователь может задавать следующие значения длительности фазы выборки: 1,5/3,5/7,5/19,5/39,5/79,5/160,5 рабочих тактов. Таким образом, минимальная длительность этой фазы составляет 1,5 рабочих такта. Стоит отметить, что пользователь может одновременно работать только с двумя значениями длительности фазы выборки.
В фазе преобразования АЦП измеряет напряжение, накопленное на входном конденсаторе. Очевидно, что в случае с АЦП последовательного приближения длительность измерения зависит от разрядности. Чем выше разрядность – тем больше потребуется времени на выполнение измерения. Так, при использовании максимальной разрядности 12-бит преобразование займет 12,5 рабочих тактов, а при разрядности 6 бит – только 6,5 тактов. Таким образом, на максимальной рабочей частоте АЦП (35 МГц) скорость измерений при максимальной разрядности составит 2,5 MSPS (миллионов выборок в секунду) (длительность фазы выборки 1,5 такта). При уменьшении разрядности скорость будет еще выше. Например, при разрядности 6 бит скорость измерений составит 4,37 MSPS (таблица 21).
Таблица 21. Максимальная производительность АЦП при рабочей частоте 35 МГц
Разрешение, бит | Длительность фазы выборки, тактов | Длительность фазы преобразования, тактов | Производительность АЦП, MSPS |
---|---|---|---|
12 | 1,5 | 12,5 | 2,5 |
10 | 1,5 | 10,5 | 2,9 |
8 | 1,5 | 8,5 | 3,5 |
6 | 1,5 | 6,5 | 4,37 |
Важной особенностью АЦП является встроенный блок передискретизации, который позволяет увеличить разрядность измерений до 16 бит за счет усреднения результатов от множества измерений. Алгоритм работы этого блока достаточно прост. Каждый раз при получении нового результата измерения он складывается с предыдущим результатом, то есть происходит аппаратная операция сложения с накоплением. Пользователь сам задает число выборок в диапазоне 1…256 с помощью поля OVFS[2:0] регистра ADC_CFGR2. Полученное в итоге число сдвигается вправо на заданное число бит, которое определяется полем OVSS[3:0] регистра ADC_CFGR2. Встроенный регистр накопления имеет длину 20 бит, однако после выполнения сдвига происходит обрезка результата до 16 бит. Вполне очевидно, что расплатой за увеличение разрядности становится уменьшение эффективной частоты измерений. Для увеличения разрядности до 16 бит потребуется выполнить как минимум 16 измерений, а значит, эффективная частота измерений упадет в 16 раз – с 2,5 MSPS до 156,25 kSPS. При максимальной степени передискретизации (256 выборок) эффективное быстродействие АЦП составит 9,77 kSPS.
Как уже упоминалось выше, АЦП имеет в своем составе специальный блок, позволяющий управлять процедурой запуска и очередностью подключения каналов. Благодаря этому блоку АЦП поддерживает несколько алгоритмов работы (рисунок 29), таких как:
- режим Single conversion mode предполагает выполнение однократного измерения напряжения на выбранном канале;
- режим Continuous conversion mode позволяет выполнять циклические измерения напряжения на выбранном канале с автозапуском;
- режим Scan mode используется для однократного выполнения цепи измерений на выбранных каналах. Порядок измерений может быть либо последовательным, либо определяться пользователем. Заданная пользователем цепочка измерений может содержать до восьми каналов;
- режим Continuous scan mode – циклический многоканальный режим с автозапуском;
- режим Discontinuous mode предполагает выполнение цепочки измерений, однако запуск каждого следующего измерения производится с помощью триггерного сигнала. Триггерный сигнал может формироваться пользовательской программой либо поступать от встроенных таймеров.
Рис. 29. Алгоритмы работы АЦП в микроконтроллерах STM32G0
Еще одной полезной функцией АЦП является функция цифрового компаратора. Во многих случаях пользователю требуется получить не сам результат измерения, а только определить, находится ли этот результат в рамках допустимого диапазона. Именно эту задачу и решают встроенные цифровые компараторы. Всего в составе АЦП присутствуют три таких компаратора. Для их использования необходимо задать граничные значения. О срабатывании компаратора можно узнать по флагу или по возникновению прерывания, если оно разрешено.
В АЦП микроконтроллеров STM32G0 реализованы несколько интересных режимов работы, обеспечивающих снижение потребления:
- Deep Power-down mode. Если АЦП не используется, то он может быть физически отключен от линий питания (с помощью встроенного силового ключа) для минимизации токов утечки.
- Wait mode. Если данный режим активирован, то после выполнения преобразования АЦП не начинает следующее измерение до тех пор, пока не будет считан результат измерений или не будет сброшен флаг EOC.
- Auto-off mode. Находясь в режиме Auto-off, АЦП автоматически выключается после выполнения измерения, а его пробуждение происходит только при запросе следующего преобразования. Пробуждение АЦП требует некоторого времени. Таким образом, в режиме Auto-off достигается снижение потребления, однако оперативность измерений также уменьшается.
Режимы Auto-off и Wait могут использоваться одновременно. В таком случае АЦП отключается каждый раз, когда активируется фаза ожидания.
Потребление АЦП зависит от рабочей частоты. При частоте измерений 2,5 MSPS потребление составляет около 475 мкА (2,5 MSPS), а при частоте 10 kSPS потребление уменьшается до 17 мкА.
Как уже отмечалось выше, результат измерения АЦП помещается в 16-битный регистр данных. При этом у пользователя есть несколько вариантов для контроля статуса преобразования: стандартный полинг (постоянное вычитывание флага окончания преобразования EOC), использование прерываний, а также автоматическая пересылка данных с помощью DMA.
АЦП способен выставлять ряд флагов с возможностью генерации прерываний:
- ADRDY – АЦП котов к выполнению преобразования;
- EOC – преобразование завершено;
- EOS – цепь преобразований завершена;
- EOCAL – калибровка завершена;
- AWD1…3 – срабатывание цифрового компаратора 1…3;
- EOSMP – фаза выборки завершена;
- OVR – ошибка записи новых данных, если старые данные перед этим не были вычитаны;
- CCREADY – конфигурация канала завершена.
Для получения информации по работе АЦП в режимах пониженного потребления следует обратиться к первой части статьи из данного цикла – «Микроконтроллеры STM32G0: Архитектура и системная периферия». Вопросы повышения эффективности использования выстроенных АЦП микроконтроллеров STM32 рассматриваются в руководстве «AN2834. Application note. How to get the best ADC accuracy in STM32 microcontrollers».
DAC: цифро-аналоговый преобразователь
Микроконтроллеры STM32G0 имеют в своем составе два 12-битных ЦАП, которые могут работать как независимо друг от друга, так и синхронно. Основные характеристики ЦАП представлены в таблице 22. Отличительными особенностями встроенных ЦАП являются: поддержка различных форматов входных данных, возможность запуска от внешних и внутренних триггерных сигналов, наличие встроенного буфера, возможность генерации шумового и треугольного сигналов, а также поддержка особого режима пониженного потребления при использовании схемы выборки/хранения (Sample and Hold). Рассмотрим эти особенности подробнее.
Таблица 22. Основные характеристики встроенных ЦАП микроконтроллеров STM32G0
Параметр | Значение |
---|---|
Число ЦАП | 2 |
Напряжение питания VDDA, В | 1,8…3,6 |
Разрядность, бит | 12/8 |
Гарантированная монотонность, бит | 10 |
Дифференциальная нелинейность, LSB | ±2 |
Интегральная нелинейность, LSB | ±4 |
Эффективное число битов (ENOB) (1 кГц) | 11, 4 с буфером и 11,5 без буфера |
Скорость преобразования, MSPS | 1 |
Потребление (VDDA + VREF+), мкА | 185 с выходным буфером и 155 без выходного буфера |
Структура встроенных ЦАП представлена на рисунке 30. В состав каждого ЦАП входят конфигурационные регистры, логика управления, 12-битный ЦАП, схема управления режимом выборки/хранения, выходные буферы. Тактирование ЦАП производится с помощью тактового сигнала PCLK (шина APB), но при активизации режима выборки/хранения (Sample and Hold) тактирование выполняется от LSI. Данные, требующие цифро-аналогового преобразования, первоначально поступают в буферные регистры DAC_DHRx. Далее по сигналу запуска (триггеру) данные копируются в регистр DOR, а оттуда поступают в ЦАП. Сигнал с ЦАП может буферизироваться с помощью выходного буфера. Окончательный сигнал подается либо на внешние выводы микроконтроллера, либо на входы внутренней периферии (например, на входы компараторов). Подробнее о взаимном подключении периферийных блоков рассказывается в первой статье данного цикла в разделе «Interconnect Matrix (IMX): матрица межсоединений периферийных блоков».
Рис. 30. Блок схема ЦАП микроконтроллеров STM32G0
Встроенные каналы ЦАП могут работать независимо или синхронно. При использовании асинхронного режима поддерживаются три формата входных данных (рисунок 31):
- 8-битный с правым выравниванием. Запись производится в регистр DAC_DHR8Rx[7:0], ], в котором данные автоматически преобразуются и поступают в регистр данных DHRx[11:4];
- 12-битный с левым выравниванием. Запись производится в регистр DAC_DHR12Lx [15:4], ], в котором данные автоматически преобразуются и поступают в регистр данных DHRx[11:0];
- 12-битный с правым выравниванием. Запись производится в регистр DAC_DHR12Rx [11:0], в котором данные автоматически преобразуются и поступают в регистр данных DHRx[11:0].
Рис. 31. Формат входных данных при асинхронной работе ЦАП (single mode)
Если выбран синхронный режим работы, то данные из входных регистров должны поступать в оба канала ЦАП одновременно. Для организации синхронной передачи данных используются специальные входные регистры и соответствующие им форматы (рисунок 32):
- 8-битный с правым выравниванием. Запись данных первого канала производится в DAC_DHR8RD[7:0], а второго канала – в DAC_DHR8RD [15:8]. Далее информация синхронно преобразуется и поступает в DHR1[11:4] и DHR2[11:4];
- 12-битный с левым выравниванием. Запись данных первого канала производится в DAC_DHR12LD[15:4], а второго – в DAC_DHR12LD [31:20]. Далее информация синхронно преобразуется и поступает в DHR1[11:0] и DHR2[11:0];
- 12-битный с правым выравниванием. Запись данных первого канала производится в DAC_DHR12RD [11:0], а второго – в DAC_DHR12RD [27:16]. Далее информация синхронно преобразуется и поступает в DHR1[11:0] и DHR2[11:0].
Рис. 32. Формат входных данных при работе ЦАП в синхронном режиме (dual mode)
После автоматического форматирования данные копируются из входных регистров в регистр DHRх. Если в регистре конфигурации DAC_CR не разрешены триггерные сигналы (TENx), то уже через один такт (PCLK) данные попадают в регистр DAC_DORx, после чего поступают в ЦАП. Если же требуется запускать цифро-аналоговое преобразование только по какому-либо триггерному сигналу, то следует выставить бит TENx и выбрать сигнал запуска. В качестве триггерных сигналов могут выступать сигналы с таймеров, а также сигналы с внешних выводов микроконтроллера (таблица 23). Стоит отметить, что при работе с триггерными сигналами копирование данных из DHRх в DAC_DORx занимает три такта.
Таблица 23. Сигналы запуска ЦАП (триггерные сигналы)
Источник | Описание | TSELx[3:0] |
---|---|---|
SWTRIG | Программный триггер | 0 |
TIM1_TRGO | Внутренний сигнал от таймера | 1 |
TIM2_TRGO | Внутренний сигнал от таймера | 10 |
TIM3_TRGO | Внутренний сигнал от таймера | 11 |
Резерв | – | 100 |
TIM6_TRGO | Внутренний сигнал от таймера | 101 |
TIM7_TRGO | Внутренний сигнал от таймера | 110 |
резерв | – | 111 |
TIM15_TRGO | Внутренний сигнал от таймера | 1000 |
TIM3_TRGO | Внутренний сигнал от таймера | 1001 |
Резерв | – | 1010 |
LPTIM1_OUT | Внутренний сигнал от таймера | 1011 |
LPTIM2_OUT | Внутренний сигнал от таймера | 1100 |
EXTI9 | Внешний сигнал с вывода микроконтроллера | 1101 |
Резерв | – | 1110 |
Резерв | – | 1111 |
Встроенные ЦАП используют резистивную R-2R-цепочку для формирования выходного сигнала напряжения. Такое решение отличается простотой и высокой монотонностью выходной характеристики (до 10 бит). Однако из-за высокого собственного сопротивления резистивной цепочки (около 12 кОм) у АЦП могут возникнуть проблемы при работе с низкоомной нагрузкой. К счастью, в случае с STM32G0 эту проблему удается решить без привлечения внешних усилителей с помощью встроенных буферов. При использовании буфера следует учитывать некоторый рост потребления. Если без буфера потребление ЦАП составляет 155 мкА, то при включении буфера оно возрастет до 185 мкА.
В самом простом случае данные, требующие цифроаналогового преобразования, записываются в ЦАП силами процессора. Однако возможны и альтернативные варианты. Наиболее эффективным с точки зрения производительности и потребления становится вариант с использованием DMA. DMA может автоматически без привлечения процессора по триггерному сигналу копировать данные из памяти в регистры ЦАП. Использование DMA бережет вычислительные ресурсы, уменьшает потребление и позволяет ЦАП работать даже в режиме «Sleep».
Кроме того, ЦАП может получать входные данные от встроенных функциональных генераторов: генератора шума и генератора пилообразного сигнала. На рисунке 33 представлена схема генератора шума, а на рисунке 34 поясняется принцип работы генератора пилообразного напряжения. Оба сигнала также формируются автоматически.
Рис. 33. Формирование шумового сигнала
Сигналы с выхода ЦАП могут поступать не только на внешние выводы микроконтроллера, но и на входы других периферийных блоков, даже в режимах «Sleep» и «Stop». Если работа в режиме «Sleep» возможна благодаря DMA, то в режиме «Stop» работоспособность ЦАП поддерживается с помощью специальной схемы выборки/хранения (Sample and Hold). Суть работы данной схемы достаточно проста. Сначала ЦАП формирует напряжение на конденсаторе (внутреннем или внешнем), а затем отключается для уменьшения потребления. Так как в схеме всегда присутствуют утечки, то напряжение на конденсаторе будет постепенно уменьшаться. Для поддержания постоянного выходного напряжения необходимо, чтобы ЦАП периодически «просыпался» и выполнял регенерацию сигнала. Именно за этот процесс отвечает схема выборки/хранения.
Рис. 34. Работа генератора треугольных сигналов
Работа схемы выборки/хранения имеет три фазы (рисунок 35). В фазе выборки (Sample phase) ЦАП заряжает выходной конденсатор. В качестве выходного конденсатора может выступать как встроенный, так и внешний конденсатор, подключенный к выводу микроконтроллера. Однако стоит иметь в виду, что встроенного конденсатора будет достаточно только в том случае, если выход ЦАП подключен к внутренней периферии контроллера. Если же сигнал с ЦАП поступает на внешний вывод микроконтроллера, то к этому выводу потребуется подключить внешний конденсатор. В фазе хранения (Hold phase) ЦАП выключается, а напряжение на конденсаторе начинает уменьшаться. После фазы хранения следует фаза регенерации (Refresh phase), в течение которой ЦАП вновь заряжает конденсатор. Длительность каждой из фаз задается пользователем в регистрах DAC_SHSRx, DAC_SHHR и DAC_SHRR. Для тактирования схемы выборки/хранения используется генератор LSI. Потребление ЦАП при работе в данном режиме зависит от частоты регенерации и токов утечки. В реальных схемах возможно обеспечить потребление на уровне 1 мкА.
Рис. 35. Работа схемы выборки/хранения (Sample and Hold)
Для более полного ознакомления с особенностями использования встроенных ЦАП микроконтроллеров STM32 следует обратиться к существующим руководствам, например:
VREFBUF: источник опорного напряжения
Для работы АЦП и ЦАП требуется источник опорного напряжения (ИОН). В микроконтроллерах STM32G0 для подключения внешнего ИОН используется вывод VREF (присутствует опционально). К сожалению, каждый дополнительный внешний компонент увеличивает стоимость изделий и занимает место на печатной плате. В ряде случаев в качестве опорного напряжения можно использовать аналоговое напряжение питания VDDA, однако недостаток такого подхода заключается в том, что напряжение VDDA не всегда стабильно, особенно если в качестве основного источника питания выступает аккумулятор или батарейка. Что делать, если не получается обойтись без ИОН? Микроконтроллеры STM32G0 предлагают идеальное решение в виде встроенного источника VREFBUF. Основные характеристики VREFBUF представлены в таблице 24.
Таблица 24. Характеристики встроенного буфера VREFBUF
Параметр | Значение |
---|---|
Выходное напряжение, В | 2,048 или 2,5 |
Напряжение питания VDDA, В | 2,4…3,6 (выходное напряжение VREFBUF 2,048 В) |
2,8…3,6 (выходное напряжение VREFBUF 2,5 В) | |
Погрешность выходного напряжения | -2/+1 (2,048 В), |
-2/+2 (2,5 В) | |
Ток нагрузки, мА | 4 |
Потребление, мкА | 16 (выходной ток VREFBUF 0 мкА) |
18 (выходной ток VREFBUF 500 мкА) | |
35 (выходной ток VREFBUF 4 мА) | |
PSRR, дБ | 60 |
Время запуска, мкс | 500 (емкостная нагрузка 1,1 мкФ) |
Встроенный источник опорного напряжения VREFBUF представляет собой стабилитрон с дополнительным буфером. Выходное напряжение VREFBUF выбирается пользователем из двух значений: 2,048 или 2,5 В. При этом следует иметь в виду, что для получения напряжения 2,5 В необходимо, чтобы напряжение питания VDDA было больше 2,8 В.
Для нормальной работы VREFBUF требуется внешний конденсатор, подключаемый к выводу VREF микроконтроллера. Стоит отметить, что вывод VREF есть не у всех моделей STM32G0. Если в выбранном корпусном исполнении вывод VREF отсутствует, то это значит, что данный сигнал подключен к напряжению питания VDDA внутри микроконтроллера и работа буфера VREFBUF становится невозможной (он должен быть выключен).
Опорное напряжение, формируемое VREFBUF, может использоваться не только встроенными АЦП и ЦАП, но и внешними цепями. Благодаря встроенному буферу максимальный выходной ток VREFBUF достигает 4 мА.
Режим работы VREFBUF определяется двумя битами регистра VREFBUF_CSR: ENVR и HIZ (таблица 25). После выполнения изменения конфигурации VREFBUF требует некоторого времени для выхода на режим. Статус готовности можно контролировать с помощью бита VRR из регистра VREFBUF_CSR.
Таблица 25. Режимы работы VREFBUF
ENVR | HIZ | VREFBUF | Описание |
---|---|---|---|
0 | 0 | Выкл. | Режим без ИОН. VREFBUF выключен. Выход VREF подтянут к VSSA. |
0 | 1 | Выкл. | Режим внешнего ИОН. Внешний источник опорного напряжения должен быть подключен к выходу VREF (данный режим установлен по умолчанию). |
1 | 0 | Вкл. | Режим внутреннего ИОН. VREFBUF подключен к выходу VREF. |
1 | 1 | Выкл. | Режим Hold mode. VREFBUF выключен. Выход VREF отключен от VREFBUF. Напряжение на VREF поддерживается внешним конденсатором. |
Выходное напряжение VREFBUF калибруется при производстве микроконтроллера. Калибровочные данные записываются в поле TRIM[5:0] регистра VREFBUF_CCR. Однако у пользователя есть возможность самостоятельно изменять содержимое TRIM[5:0] и дополнительно калибровать VREFBUF.
VREFBUF способен работать в режимах пониженного потребления до «Stop 0» и «Stop 1» включительно. Это особенно важно, так как напряжение VREFBUF может использоваться внешними схемами.
COMP: аналоговые компараторы
В составе встроенного АЦП есть сразу три цифровых компаратора. Это очень удобные и полезные инструменты, однако у них есть один большой недостаток. Цифровые компараторы получают данные от АЦП, а значит, не могут непрерывно контролировать входной сигнал. Если же в приложении необходимо выполнять непрерывный контроль, то следует воспользоваться встроенными аналоговыми компараторами.
В составе STM32G0 есть два аналоговых компаратора COMP1 и COMP2, которые позволяют непрерывно контролировать внешние сигналы, поступающие с выводов микроконтроллера, а также сигналы со встроенной периферии. В свою очередь выходы компараторов могут быть подключены к выводам микроконтроллера или ко встроенной периферии, а также использоваться для генерации прерываний.
На рисунке 36 представлена структурная схема аналоговых компараторов COMP1 и COMP2. В составе каждого канала компаратора есть входной мультиплексор, мультиплексор режима оконного компаратора, непосредственно сам компаратор, мультиплексор инверсии выходного сигнала, схема для реализации режима блокировки.
Рис. 36. Структура аналоговых компараторов COMPx
У каждого компаратора есть инвертирующий и неинвертирующий входы. Благодаря входным мультиплексорам на эти входы могут подаваться сигналы как с внешних выводов микроконтроллера, так и от встроенной периферии, в том числе от ЦАП, таймеров и VREF. Выбор источника для инвертирующего входа выполнится с помощью поля INMSEL регистра COMP1_CSRx, а выбор источника для неинвертирующего входа – с помощью поля INPSEL регистра COMP1_CSRx (таблицы 26 и 27).
Таблица 26. Подключение неинвертирующих входов COMP1 и COMP2 [1]
COMP1_INPSEL[1:0] | COMP1_INP | COMP2_INPSEL[1:0] | COMP2_INP |
---|---|---|---|
00 | PC5 | 00 | PB4 |
01 | PB2 | 01 | PB6 |
10 | PA1 | 10 | PA3 |
11 | Не подключен | 11 | Не подключен |
Таблица 27. Подключение инвертирующих входов COMP1 и COMP2 [1]
COMP1_INMSEL[3:0] | COMP1_INM | COMP2_INMSEL[3:0] | COMP2_INM |
---|---|---|---|
0000 | ¼ VREFINT | 0000 | ¼ VREFINT |
0001 | ½ VREFINT | 0001 | ½ VREFINT |
0010 | ¾ VREFINT | 0010 | ¾ VREFINT |
0011 | VREFINT | 0011 | VREFINT |
0100 | DAC Channel1 | 0100 | DAC Channel1 |
0101 | DAC Channel2 | 0101 | DAC Channel2 |
0110 | PB1 | 0110 | PB3 |
0111 | PC4 | 0111 | PB7 |
1000 | PA0 | 1000 | PA2 |
> 1000 | ¼ VREFINT | > 1000 | ¼ VREFINT |
У встроенных компараторов есть несколько особых режимов работы. В частности, два компаратора могут объединяться для создания одного оконного компаратора (Window mode). Оконный компаратор обеспечивает контроль за тем, чтобы входной сигнал находился в выбранном диапазоне напряжений (рисунок 37). При этом у пользователя есть возможность сэкономить один внешний вывод микроконтроллера за счет объединения входов компараторов. Для этого используется бит WINMODE.
Рис. 37. Работа COMP1 и COMP2 в режиме оконного компаратора
Режим работы с программируемым гистерезисом – еще один полезный режим компаратора, который позволяет избежать выходного дребезга при работе с плавно изменяющимися или зашумленными сигналами (рисунок 38).
Рис. 38. Режим компаратора с гистерезисом
Компараторы очень часто используются для контроля тока в различных приложениях, например, в мощных инверторах и приводах электродвигателей. При коммутации таких устройств часто возникают броски тока с амплитудой, превышающей допустимые значения. Несмотря на то, что эти броски имеют кратковременный характер и являются нормальным явлением, они, тем не менее, успевают вызвать срабатывание компаратора. Чтобы защититься от ложных срабатываний встроенных компараторов COMP1 и COMP2, используется режим работы со слепой зоной и блокирующим сигналом Blink mode (рисунок 39). В качестве блокирующего сигнала могут выступать TIM1 OC4, TIM1 OC5, TIM2 OC3, TIM3 OC3, TIM15 OC2.
Рис. 39. Режим работы с блокирующим сигналом для пропуска стартового броска
Выходы компаратора очень часто подключаются ко входам таймеров для решения различных задач, таких как:
- подключение ко входам BKIN для аварийного отключения ШИМ-сигналов при срабатывании компаратора;
- подключение ко входам ETR для непрерывного контроля тока;
- подключение ко входам захвата для измерения периода импульсов на выходе компаратора.
О подключении компараторов к таймерам рассказывалось в первой статье данного цикла в разделе «Interconnect Matrix (IMX): матрица межсоединений периферийных блоков» (в частности, в таблице 1).
Во многих приложениях компараторы должны обеспечивать минимальную задержку и быстрый отклик на входные сигналы. С другой стороны компараторы могут также использоваться в режимах пониженного потребления вплоть до «Stop». В таких случаях они должны, в первую очередь, иметь малое потребление. Чтобы разрешить это противоречие, пользователям предлагаются на выбор сразу два режима работы с компромиссными значениями потребления и быстродействия: High speed и Medium speed. Выбор режима осуществляется с помощью поля PWRMODE[1:0] в регистре COMPx_CSR. Сравнение режимов представлено в таблице 28.
Таблица 28. Сравнение режимов High speed и Medium speed
Режим | PWRMODE[1:0] | Задержка, мкс | Типовое потребление, мкА |
---|---|---|---|
High speed | 00 | 1,2 | 250 |
Medium speed | 01 | 0,07 | 6 |
Компараторы способны генерировать прерывания NVIC (12 канал разделяется с АЦП) и EXTI (каналы 11 и 17).
USART: универсальный синхронный/асинхронный приемопередатчик
Универсальный синхронный/асинхронный приемопередатчик. USART является одним из наиболее популярных интерфейсов и используется в самых различных областях, начиная от коммерческих приложений и заканчивая промышленными системами. В составе STM32G0 присутствуют сразу четыре модуля USART, каждый из которых имеет возможность гибкой настройки и поддерживает различные виды обмена.
Структура приемопередатчика USART представлена на рисунке 40. Из нее видно, что USART состоит из двух доменов тактирования. Регистры управления подключены к шине APB и работают с тактовой частотой PCLK. Основное ядро USART работает с собственным тактовым сигналом, источником для которого могут выступать PCLK, HSI16, LSE и SYSCLK. Для согласования этих доменов используются специальные FIFO-буферы.
Рис. 40. Блок-схема приемопередатчика USART
Для организации обмена данными приемопередатчик использует пять выводов. Их функции зависят от режимов работы:
- сигналы TX и RX используются для передачи и приема данных в большинстве режимов;
- сигналы nCTS и nRTS участвуют в аппаратном управлении потоком данных в RS-232;
- сигнал DE используется для управления активностью внешней микросхемы трансивера RS-485/422;
- сигнал СK выступает в качестве сигнала тактирования при работе в режиме SPI. Этот же сигнал является входным сигналом тактирования в режиме Smartcard;
- сигнал NSS используется для выбора ведомого при работе в режиме SPI.
Стоит отметить, что количество модулей USART и их возможности зависят от конкретной модели микроконтроллера STM32G0. Обзор возможностей модулей USART приведен в таблице 29.
Таблица 29. Обзор встроенных приемопередатчиков USART
Возможности | USART1, USART2* | USART2**, USART3/4* | LPUART |
---|---|---|---|
Аппаратный контроль потока данных (RS-232 и RS-485) | + | + | + |
Поддержка DMA | + | + | + |
Мультипроцессорный режим обмена данными | + | + | + |
Синхронный режим (мастер/ведомый) | + | + | – |
Режим Smartcard | + | – | – |
Однопроводной полудуплексный режим обмена | + | + | + |
IrDA SIR ENDEC | + | – | – |
Режим LIN | + | – | – |
Два домена тактирования и пробуждение из режимов пониженного потребления | + | – | + |
Прерывание по таймауту при отсутствии принимаемых данных | + | – | – |
Modbus | + | – | – |
Автоматическое определение скорости передачи | + | – | – |
Поддержка сигнала Driver Enable для RS-485 | + | + | + |
Длина данных, бит | 7, 8, 9 | ||
Tx/Rx FIFO | + | – | + |
Размер Tx/Rx FIFO | 8 | – | 8 |
* Только для STM32G071xx и STM32G081xx. ** Только для STM32G031xx и STM32G041xx. |
Каждый из модулей USART позволяет гибко настраивать параметры сообщений:
- длину данных 7/8/9 бит;
- формат бита четности: четный, нечетный, без бита четности;
- количество стоп-битов: 0,5/1/1,5/2;
- порядок передачи данных: младшим или старшим битом вперед;
- скорость передачи;
- количество выборок за бит: 16 или 8. При использовании 8 выборок обеспечивается максимальная скорость передачи, а при использовании 16 выборок повышается устойчивость к рассогласованию таковых генераторов приемника и передатчика, а также устойчивость к шумам.
Следует отметить некоторые особенные функции USART. В частности, функцию автоматического определения частоты обмена (Auto Baud Rate Detection), а также возможность распознавания окончания передачи по таймауту (Receiver Timeout).
Модули USART позволяют гибко настраивать выводы, например, менять местами линии TX и RX. Благодаря этому они могут работать в различных режимах, таких как: полнодуплексный асинхронный режим, синхронный ведущий и ведомый режим с формированием/приемом тактового сигнала, однопроводной полнодуплексный режим, многопроцессорный режим.
Наличие выводов nCTS и nRTS, а также DE позволяют приемопередатчикам USART выполнять аппаратный контроль потока данных при реализации интерфейсов RS-232 и RS-485.
Модули USART1/2 также поддерживают и другие популярные интерфейсы: Modbus, LIN, IrDA SIR ENDEC, Smartcard.
Приемопередатчики USART способны формировать запросы DMA и вести двунаправленный обмен данными без участия процессора. При этом модули USART1/2 сохраняют работоспособность вплоть до режима «Stop» и могут при необходимости пробуждать процессор.
LPUART: малопотребляющий UART
В предыдущем разделе были рассмотрены основные особенности универсальных приемопередатчиков USART, реализованных в микроконтроллерах STM32G0. Кроме того, в таблице 10 были также представлены функциональные возможности малопотребляющего приемопередатчика LPUART. Его функционал достаточно сильно урезан по сравнению, например, с USART1. В частности, LPUART не имеет поддержки синхронного обмена, Modbus, LIN, IrDA SIR ENDEC, Smartcard, не может автоматически определять скорость передачи и распознавать окончание передачи по таймауту. С другой стороны, большая часть остальных параметров LPUART оказывается такой же, как и у USART1/2, а его главным козырем становится минимальное потребление.
Благодаря отказу от «лишнего» функционала, потребление LPUART оказывается очень скромным (таблица 30). Ниже потребление только у USART3/4. Однако у модулей USART3/4 есть целый ряд принципиальных ограничений: они имеют ограниченный функционал, не способны работать в режимах «Stop 0» и «Stop 1», и, кроме того, доступны только в старших линейках микроконтроллеров STM32G071xx и STM32G081xx.
Таблица 30. Сравнение потребления модулей USART и LPUART в различных режимах
Приемопередатчик | Потребление, мка/МГц | ||
---|---|---|---|
Range 1 | Range 2 | Low-power run и Sleep | |
USART1 | 7,2 | 6 | 6,5 |
USART2 | 7,2 | 6 | 6 |
USART3 | 2 | 1,7 | 2 |
USART4 | 2 | 1,7 | 2 |
LPUART1 | 4,3 | 3,5 | 4 |
Интерфейс Serial Peripheral Interface (SPI)
SPI (Serial Peripheral Interface) является чрезвычайно простым и в то же время быстрым интерфейсом, позволяющим микроконтроллерам STM32G0 обмениваться данными с различными внешними устройствами, такими как АЦП, ЦАП, кодеки, радиомодули и многие другие. SPI-контролер, реализованный в STM32G0, обладает высокой гибкостью и способен работать с частотами до 32 МГц в различных режимах, таких как симплекс, дуплекс и полудуплекс.
Структурная схема SPI-контролера представлена на рисунке 41. В его состав входят следующие блоки: схема управления логикой работы (контроллер), генератор тактовой частоты (SCK), отдельные 32-битные FIFO-буферы для приема и передачи, блок вычисления контрольной суммы, схема управления функционалом вывода NSS. Тактирование SPI производится с помощью сигнала PCLK (шина APB).
Рис. 41. Блок-схема SPI
SPI-контроллер может выступать в качестве передатчика и приемника, а также работать в режиме ведущего и ведомого. Для взаимодействия со внешними устройствами используются четыре вывода: MOSI, MISO, SCK, NSS. Назначение этих выводов зависит от режима работы. В режиме ведущего контроллер передает данные через MOSI, принимает данные через MISO, генерирует тактовый сигнал на линии SCK, выбирает ведомого с помощью линии NSS. В режиме ведомого назначение линий меняется: контроллер принимает данные через MOSI, передает данные через MISO, принимает сигнал тактирования SCK и, при необходимости, принимает сигнал выбора ведомого NSS.
Рассмотрим основные схемы включения и режимы обмена, которые позволяет реализовывать SPI.
Стандартный полнодуплексный режим обмена. Данный режим необходим для двунаправленного обмена данными между ведущим и ведомым. Микроконтроллер STM32G0 может выступать и в той, и в другой роли. При таком обмене задействованными оказываются все линии (рисунок 42).
Рис. 42. Полнодуплексный обмен между ведущим и ведомым
Симплексная передача. Иногда требуется передавать данные только в одном направлении: от ведущего к ведомому или от ведомого к ведущему. В таких случаях допускается не подключать неиспользуемую линию (MOSI или MISO), а освободившийся вывод микроконтроллера использовать для других целей. Пример такого подключения представлен на рисунке 43.
Рис. 43. Симплексный режим передачи данных от ведущего к ведомому
Полудуплексный обмен. Иногда для экономии выводов используют двунаправленный обмен по одной линии. В таком случае ведущий и ведомый передают данные по очереди, используя общую линию MOSI (MISO), как показано на рисунке 44. Одновременная передача не допускается. Если, например, ведущий попытается передать «0» и в тот же момент времени ведомый установит на выходе «1», то в цепи начнет протекать ничем не ограниченный ток. С точки зрения ведомого ситуация будет аналогична короткому замыканию на землю. Чтобы избежать аварии, необходимо поместить в цепь токоограничивающий резистор. Номинал резистора выбирается исходя из допустимого тока портов микроконтроллера и требуемого быстродействия. В качестве отправной точки можно использовать номинал 1 кОм.
Рис. 44. Полудуплексный обмен между ведущим и ведомым
Полнодуплексный обмен с несколькими ведомыми. SPI-контроллер имеет только один специализированный вывод NSS для выбора ведомого. Однако если в качестве NSS использовать дополнительные порты ввода-вывода, то можно организовать двунаправленный обмен между одним мастером и несколькими ведомыми (рисунок 45). В каждый момент времени на шине может быть только один активный ведомый. При попытке одновременной передачи несколькими ведомыми произойдет аварийная ситуация, аналогичная той, что была рассмотрена в предыдущем случае.
Рис. 45. Полнодуплексный обмен с несколькими ведомыми
Полнодуплексный обмен между двумя ведущими (Multi-master). Так как SPI-контроллеры, реализованные в STM32G0, способны оперативно переключаться между режимами ведущего и ведомого, то при использовании дополнительных портов можно организовать обмен между двумя ведущими устройствами (рисунок 46). По умолчанию оба устройства находятся в режиме ведомого. Если первое устройство решило выполнить передачу данных, оно блокирует режим ведущего второго устройства с помощью линии NSS. После завершения передачи первое устройство вновь приходит в режим ведомого и освобождает шину.
Рис. 46. Полнодуплексный обмен между двумя ведущими
SPI-контроллеры в STM32G0 позволяют гибко настраивать формат данных и параметры передачи:
- разрядность передаваемых данных 4…16 бит;
- программируемая полярность и фаза тактового сигнала;
- передача данных младшим или старшим битом вперед.
Среди важных особенностей SPI-контроллеров STM32G0 стоит также отметить наличие двух независимых 32-битных буферов для приема и передачи, благодаря которым удается избежать потери данных, возможность формирования запросов DMA при приеме и передачи данных, автоматический расчет и контроль контрольных сумм CRC.
Интерфейс Inter-Integrated Circuit (I 2 C)
Интерфейс I 2 C активно используется в широком спектре приложений. У него есть несколько важных преимуществ, среди которых следует в первую очередь отметить простоту реализации, минимальное число сигнальных линий, возможность двунаправленного обмена данными, шинную организацию с большим числом узлов, привлекательную цену, возможность обмена данными как между микросхемами, находящимися на одной плате, так и между отдельными устройствами.
Типовая структура шины I 2 C представлена на рисунке 47. К шине могут подключаться ведущие и ведомые узлы. Для обмена данными используются всего две сигнальных линии: SCL и SDA. Линия SDA используется для двунаправленной передачи данных, а по линии SCL ведущие передают сигнал тактирования. В интерфейсе I 2 C используется неразрушающий арбитраж. При передаче данных каждое устройство прослушивает шину. Если передатчик обнаруживает, что вместо передаваемой «1» (рецессивный бит) на шине присутствует «0» (доминантный бит), то передача прекращается и устройство освобождает шину.
Рис. 47. Пример реализации шины I 2 C
В микроконтроллерах STM32G0 реализованы два модуля I 2 C, которые различаются по своему функционалу (таблица 31). Однако оба модуля поддерживают скорость обмена вплоть до 1 Мбит/с (режим «Fast-mode Plus») и отвечают стандартам I²C Revision 3 (NXP). I 2 C1 дополнительно поддерживает SMBus Revision 3 и PMBus Revision 1.3.
Таблица 31. Характеристики модулей I 2 C микроконтроллеров STM32G0
Характеристика | I 2 C1 | I 2 C2 |
---|---|---|
Поддержка 7-битной адресации | + | + |
Поддержка 10-битной адресации | + | + |
Режим «Standard-mode» (до 100 кбит/с) | + | + |
Режим «Fast-mode» (до 400 кбит/с) | + | + |
Режим «Fast-mode Plus» с токовой нагрузкой до 20 мА (до 1 Мбит/с) | + | + |
Независимое тактирование | + | – |
Пробуждение системы из режима «Stop» | + | – |
SMBus/PMBus | + | – |
Структурная схема модуля I 2 C1 представлена на рисунке 48. Модуль разбит на два домена тактирования: тактирование регистров управления осуществляется от PCLK (шина APB), а ядро I 2 C-контроллера тактируется от собственного сигнала I2с_ker_ck. Источником для I2c_ker_ck могут быть PCLK, SYSCLK и HSI16. В случае со вторым модулем I 2 C (I 2 C2) тактирование регистров и ядра осуществляется от PCLK. Как видно из схемы, I 2 C-контролер состоит из двух основных блоков: один из них отвечает за передачу и прием данных, а второй за генерацию и прием тактового сигнала. Кроме того, в составе контроллера присутствуют цифровые и аналоговые фильтры, позволяющие работать даже при наличии существенных шумов.
Рис. 48. Структура I 2 C-контроллера
Встроенные I 2 C-контроллеры способны работать в четырех основных режимах: ведущий передатчик, ведущий приемник, ведомый приемник, ведомый передатчик. Обмен осуществляется на всех стандартных скоростях: «Standard-mode» (до 100 кбит/с), «Fast-mode» (до 400 кбит/с), «Fast-mode Plus» (до 1 Мбит/с). Стоит отметить, что для работы в режиме «Fast-mode Plus» требуется повышенная нагрузочная способность выходов. За управление повышенной нагрузочной способностью отвечает системный контроллер SYSCFG. Подробнее эта особенность рассматривалась в первой части данного цикла.
Наличие цифровых и аналоговых фильтров приводит к появлению дополнительных задержек. Это важное обстоятельство следует учитывать при выборе тактовой частоты SCL и настройке таймингов (рисунок 49). За настройку времени удержания и установления отвечают поля PRESC[3:0], SCLDEL[3:0] и SDADEL[3:0] из регистра I2C_TIMINGR. Частота SCL в режиме мастера определяется полями PRESC[3:0], SCLH[7:0] и SCLL[7:0] из того же регистра I2C_TIMINGR.
Рис. 49. Настройка таймингов I 2 C-контроллера
I 2 C-контроллеры обеспечивают работу с различными форматами адреса. Для задания адреса используется пара регистров. В регистре I2C_OAR1 может быть прописан 7-битный или 10-битный адрес. В регистре I2C_OAR2 может храниться только 7-битный адрес, однако с помощью регистра OA2MSK младшие биты I2C_OAR2 могут быть замаскированы, тем самым позволяя устройству реагировать на множество адресов. Регистры I2C_OAR1 и I2C_OAR2 могут использоваться одновременно.
Среди важных особенностей модуля I 2 C1 стоит отметить поддержку протоколов и функций SMBus Revision 3: протокол ARP (адрес устройства по умолчанию и арбитраж в режиме ведомого), протокол Host Notify, протокол Alert protocol (при использовании соответствующего вывода микроконтроллера), аппаратное вычисление PEC (Packet Error Code).
Контроллер I 2 C1 способен работать в режимах пониженного потребления вплоть до «Stop 1» и пробуждать процессор при совпадении адреса при приеме сообщения. Для этого требуется, чтобы тактирование ядра I 2 C1 осуществлялось от HSI16. По умолчанию в режиме «Stop» генератор HSI16 выключен, однако при обнаружении состояния START на шине I 2 C генератор пробуждается. Далее происходит прием адреса, если обнаружено совпадение – генерируется прерывание, пробуждающее процессор.
Подробную информацию о работе I 2 C можно найти в руководстве пользователя [1].
CEC: контроллер HDMI-CEC
HDMI-CEC (Consumer Electronics Control) является частью HDMI (High-Definition Multimedia Interface). Данный низкоскоростной интерфейс используется для управления различными видео- и аудиоустройствами. CEC-контроллер, входящий в состав STM32G0, соответствует спецификации HDMI-CEC v1.4.
CEC-контроллер состоит из двух основных блоков: ядра (CEC-адаптера) и CEC-интерфейса (CEC ITF). CEC-адаптер отвечает за выполнение основных функций и работу с шиной CEC (передачу, прием, кодирование и так далее), а CEC-интерфейс используется для обмена с шиной APB. На рисунке 50 представлена схема взаимодействия CEC-контроллера с другими блоками микроконтроллера, а также типовая схема реализации CEC-шины. Из рисунка видно, что CEC-контроллер использует два домена тактирования: регистры контроллера взаимодействуют с шиной APB на частоте PCLK, а ядро тактируется сигналом 32 кГц (LSE или HIS, деленным на 488). Шина CEC использует всего одну сигнальную линию для обмена данными.
Рис. 50. Структура HDMI-CEC-контроллера
Для передачи данных используется стандартное сообщение, начинающееся со старт-бита и состоящее из нескольких полей: заголовка, кода операции (OPCODE) и операндов (полезных данных), как показано на рисунке 51.
Рис. 51. Формат CEC-сообщения
Заголовок содержит адреса источника и приемника, а также два служебных бита EOM и ACK (рисунок 52). Операнды имеют разрядность 8 бит.
Рис. 52. Формат полей CEC-сообщения
Встроенный CEC-контроллер поддерживает два режима точности битовых сигналов: стандартную («Standard mode») и расширенную («Extended mode»). Согласно спецификации CEC, в режиме «Standard mode» погрешность фронта и среза для старт-бита составляет ±200 мкс, погрешность фронта для битов данных составляет ±200 мкс, а среза – ±350 мкс (рисунок 53). В режиме «Extended mode» погрешность фронта и среза для старт-бита составляет ±400 мкс, погрешность фронта для битов данных составляет ±300 мкс, а среза – ±500 мкс.
Рис. 53. Погрешности битовых таймингов в режиме «Standard mode»
Шина CEC подразумевает полудуплексный обмен данными и состоит всего лишь из одного сигнального проводника. Для согласования очередности передачи между множеством устройств используется неразрушающий арбитраж. Для реализации арбитража применяются два механизма. Во-первых, каждый инициатор контролирует состояние шины. Если при передаче рецессивного бита передатчик обнаруживает доминантный бит, то он теряет арбитраж и должен отключиться от шины. Во-вторых, между передачей последнего сообщения и началом передачи следующего присутствует обязательный таймаут SFT (Signal-Free Time), как показано на рисунке 54. Длительность таймаута рассчитывается CEC-контроллером автоматически и зависит от статуса передающего устройства:
- 2,5 бита для инициатора, который потерял приоритет при последней передаче;
- 4 бита для нового инициатора;
- 6 битов для инициатора, который выполнил последнюю удачную передачу.
Рис. 54. Задержка между сообщениями необходима для арбитража
Отсчет времени SFT может производиться либо от момента, когда пользовательская программа инициирует передачу (для этого необходимо сбросить бит SFTSTOP = 0), либо от момента освобождения шины или обнаружения ошибки (для этого необходимо установить бит SFTSTOP = 1). Если к моменту передачи нового сообщения таймаут SFT закончился, то передача стартует без задержки.
В процессе передачи HDMI-CEC контролирует тайминги и обнаруживает два типа ошибок: BTE и BPE. BTE (Bit Timing Error) возникает, если превышен допуск на тайминги отдельных битов. BPE (Bit Period Error) возникает, если нарушен допуск на период следования битов. При возникновении и обнаружении ошибок CEC-контроллер автоматически формирует на шине бит-ошибки длительностью 1,4…1,6 битов (3,6 мс), тем самым оповещая о проблеме остальные устройства.
При приеме данных CEC-контроллер формирует следующие флаги с возможностью генерации прерывания:
- RXBR устанавливается при приеме байта;
- RXEND устанавливается по окончании приема;
- RXOVR устанавливается при переполнении во время приема;
- BRE устанавливается при обнаружении ошибки длительности фронта;
- SBPE устанавливается при обнаружении ошибки малой длительности периода;
- LBPE устанавливается при превышении длительности периода;
- RXACKE устанавливается при отсутствии сигнала подтверждения ACK.
При передаче данных CEC-контроллер формирует следующие флаги с возможностью генерации прерывания:
- ARBLST устанавливается при потере арбитража;
- TXBR является запросом байта на передачу;
- TXEND устанавливается по окончании передачи;
- TXUDR сигнализирует об ошибке – отсутствии данных в буфере к моменту передачи следующего байта;
- TXERR сигнализирует об ошибке при передаче;
- TXACKE устанавливается при отсутствии сигнала подтверждения ACK.
USB Type-C Power Delivery (UCPD)
Встроенный UCPD-контроллер совместим со спецификациями USB Type-C Rev. 1.2 и USB Power Delivery Rev. 3.0, при этом PHY поддерживают только режим СС. Таким образом, для работы может использоваться только кабель USB Type-C.
Модуль UCPD состоит из двух основных частей: непосредственно UCPD-контроллера и регистров управления (рисунок 55). Регистры управления подключены к шине APB и тактируются сигналом PCLK. UCPD-контроллер использует для тактирования сигнал HSI16.
Рис. 55. Структурная схема UCPD
UCPD использует следующие сигналы:
- UCPDx_FRSTX1 и UCPDx_FRSTX2 относятся к функции FRS (Fast Role Swap). FRS позволяет UCPD переключаться между режимами DFP (Downstream Facing Port) и UFP (Upstream Facing Port). Активный уровень этих сигналов позволяет внешнему МОП-транзистору подтянуть вывод СС1/СС2 к земле;
- UCPDx_CC1 – сигнал CC1 кабеля USB Type-C;
- UCPDx_CC2 – сигнал CC2 кабеля USB Type-C;
- UCPDx_DBCC1 и UCPDx_DBCC2 используются для работы с «мертвыми» или сильно разряженными батареями. Если такая функция необходима, эти линии должны быть подключены к линиям UCPDx_CC.
В составе STM32G0 также реализованы встроенные резисторы Rp и Rd, подключенные к линиям СС1 и СС2. С их помощью UCPD может обнаружить подключение и ориентацию кабеля. Номинал Rp определяет передаваемую по умолчанию мощность.
UCPD-контроллер выполняет следующие функции:
- обнаружение уровней USB Type-C и генерацию соответствующих прерываний;
- выполнение FRS и генерацию соответствующих прерываний;
- генерацию и контроль CRC;
- кодирование и декодирование 4b5b;
- кодирование и декодирование BMC;
- прием и передачу кодов заголовка (ordered sets).
Стек PD выполняется микроконтроллерами STM32G0 на программном уровне с привлечением прерываний и событий. При этом программа отвечает только за передаваемые данные, в то время как формирование служебных полей (преамбулы, CRC, SOP и EOP) берет на себя UCPD.
IWDG: независимый сторожевой таймер
В процессе выполнения пользовательской программы могут возникать сбои, из-за которых нормальная работа процессора оказывается невозможной. Речь, например, идет о зацикливаниях. Самостоятельно выйти из такой ситуации процессор не может – ему требуется внешний инструмент сброса. Обычно для этих целей используют сторожевые таймеры. На борту у STM32G0 есть два сторожевых таймера: оконный (WWDG) и независимый (IWDG).
Независимый сторожевой таймер IWDG (independent Watchdog) имеет минимальную связь с микроконтроллером. При наличии питания VDD он продолжает работать даже в режиме «Shutdown». После начальной настройки и включения сторожевой таймер не может быть остановлен, а может быть только сброшен пользовательской программой. Если же программа не успеет обновить IWDG и он досчитает до 0, то микроконтроллер будет автоматически сброшен.
Структурная схема IWDG показана на рисунке 56. Из нее видно, что IWDG состоит из двух доменов. Первый домен, к которому относятся регистры настройки и статуса, питается от напряжения Vcore и тактируется от PCLK. Второй домен – ядро IWDG питается напрямую от VDD и тактируется от LSI (32 кГц). Таким образом, работа первого домена при переходе в глубокие спящие режимы останавливается, в то время как работа ядра IWDG продолжается до тех пор, пока остается активным LSI и поддерживается питание VDD.
Рис. 56. Структура независимого сторожевого таймера IWDG
Принцип работы IWDG достаточно прост. Вначале пользователь задает делитель тактового сигнала (регистр IWDG_PR) и основание счета (регистр IWDG_RLR). После запуска IWDG в 12-битный вычитающий счетчик помещается значение из IWDG_RLR. Счетчик выполняет обратный отсчет. Пользовательская программа должна периодически сбрасывать счетчик. Если это не будет сделано, то при достижении счетчиком 0 произойдет сброс микроконтроллера. Благодаря делителю тактового сигнала пользователь может определять таймаут IWDG в диапазоне 125 мкс…32,8 с.
Существует дополнительный оконный режим работы IWDG. В этом режиме сброс микроконтроллера выполняется не только при достижении счетчиком 0, но и в том случае, если программа попытается сбросить счетчик слишком рано. Верхнее граничное значение должно быть предварительно записано в регистр IWDG_WINR.
IWDG имеет собственную защиту от записи. По этой причине алгоритм запуска независимого сторожевого таймера оказывается достаточно сложным, требующим следующих шагов:
- активировать счетчик. Для этого записать значение 0x0000 СССС в регистр управления IWDG_KEY;
- снять защиту от записи регистров IWDG_PR, IWDG_RLR и IWDG_WINR. Для этого записать значение 0x0000 5555 в регистр управления IWDG_KEY;
- задать значение делителя тактового сигнала в регистре IWDG_PR;
- задать основание счета в регистре IWDG_RLR;
- дождаться готовности IWDG: убедится, что биты состояния в регистре IWDG_SR сброшены;
- для активации оконного режима записать верхнее граничное значение в регистр IWDG_WINR;
- запустить IWDG. Для этого записать значение 0x0000 AAAA в регистр управления IWDG_KEY.
WWDG: оконный сторожевой таймер
Помимо независимого сторожевого таймера IWDG в составе микроконтроллеров STM32G0 присутствует оконный сторожевой таймер WWDG (System Window Watchdog). Он также используется для формирования сброса при зависаниях или неадекватном поведении системы. В отличие от IWDG, оконный таймер использует тактовый сигнал периферийной шины APB.
Структура сторожевого таймера WWDG представлена на рисунке 57. Основой WWDG является 7-битный вычитающий счетчик. Тактирование счетчика выполняется от сигнала PCLK, поделенного с помощью двух делителей. Первый делитель имеет фиксированный коэффициент деления, равный 4096. Второй делитель является программируемым. Его коэффициент деления определяется полем WDGTB[2:0] из регистра WWDG_CFR. Перегружаемое начальное значение счетчика хранится в поле T[6:0] регистра WWDG_CR. В поле W [6:0] регистра WWDG_CFR хранится верхнее граничное значение, определяющее защиту от преждевременного сброса. WWDG имеет два выхода: wwdg_out_rst – сигнал сброса микроконтроллера, wwdg_it – сигнал прерывания. Сторожевой таймер может генерировать дежурное прерывание EWI (Early Wakeup Interrupt), которое позволяет системе аварийно сбросить WWDG до сброса системы.
Рис. 57. Структура оконного сторожевого таймера WWDG
Принцип работы сторожевого таймера WWDG показан на рисунке 58. При запуске в вычитающий счетчик помещается начальное значение, хранящееся в поле T[6:0]. Далее каждый внутренний такт содержимое счетчика уменьшается на 1. Если счетчик досчитает до значения 0x3F – будет сгенерирован сигнал сброса системы. Чтобы этого не происходило пользовательская программа должна периодически обновлять счетчик. При обновлении в счетчик снова загружается значение T[6:0]. Существует и еще одно условие сброса системы. Если программа попытается обновить WWDG слишком рано и значение счетчика окажется больше верхней разрешенной границы, заданной в поле W [6:0], то также будет сгенерирован сигнал сброса системы. Стоит помнить, что после запуска таймера WWDG он не может быть остановлен до сброса системы, а может быть только сброшен пользовательской программой.
Рис. 58. Принцип работы оконного сторожевого таймера WWDG
Таймаут WWDG рассчитывается по формуле 1:
Важной особенностью WWDG является наличие дежурного прерывания EWI (Early Wakeup Interrupt). Это прерывание генерируется, когда вычитающий счетчик WWDG достигает значения 0x40 (то есть за один такт до 0x3F). Выполняя обработку этого прерывания, программа может экстренно сбросить счетчик WWDG или подготовить систему к сбросу. Для разрешения прерывания EWI необходимо установить бит EWI в регистре WWDG_CFR.
Сторожевой таймер WWDG может работать в режимах пониженного потребления вплоть до «Stop». Для этого необходимо установить бит WWDGSMEN в регистре RCC_APBSMENR1.
IRTIM: ИК-интерфейс
Микроконтроллеры STM32G0 позволяют максимально просто реализовывать ИК-интерфейс с помощью специализированного модуля IRTIM.
Для работы модуля IRTIM требуется дополнительная периферия (рисунок 59). Для генерации несущей частоты используется таймер TIM17. Модуляция сигнала выполняется с помощью одного из источников: таймера TIM16 и универсальных приемопередатчиков USART. В случае с STM32G071xx и STM32G081xx это USART1 и USART4, а для STM32G031xx и STM32G041xx это USART2. Для выбора источника модуляции используется мультиплексор, состояние которого определяется полем IR_MOD[1:0] регистра SYSCFG_CFGR1. При необходимости выходной сигнал может быть инвертирован. За это отвечает бит IR_POL регистра SYSCFG_CFGR1. Далее сигнал поступает на вывод микроконтроллера (PA13 или PB9).
Рис. 59. Структура ИК-интерфейса IRTIM
Как видно из схемы на рисунке 59, для нормальной работы ИК-интерфейса необходимо предварительно настроить все используемые периферийные блоки: таймеры, USART и порты ввода-вывода. Стоит также отметить, что для порта PB9 может быть активирована функция повышенной нагрузочной способности, которая позволяет напрямую управлять даже относительно мощными светодиодами. За это отвечает бит I2C_PB9_FMP регистра SYSCFG_CFGR1. Подробно о повышенной нагрузочной способности рассказывалось в первой статье из данного цикла.
GPTIM: таймеры общего назначения
Микроконтроллеры STM32G0 предлагают широкий выбор таймеров общего назначения. При этом работа с таймерами семейства STM32G0 практически полностью идентична работе с таймерами других семейств STM32. В частности, в STM32G0 используется традиционное разбиение таймеров на функциональные группы (таблица 32):
- General-purpose – таймеры общего назначения, которые могут использоваться в различных приложениях для генерации выходных импульсов, измерения временных интервалов, обработки сигналов с датчиков, например, с энкодеров или датчиков Холла;
- Advanced – таймеры с расширенными возможностями, способные выполнять все те же функции, что и таймеры общего назначения, но, помимо этого, обладающие дополнительными возможностями для управления электродвигателями и мощными преобразователями напряжения. Кроме стандартных выходов, такие таймеры имеют комплементарные;
- Одноканальные таймеры общего назначения способны выполнять все те же функции, что и таймеры общего назначения, но имеют только один канал;
- Двухканальные таймеры общего назначения способны выполнять все те же функции, что и таймеры общего назначения, но имеют два канала;
- Basic timers – базовые таймеры, отличающиеся упрощенным функционалом и не имеющие внешних выходов. Они предназначены для работы с внутренней периферией микроконтроллера, например, с ЦАП или АЦП;
- Low-power timers – таймеры для режимов пониженного потребления. Подробнее о них рассказывается в разделе «LPTIM: таймеры для режимов пониженного потребления».
Таблица 32. Типы таймеров в STM32G0
Тип таймера | Название | |
---|---|---|
Advanced (с расширенным функционалом) | TIM1 | |
General purpose (общего назначения) | 32-битные | TIM2 |
16-битные | TIM3 | |
Basic (базовые) | TIM6 и TIM7 | |
Одноканальные | TIM14 | |
Двухканальные | – | |
Одноканальные с комплементарными выходами | TIM16, TIM17 | |
Двухканальные с комплементарными выходами | TIM15 | |
LPTIM | LPTIM1, LPTIM2 |
Тип таймера напрямую определяет его функционал (таблица 33). Сразу стоит отметить, что таймеры TIM1 и TIM15 обладают собственным ФАПЧ, который позволяет им работать на частотах до 128 МГц, что вдвое выше, чем частота системы.
Таблица 33. Возможности различных типов таймеров в STM32G0
Параметр | TIM1 | TIM2 | TIM3 | TIM6 | TIM7 | TIM14 | TIM15 | TIM16 | TIM17 |
---|---|---|---|---|---|---|---|---|---|
Разрешение, бит | 16 | 32 | 16 | 16 | 16 | 16 | 16 | 16 | – |
Максимальная частота, МГц | 128 | 64 | 64 | 64 | 64 | 64 | 128 | 64 | 64 |
Делитель, бит | 16 бит | ||||||||
Направление счета | Вверх, вниз, верх и вниз | Вверх | |||||||
Синхронизация | Ведущий и ведомый | Ведущий | – | Ведущий и ведомый | Ведущий | ||||
Количество каналов | 6 | 4 | 0 | 1 | 2 | 1 | |||
Триггерный вход | + | + | + | – | – | – | – | – | |
Режим захвата (Input capture mode) | + | + | + | – | + | + | + | + | |
ШИМ-вход (PWM input mode) | + | + | + | – | – | + | – | – | |
Режим принудительного состояния выхода (Forced output mode) | + | + | + | – | + | + | + | + | |
Режим сравнения (Output compare mode) | + | + | + | – | + | + | + | + | |
ШИМ-выходы (PWM) | + | + | + | – | + | + | + | + | |
Программируемое мертвое время | + | – | – | – | + | – | – | ||
Входы BREAK | 2 (двунаправленные) | 0 | 0 | 0 | 1 (двунаправленный) | ||||
Режим однократного запуска (One pulse mode) | + | + | + | – | + | + | + | + | |
Режим однократного запуска со внешним сигналом запуска | + | + | + | – | – | + | – | – | |
Режим энкодера | + | + | + | – | – | – | – | – | |
DMA | + | + | + | + | + | – | + | + | + |
Несмотря на отличия в функционале, структура таймеров оказывается примерно одинаковой. На рисунке 60 представлена структурная схема наиболее продвинутого таймера TIM1.
Рис. 60. Структура таймера TIM1
Таймеры в микроконтроллерах STM32 обладают чрезвычайной гибкостью и позволяют решать широкий спектр задач. Для подробного изучения возможностей и особенностей использования таймеров следует обратиться к следующим документам:
LPTIM: таймеры для режимов пониженного потребления
Рассмотренные в предыдущем разделе таймеры общего назначения обеспечивают решение широкого спектра задач, однако использовать их можно только в режимах до «Low-power sleep» включительно. Если же требуется работа в более глубоких спящих режимах, то следует использовать 16-битные таймеры LPTIM1 и LPTIM2.
Главной отличительной особенностью таймеров LPTIM является их двухдоменная система тактирования (рисунок 61). Регистры LPTIM подключены к шине APB и работают с тактовой частотой PCLK, а само ядро таймера использует независимый тактовый сигнал, источником которого могут быть LSE, LSI, HSI16 или PCLK. Таким образом, в режиме пониженного потребления, когда таймеры общего назначения находятся в состоянии сна, таймеры LPTIM1 и LPTIM2 продолжают работать. Кроме того, LPTIM1 и LPTIM2 могут использоваться в качестве счетчиков, даже если все внутренние источник тактирования отключены. Для этого внешний счетный сигнал необходимо подключить ко входу LPTIM_IN1.
Рис. 61. Структура таймера LPTIM1
Таймеры LPTIM1 и LPTIM2 имеют некоторые важные отличия. В частности, LPTIM2 имеет только один вход и не может работать в режиме энкодера.
Таймеры LPTIM имеют три режима работы: ШИМ, режим с однократным запуском и режим с однократным переключением (рисунок 62). Выбор режима работы производится с помощью бита WAVE регистра LPTIM_CSGR и бита SNGSTRT регистра LPTIM_CR. При необходимости пользователь может менять полярность выходного сигнала с помощью бита WAVPOL регистра LPTIM_CFGR.
Рис. 62. Режимы работы таймера LPTIM
Таймер LPTIM1 способен работать в режиме энкодера с возможностью обратного счета (рисунок 63).
Рис. 63. Работа таймера LPTIM1 в режиме энкодера
LPTIM имеет возможность генерации следующих прерываний:
- прерывание по совпадению (Compare match) генерируется, когда содержимое счетчика LPTIM_CNT становится равным или больше чем содержимое регистра сравнения LPTIM_CMP;
- прерывание по совпадению с LPTIM_ARR (Auto-reload match) генерируется, когда содержимое счетчика LPTIM_CNT становится равным содержимому регистра LPTIM_ARR;
- прерывание по триггеру (External trigger event) генерируется при обнаружении внешнего триггера;
- прерывание по обновлению регистра LPTIM_ARR (Autoreload register write completed) генерируется при обновлении регистра LPTIM_ARR;
- прерывание по обновлению регистра LPTIM_CMP (Compare register write completed) возникает при обновлении регистра LPTIM_CMP;
- прерывание при изменении направления счета (Direction change) генерируется при смене направления счета при работе в режиме энкодера.
RTC: часы реального времени RTC
В микроконтроллерах STM32G0 реализованы часы реального времени RTC (Real-Time Clock) с функцией календаря. Главной особенностью RTC является возможность работы во всех режимах пониженного потребления до «Shutdown» включительно, а также возможность питания от дежурной батарейки. Потребление RTC (с учетом потребления LSE) составляет 300 нА при напряжении питания 1,8 В.
RTC имеет следующие особенности:
- календарь с измерением долей секунд, секунд, минут, часов, дней недели, дат, месяцев и лет;
- автоматическую коррекцию количества дней в месяце (28, 29, 30, 31);
- возможность коррекции летнего времени;
- два программируемых будильника;
- калибровку RTC с помощью введения калибровочных тактовых импульсов количеством 1…32767;
- возможность формирования временных меток;
- 17-битный пробуждающий таймер WUT, позволяющий генерировать периодические события с заданным периодом.
На рисунке 64 представлена структурная схема RTC. Из нее видно, что RTC состоит из двух доменов тактирования. Регистры RTC подключены к шине APB и тактируются от PCLK. Ядро RTC использует независимое тактирование от сигнала rtc_ker_ck. В качестве источника для rtc_ker_ck могут выступать LSE, HSE/32, LSI. При работе в режиме «Stop» тактирование ядра RTC может производиться только от LSE или LSI. В режиме «Shutdown» и VBAT тактирование возможно только от LSE. Входной тактовый сигнал rtc_ker_ck дополнительно делится с помощью 7-битного асинхронного делителя. Получаемый в результате деления сигнал ck_arpe является основным тактовым сигналом для большинства блоков в составе RTC. Поэтому если требуется обеспечить минимальное потребление RTC, то необходимо выбирать максимальное значение делителя (по умолчанию 128). Сигнал ck_arpe, в свою очередь, дополнительно делится для получения опорного тактового сигнала 1 Гц для часов и календаря. RTC имеет два выхода, на которые могут подаваться сигналы от будильника, калибровочный тактовый сигнал, флаг пробуждения.
Рис. 64. Структура RTC
RTC имеет собственную защиту от записи. По этой причине для инициализации RTC используется особый алгоритм. Для получения доступа к регистрам RTC необходимо установить бит DBP (Backup Domain Protection) в регистре PWR_CR. После этого необходимо записать кодовое значение в регистр RTC_WRP.
Осваиваем простейший микроконтроллер PIC. Часть 2
В первой части мы разобрали как можно прошить выбранный МК, как его правильно сконфигурировать, а так же научились работать с цифровыми портами.
Теперь пришло время рассмотреть остальную периферию микроконтроллера.
Все параметры работы МК задаются через установку определенных значений в регистрах специального назначения (SFR).
Как и конфигурационные биты, все существующие в выбранном МК регистры доступны нам в виде переменных благодаря подключенной библиотеке.
Что бы узнать, какие биты в каких регистрах нам потребуются для конкретного модуля — придется снова заглянуть в документацию.
Для примера, взглянем на таблицу регистров, имеющих отношение к цифровым входам\выходам порта B:
Считав значения регистра PORTB мы получим текущий логический уровень на каждой ножке порта.
Запись в регистр устанавливает указанный уровень на соответсующих ножках порта.
Каждый бит регистра нам доступен в виде отдельной переменной, именно через них мы управляли светодиодом и считывали состояние кнопки.
Регистр TRISB отвечает за направление данных через порт. Каждый из 8 битов регистра привязан к соответсвующей ножке МК.
Присвоив нужному биту единицу — мы сделаем из него вход, а присвоив ноль — выход.
Именно в этом регистре мы меняли биты через переменные pin_Bx_direction.
В регистре OPTION_REG к порту относится только старший бит:
При желании узнать принцип работы конкретного модуля поближе всегда можно найти в документации принципиальную схему.
Прерывания
Так как микроконтроллеры не поддерживают многозадачность, возникает ряд проблем по совмещению нескольких процессов.
Допустим, нужно нам мигать одним светодиодом постоянно с большим периодом, а второй переключать по нажатию кнопки.
Какой бы порядок действий мы не выбрали, как надо у нас ничего не заработает: ведь пока микроконтролер отсчитывает время до переключения первого светодиода он может пропустить факт нажатия кнопки.
Тут нам и придут на помощь прерывания.
При определенных условиях микроконтроллер может прервать выполнение бесконечного цикла и выполнить небольшую подпрограмму, после чего вернуться к выполнению основной задачи.
- внешний источник прерываний INT
- изменение уровня сигнала на цифровых входах RB4:7
- переполнение таймера TMR0
- переполнение таймера TMR1
- совпадение TMR2 и PR2
- завершение записи в EEPROM
- изменение выходного уровня компаратора
- получение\завершение отправки данных через USART
- прерывания от модуля CCP
Прерывание по каждому источнику можно как разрешить, так и запретить индивидуально изменяя соответствуюющие биты в регистрах INTCON и PIE1.
Для разрешения прерываний, управляемых регистром PIE1 необоходимо разрешить прерывания от перифирии битом PEIE в регистре INTCON.
После выбора необходимых источников прерываний необходимо глобально разрешить прерывания битом GIE в регистре INTCON.
Для каждого прерывания имеется еще один бит в регистре INTCON или PIR1 — флаг прерывания.
При срабатывании прерывания соответсвующему флагу присваивается значение 1, по которому можно легко определить какое из прерываний сработало.
Сбрасывать флаги прерываний необходимо вручную после входа в обработчик прерываний, иначе при нескольких источниках разобрать кто конкретно его вызвал будет невозможно.
В качестве примера использования прерываний перепишем нашу программу по миганию светодиодом.
Воспользуемся источником прерываний INT. В зависимости от состояния бита INTEDG в регистре OPTION прерывание будет генерироваться либо по переднему фронту сигнала (переход с низкого уровня к высокому), либо по заднему.
Для изменения уровня сигнала на INT неободимо перенести кнопку на соответсвующую ногу (pin 6).
- из-за дребезга контактов кнопки прерывание может сработать несколько раз подряд, дребезг желательно подавлять программно
- в основном цикле программы у нас остались паузы, во время которых микроконтролер ничего не делает, кроме как ждет.
Таймеры
Основная работа таймеров — считать. По завершению счета они могут генерировать прерывание. А так как счет идет аппаратно, не забивая процессорное время ожиданием, таймеры удачно подходят на замену нашим паузам.
Каждый из трех таймеров имеет свои особенности, потому для выполнение определенных задач нужно уметь выбрать более подходящий.
- 8-битный таймер (считает от 0 до 255)
- тактируется либо от системной частоты, либо от внешнего источника
- может считать как передние, так и задние фронты тактируемого сигнала
- 8-битный предделитель (может считать каждый второй, каждый 4… каждый 256 сигнал)
- прерывание генирируется при переполнении (при переходе от 255 к 0)
- таймер работает постоянно
При тактировании таймера от внешнего источника таймер превращается в счетчик внешних импульсов. В принципе счета ничего не меняется, просто в зависимости от источника может не получиться постоянная частота прерываний. Счетчиком можно считать количество нажатий кнопки, оборотов колеса и пр. При этом никто не обязывает считать от нуля до прерывания: текущее значение счетчика всегда доступно как для чтения, так и для записи.
- данный таймер 16-битный
- таймер может тактироваться не только от внешнего источника, но и от дополнительного часового кварца
- максимально доступный предделитель — 1:8
- таймер может считать только передние фронты сигнала
- таймер может использоваться модулем CCP
- таймер можно отключать
Данный 8-битный таймер имеет несколько иной принцип работы.
Тактироваться он может только от системной частоты. Предделитель может быть выставлен только на значения 1:1, 1:4 или 1:16.
Полученные импульсы таймер считает от нуля и до предварительно заданного значения PR2.
После совпадения TMR2 и PR2 подается сигнал на 4-битный постделитель, и только после переполнения постделителя генерируется прерывание.
Благодаря такой схеме можно корректировать конечную частоту прерываний с минимальным шагом.
Помимо постделителя, сигнал при совпадении PR2 может идти на модуль CCP в качестве базы тайминга ШИМ.
Как и TMR1, данный таймер можно отключить.
Пример использования
В качестве примера зададим частоту мигания светодиода таймером TMR1.
Список всех необходимых переменных можно узнать из таблицы:
Описание каждого бита можно найти в документации на микроконтроллер.
include 16f628a — target PICmicro
—
pragma target clock 4_000_000 — указываем рабочую частоту, необходимо для некоторых функций расчета времени
— конфигурация микроконтролера
pragma target OSC INTOSC_NOCLKOUT — используем внутренний кварц
pragma target WDT disabled — сторожевой таймер отключен
pragma target PWRTE disabled — таймер питания отключен
pragma target MCLR external — внешний сброс активен
pragma target BROWNOUT disabled — сбос при падении питания отключен
pragma target LVP disabled — программирование низким напряжением отключено
pragma target CPD disabled — защита EEPROM отключена
pragma target CP disabled — защита кода отключена
—
enable_digital_io() — переключение всех входов\выходов на цифровой режим
—
alias led is pin_B5 — светодиод подключен к RB5
pin_B5_direction = output — настраиваем RB5 как цифровой выход
—
— настраиваем таймер
T1CON_T1CKPS = 0b_11 — предделитель, 2 бита
T1CON_TMR1CS = 0 — тактирование от системной частоты
PIE1_TMR1IE = on — разрешаем прерывание от TMR1
PIR1_TMR1IF = off — сбрасываем флаг прерывания от TMR1
INTCON_PEIE = on — разрешаем прерывания от периферии
T1CON_TMR1ON = on — включаем таймер
INTCON_GIE = on — включаем обработку прерываний
—
;таймер тактируется от Fosc/4 : 4MHz/4 = 1 Mhz
;предделитель установлен на 1:8 : 1Mhz/8 = 125 kHz
;таймер — 16 бит : 125 kHz/65536 = 1.9 Hz
;светодиод включится и выключится за 2 прерывания : итоговая частота моргания 0,95 Hz
—
— обработчик прерывания TMR1
procedure TMR1_ISR is
pragma interrupt
if PIR1_TMR1IF then — проверяем флаг нужного нам прерывания
PIR1_TMR1IF = off — сбрасываем флаг прерывания
led = !led — переключаем состояние светодиода
end if
end procedure
forever loop
— полностью свободный основной цикл
end loop
Модуль CCP (Capture/Compare/PWM) предназначен для измерения и формирования импульсных сигналов.
Capture
- каждый задний фронт сигнала
- каждый передний фронт сигнала
- каждый четвертый передний фронт
- каждый 16 передний фронт
Compare
В режиме сравнения модуль рабоает в обратном направлении: как только значение в регистрах CCPR1H:CCPR1L совпадет с текущим значением TMR1, модуль может выставить 1 или 0 на ножке CCP1 (pin 9) или просто сгенерировать прерывание. Так же при совпадении модуль может обнулить TMR1.
Замеряя необходимые промежутки времени можно формировать импульсы определенной формы. Например, для управления положением сервомашинки требуется подавать на сигнальную линию импульсы высокого уровня длиной 700-2200 мкс с частотой 50 Hz. В зависимости от длины импульса серво установит свое положение либо в одно крайнее положение (700 мкс), либо в другое (2200 мкс), либо приблизительно по центру (1500 мкс).
В режиме ШИМ модуль самостоятельно формирует сигнал с частотой, генерируемой таймером TMR2, и заданной 10-битной скважностью.
Что такое ШИМ-сигнал?
Микроконтроллер может выдавать только цифровой сигнал — логические 1 и 0.
В ШИМ сигнале с постоянной частотой первую часть периода на выход подается 1, а вторую часть — 0. Меняя соотношение длительности обоих частей меняется скважность сигнала. Скважность ШИМ — это соотношение продолжительности импульса логической единицы и периода ШИМ. 10-битный ШИМ может обеспечить точность изменения скважности в 1/1024 длительности периода.
Как этим можно пользоваться?
Так как частота сигнала достаточно велика, то низкоскоростным нагрузкам будет казаться, что они получают напряжение, равное проценту скважности от максимума. Таким образом из ШИМ у нас выйдет обычный аналоговый выход с диапазоном напряжения от 0 до Vdd (в нашем случае — 5В).
Для высокоскоростных нагрузок (к примеру, для светодиодов) ШИМ сигнал будет регулировать процент времени работы. Для человеческого глаза мигание светодиода с большой частотой и переменной скважностью будет казаться постоянным горением с переменной яркостью.
Для работы с ШИМ имеется библиотека, потому нам не потребуется особых усилий по расчетам и настройке регистров.
Пример использования библиотеки:
— настраиваем ШИМ
pin_CCP1_direction = output — настраиваем pin 9 как выход
include pwm_hardware — подключаем библиотеку, упрощающую работу с ШИМ
pwm_max_resolution( 4 ) — устанавливаем значение предделителя TMR2 для выбора нужной частоты (976 Hz)
pwm1_on() — включаем ШИМ
var bit fade_type = 1 — переменная для направления изменения яркости
var byte i = 0 — переменная для текущего уровня яркости
forever loop
— меняем текущее значение
if fade_type then
i = i + 1
if i == 100 then
fade_type = 0
end if
else
i = i — 1
if i == 0 then
fade_type = 1
end if
end if
pwm1_set_percent_dutycycle(i) — применяем новое значение яркости
_usec_delay( 20000 ) — делаем паузу, иначе процесс изменения яркости будет очень быстрым
end loop
Компараторы
Вся работа компаратора заключается в том, что бы сравнить два напряжения и сказать какое из них больше. Сравнение происходит постоянно (при включенном модуле), при изменении результата сравнения может генерироваться прерывание.
В зависимости от настроек, компараторы могут работать в восьми режимах:
По схемам хорошо видно какие напряжения сравниваются в каждом режиме, стоит только пояснить что такое опорное напряжение Vref.
Источник опорного напряжения
Это еще один небольшой модуль, обычно требуется только для работы компараторов.
Единственная задача модуля — разделить напряжение питания до нужного значения.
Модуль представляет из себя простой делитель на 16 резисторах. Все, что он умеет — выделить пониженное до нужного значения напряжение из питания.
При питании 5В модуль может выдать напряжение от 0 до 3.6В.
EEPROM
В микроконтроллере 16f628a нам доступно 128 байт энергонезависимой памяти.
При использовании ассемблера нам пришлось бы много прочитать про порядок записи и чтения в память, нам же понадобится лишь подключить одну бибилотеку для работы с eeprom.
Для подключения библиотеки достаточно написать
после чего нам становится доступным ряд процедур и функций:
Единственное, о чем нужно помнить — о размере памяти. Записать dword по смещению 128 в данном случае не удастся.
USART
После настройки можно начинать принимать и передавать байты.
Для организации связи с компьютером можно использовать UART-COM и UART-USB адаптеры. Впрочем, никто не мешает собрать их самостоятельно по схемам:
Внешний кварц
Как было видно, внешний кварц необходим не всегда. Но бывают и такие случаи, когда требуется использовать внешний тактовый сигнал.
Подключать внешний кварц нужно к ногам OSC1 и OSC2 (pin16 и pin 15):
Для распространенных кварцев резистор не нужен, ёмкость конденсаторов выбирается в зависимости от частоты кварца. Так же в зависимости от частоты выбирается режим, выставляемый в конфигурационном бите OSC:
Вместо кварца можно так же использовать керамический резонатор, он уже содержит в себе конденсаторы — для подключения резонатора достаточно подсоединить третий контакт к земле.
Итоги
Вот мы и расмотрели основные возможности каждого модуля в микроконтроллере 16f628a. Конечно, в такой короткой статье невозможно описать все тонкости при работе с каждым модулем, при необходимости подробная информация о каждом модуле доступна в документации на каждый микроконтроллер.
С текущим набором перифирии можно выполнить довольно много разнообразных устройств, но иногда бывает проще перейти на более укомплектованный микроконтроллер. Благодаря универсальным библиотекам, начать работать с любым другим поддерживаемым МК не составит особого труда.