- Родительская категория: Статьи
- Категория: Электроника
- Автор: Генератор статей
- Просмотров: 9011
Микроконтроллеры STM32G0: Архитектура и системная периферия
Микроконтроллеры STM32G0 построены на базе малопотребляющего и высокопроизводительного процессорного ядра ARM Cortex-M0+ (рисунок 1).
ARM Cortex-M0+ является частью семейства 32-битных процессорных RISC-ядер Cortex-M (рисунок 2). В нем используется архитектура ARMv6-M и двухуровневый конвейер. Системная шина AHB-Lite применяется для взаимодействия с памятью и периферией. Кроме того, для прямого взаимодействия с портами ввода-вывода предназначен специальный порт Fast I/O. В составе ядра также присутствует модуль защиты памяти MPU (Memory protection unit), блоки отладки (DWP и BPU), контроллер прерываний и отладочный интерфейс SWD. Набор инструкций ARM Cortex-M0+ практически полностью состоит из 16-битных команд, за исключением некоторых команд управления. Это позволяет создавать очень компактный программный код.
Одним из важнейших изменений Cortex-M0+ по сравнению с Cortex-M0 стало уменьшение числа ступеней конвейера. В Cortex-M0+ используется двухуровневый конвейер, который позволяет выполнять обработку команд в два этапа. На первом этапе производится выборка и предварительное декодирование, а на втором декодирование и выполнение. Как уже было сказано, большинство команд ARMv6-M имеет длину 16 бит. Только 6 команд управления имеют длину 32 бита, при том что используются они относительно редко. В результате в идеальном случае за один системный такт может выбираться сразу две 16-битные инструкции.
На рисунке 3 показан простой пример обработки двух 16-битных команд. На первом такте происходит выборка команд и предварительное декодирование первой команды. На втором такте выборка новых инструкций не производится, вместо этого декодируется и выполняется первая команда, а также предварительно декодируется вторая команда, выбранная на первом такте. На третьем такте декодируется и выполняется вторая команда, а также происходит выборка следующих двух 16-битных команд. Как видно из рисунка 3, на втором такте команды не выбираются, а значит, ничто не мешает выполнять выборку данных.
К сожалению, при выполнении команд с переходами происходит потеря содержимого конвейера. На рисунке 4 показан пример выполнения команды условного перехода. На первом такте, как обычно, выполняется выборка двух команд: простой («Инструкция 0») и команды перехода («Переход к метке»). На втором такте выполняется инструкция 0. На третьем такте происходит выборка двух новых команд («Инструкция 1» и «Инструкция 2»). Однако в результате выполнения команды условного перехода процессору требуется обработать команду, расположенную по заданному адресу метки («Инструкция N»). В результате содержимое конвейера теряется, так как уже выбранные команды «Инструкция 1» и «Инструкция 2» оказываются неактуальными.
Спецификация Cortex-M0+ не предусматривает кэш-памяти или встроенного ОЗУ. Однако в микроконтроллерах STM32G0, в отличие от STM32F0, кэш-память добавлена на уровне SoC.
Шина AHB-Lite подключена к матрице шин (bus matrix), которая обеспечивает взаимодействие процессора с периферией и памятью. Дополнительный порт Single-cycle I/O Port позволяет процессору выполнять доступ к данным за один такт. Производитель микроконтроллеров может произвольно определять диапазон адресов, с которым будет работать этот порт. В микроконтроллерах STM32G0 от STMicroelectronics этот диапазон выделен для регистров GPIO, что позволяет работать с портами ввода-вывода на частоте процессора. В результате переключение выходов занимает всего два такта.
В составе процессорного ядра Cortex-M0+ есть модуль защиты памяти MPU (Memory protection unit), который поддерживает до восьми областей памяти с независимыми настройками защиты:
- Разрешение доступа (access permission): разрешен или запрещен для записи/чтения в привилегированном/непривилегированном режиме;
- Разрешение выполнения (access permission): исполняемая область или область, запрещенная для исполнения.
При создании ядра Cortex-M0+ была успешно решена задача по уменьшению уровня потребления. Микроконтроллеры, построенные на базе Cortex-M0+, становятся оптимальным выбором для малопотребляющих устройств с батарейным питанием.
Interconnect Matrix (IMX): матрица межсоединений периферийных блоков
Матрица межсоединений периферийных блоков IMX (Interconnect Matrix) позволяет периферийным блокам взаимодействовать без участия процессора. Наличие тех или иных связей зависит от линейки контроллеров STM32G0. По этой причине здесь и далее параметры семейства STM32G0 будут рассматриваться на примере наиболее продвинутой линейки – STM32G0x1. Например, в таблице 1 представлены возможные варианты взаимодействия периферии согласно RM0444. Reference manual. STM32G0x1 advanced Arm®-based 32-bit MCUs. (Rev.2 2019) [1]. Как мы видим, одни и те же периферийные блоки могут выступать и в качестве источников, и в качестве приемников сигналов управления.
Таблица 1. Возможности взаимодействия периферии в STM32G0x1 [1]
Источник | Приемник | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TIM1 | TIM2 | TIM3 | TIM14 | TIM15 | TIM16 | TIM17 | LPTIM1 | LPTIM2 | ADC | DAC | DMAMUX | COMP1 | COMP2 | IRTIM | |
TIM1 | — | + | + | — | — | — | — | — | — | + | + | — | + | + | — |
TIM2 | + | — | + | — | + | — | — | — | — | + | + | — | + | + | — |
TIM3 | + | + | — | — | + | — | — | — | — | + | + | — | + | + | — |
TIM14 | — | + | + | — | — | — | — | — | — | — | — | + | — | — | — |
TIM15 | + | + | + | — | — | — | — | — | — | + | + | — | — | — | — |
TIM16 | — | — | — | — | + | — | — | — | — | — | — | — | — | — | + |
TIM17 | + | — | — | — | + | — | — | — | — | — | — | — | — | — | + |
TIM6 | — | — | — | — | — | — | — | — | — | + | + | — | — | — | — |
TIM7 | — | — | — | — | — | — | — | — | — | — | + | — | — | — | — |
LPTIM1 | — | — | — | — | — | — | — | — | — | — | + | + | — | — | — |
LPTIM2 | — | — | — | — | — | — | — | — | — | — | + | + | — | — | — |
USART1 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | + |
USART4 | — | — | — | — | — | — | — | — | — | — | — | — | — | — | + |
ADC | + | — | — | — | — | — | — | — | — | — | — | — | — | — | — |
Датчик T | — | — | — | — | — | — | — | — | — | + | — | — | — | — | — |
VBAT | — | — | — | — | — | — | — | — | — | + | — | — | — | — | — |
VREFINT | — | — | — | — | — | — | — | — | + | — | — | — | — | — | — |
HSE | — | — | — | + | — | — | + | — | — | — | — | — | — | — | — |
LSE | — | + | — | — | — | + | — | — | — | — | — | — | — | — | — |
LSI | — | — | — | — | — | + | — | — | — | — | — | — | — | — | — |
MCO | — | — | — | + | — | — | + | — | — | — | — | — | — | — | — |
EXTI | — | — | — | — | — | — | — | — | — | + | + | — | — | — | — |
RTC и TAMP | — | — | — | + | — | + | — | + | + | — | — | — | — | — | — |
COMP1 | + | + | + | — | + | + | + | + | + | — | — | — | — | — | — |
COMP2 | + | + | + | — | + | + | + | + | + | — | — | — | — | — | — |
SYST ERR | + | + | + | — | + | + | + | — | — | — | — | — | — | — | — |
Рассмотрим несколько конкретных примеров взаимодействия периферийных блоков:
- Синхронизация и каскадирование таймеров;
- Запуск АЦП по сигналам с таймеров или по событиям EXTI;
- Формирование триггерных сигналов для таймеров по сигналам от цифрового компаратора (ADC watchdog);
- Запуск ЦАП по событиям EXTI;
- Калибровка встроенных генераторов LSI и HSI с помощью таймеров и встроенных генераторов LSE и HSE;
- Запуск таймеров LPTIM0 и LPTIM1 по сигналам от RTC, TAMPER или аналоговых компараторов;
- Формирование слепых окон для компараторов с помощью таймеров;
- Мониторинг датчика температуры, а также внутренних напряжений VBAT и VREFINT с помощью АЦП;
- Формирование триггерных сигналов для таймеров по сигналам от компараторов;
- Формирование триггерных сигналов для таймеров при возникновении системных ошибок;
- Модуляция инфракрасного интерфейса с помощью двух таймеров;
- Формирование триггерных сигналов для DMA по сигналам от таймеров.
Связи между периферийными блоками остаются активными даже в режимах пониженного потребления Run, Sleep и Low-power sleep. Кроме того, некоторые блоки могут взаимодействовать также и в режимах Stop 0 и Stop 1. В таблице 2 представлена информация по работе IMX в спящих режимах [1].
Таблица 2. Возможности использования матрицы межсоединений в режимах пониженного потребления [1]
Источник | Приемник | Run / Low-power run | Sleep/ Low-power sleep | Stop |
---|---|---|---|---|
TIMx | TIMx | Y | Y | — |
ADCx DACx |
Y | Y | — | |
DMA | Y | Y | — | |
COMPx | Y | Y | — | |
COMPx | TIM1, 2, 3 | Y | Y | — |
LPTIMERx | Y | Y | Y | |
ADCx | TIM1 | Y | Y | — |
RTC | TIM16 | Y | Y | — |
LPTIMERx | Y | Y | Y | |
Генераторы (внешние и внутренние) | TIM14, 16, 17 | Y | Y | — |
CSS RAM (parity error), Flash memory (ECC error), COMPx, PVD | TIM1, 15, 16, 17 | Y | Y | — |
CPU (hard fault) | TIM1, 15, 16, 17 | Y | — | — |
GPIO | TIMx | Y | Y | — |
LPTIMERx | Y | Y | Y | |
ADC DACx |
Y | Y | — |
Таким образом, прямые связи между периферийными блоками дают целый ряд преимуществ:
- Максимальная временная детерминированность операций. Вместо программного кода задачи решаются на аппаратном уровне с четко определенными временными задержками.
- Уменьшение потребления. Вместо выполнения множества операций чтения/записи с участием процессора, матрица межсоединений позволяет блокам взаимодействовать напрямую, затрачивая минимум энергии.
- Уменьшение числа задействованных портов ввода-вывода. Наличие внутренних связей позволяет в некоторых случаях обходиться без внешних подключений и без привлечения портов ввода-вывода.
- Расширение функционала при работе в режимах пониженного потребления.
System Configuration Controller (с): системный контроллер
Системный контроллер SYSCFG в STM32G0 выполняет целый ряд задач:
- Разрешает/запрещает высокоскоростной режим I2C и повышенную нагрузочную способность выводов I2C;
- Настраивает USPD-интерфейс;
- Разрешает/запрещает работу повышающего преобразователя;
- Настраивает работу модуля IRTIM;
- Переназначает порты PA11 и PA12 на выводы, занимаемые портами PA9 и PA10 соответственно;
- Определяет расположение памяти по адресу 0x0000 0000;
- Разрешает/запрещает некоторые функции безопасности.
Рассмотрим эти задачи подробнее.
В микроконтроллерах STM32G0 присутствуют встроенные I2C-контроллеры, которые поддерживают три режима скорости передачи: режим Standard-mode с максимальной скоростью обмена данными до 100 кбит/с, режим Fast-mode с максимальной скоростью 400 кбит/с, режим Fast-mode Plus со скоростью обмена до 1 Мбит/с. Режим Fast-mode Plus требует повышенной нагрузочной способности от портов микроконтроллера. Активизацию функции повышенной нагрузочной способности осуществляет SYSCFG. Для индивидуальной активизации повышенной нагрузочной способности отдельных выводов используются биты I2C_PA9…10_FMP и I2C_PB6…9_FMP регистра SYSCFG_CFGR1. Для активизации повышенной нагрузочной способности всех выводов, относящихся к I2C, могут использоваться биты I2C1_FMP и I2C2_FMP регистра SYSCFG_CFGR1.
SYSCFG также отвечает за начальную настройку подтягивающих резисторов на выводах CC1 и CC2, которые используются контроллерами USB Power Delivery. Для управления этой функцией предназначены биты UCPD1_STROBE и UCPD2_STROBE из регистра SYSCFG_CFGR1.
При работе аналоговых входов STM32G0 при низком напряжении питания (VDD < 2,4 В) рекомендуется использовать специальный повышающий преобразователь. Для его активации предназначен бит BOOSTEN из регистра SYSCFG_CFGR1.
Инфракрасный интерфейс IRTIM требует модуляции, которая может выполняться либо таймером TIM16, либо передатчиком USART1 или USART6. Выбор источника модуляции производится с помощью бита IR_MOD из регистра SYSCFG_CFGR1. Кроме того, бит The IR_POL из того же регистра SYSCFG_CFGR1 определяет инверсию выходного сигнала IR_OUT (0 = не инвертируется, 1 = инвертируется).
Выводы PA11 и PA12 доступны не во всех корпусных исполнениях. В таких случаях возможна их переадресация на выводы PA9 и PA10 соответственно. Для этого предназначен бит PA11_PA12_RMP из регистра SYSCFG_CFGR1.
Бит MEM_MODE регистра SYSCFG_CFGR1 определяет выбор памяти доступной по адресу 0x0000 0000 (рисунок 5):
- x0: основная память Main Flash;
- 01: Системная память System Flash;
- 11: ОЗУ.
Регистр SYSCFG_CFGR2 содержит биты статуса и управления, относящиеся к функциям безопасности и надежности. В частности, биты PBx_CDEN и PAx_CDEN отвечают за подключение защитных диодов между соответствующими выводами микроконтроллера и VDD. Биты ECC_LOCK, PVD_LOCK, SRAM_PARITY_LOCK, LOCKUP_LOCK отвечают за разрешение подачи соответствующих сигналов ошибок на входы Break таймеров TIM1/15/16/17. В этом же регистре располагается флаг SRAM_PEF, выставляемый при возникновении ошибки четности SRAM.
Контроллер SYSCFG обеспечивает коммутацию источников прерываний на входы NVIC. При этом SYSCFG имеет 32 регистра SYSCFG_ITLINE0…SYSCFG_ITLINE31, содержащих информацию о статусе всех прерываний по каждому каналу NVIC. Так как к одному и тому же входу контроллера прерываний NVIC могут подключаться несколько источников прерываний, то эти регистры помогают быстро определить, какой из источников был активен. На рисунке 6 представлен пример линии INT5, к которой с помощью вентиля ИЛИ подключены EXTI2 и EXTI3. У SYSCFG для этой линий выделен регистр SYSCFG_ITLINE6, содержащий отдельные флаги по прерываниям EXTI2 и EXTI3. Если возникло прерывание INT5, программа обработчик должна вычитать регистр SYSCFG_ITLINE6 и определить реальный источник прерывания.
Nested Vectored Interrupt Control (NVIC): контроллер прерываний
Контроллер прерываний NVIC, реализованный в семействе STM32G0, имеет 32 входа прерываний, позволяет задавать четыре уровня приоритетов и динамически изменять их в процессе работы микроконтроллера, обеспечивает быструю реакцию на прерывания, дает возможность изменять положение таблицы векторов прерываний.
NVIC-контроллер процессорного ядра Cortex-M0+ имеет только 32 входа, однако благодаря системному контроллеру SYSCFG количество поддерживаемых источников прерываний оказывается значительно выше. Некоторые входы NVIC получают сигналы от нескольких источников прерываний, объединенных по схеме логического ИЛИ (см. рисунок 6). При этом, как уже отмечалось ранее, для того чтобы определить конкретный источник, вызвавший прерывание, удобно использовать регистры SYSCFG_ITLINE0…SYSCFG_ITLINE31.
В процессе работы микроконтроллеров нередки случаи, когда несколько источников генерируют прерывания практически одновременно. Для того чтобы определить очередность обработки прерываний, используется система приоритетов. В таблице 3 представлены приоритеты источников прерываний для контроллеров STM32G0x1 [1].
Чем ниже уровень приоритета (первый столбец), тем выше приоритет прерывания. Как видно из таблицы 3, наивысший приоритет имеет сброс Reset (приоритет: -3), далее следуют немаскируемые прерывания NMI (приоритет: -2) и аппаратные ошибки HardFault (приоритет: -1). Приоритеты этих прерываний являются фиксированными и не могут быть изменены пользователем.
По умолчанию для прерываний с уровнями приоритетов от 3 до 38 используется аппаратный приоритет, указанный в первом столбце таблицы 3. Однако для этих прерываний есть возможность назначения дополнительного программируемого приоритета от 0 до 3. Например, согласно таблице 3 уровень аппаратного приоритета WWDG равен 7, а уровень приоритета PVD равен 8. То есть при одновременной генерации прерываний сначала будет обработано прерывание от WWDG, и лишь потом прерывание от PVD. Однако пользователь может определить программный приоритет для WWDG равным 1, а для PVD равным 0. В таком случае при одновременной генерации прерываний сначала будет обработано прерывание от PVD, а потом прерывание от WWDG. Важно отметить, что программные приоритеты этой группы прерываний могут изменяться динамически в ходе выполнения программы.
Таблица 3. Приоритеты источников прерываний для контроллеров STM32G0x1 [1]
Уровень приоритета | Тип приоритета | Акроним прерывания | Описание |
---|---|---|---|
-3 | фиксированный | Reset | Сброс |
-2 | фиксированный | NMI_Handler | Немаскируемые прерывания (NMI): SRAM parity error, Flash ECC double error, HSE CSS и LSE CSS |
-1 | фиксированный | HardFault_Handler | Все виды ошибок |
3 | программируемый | SVC_Handler | Вызов System service через команду SWI |
– | программируемый | – | резерв |
5 | программируемый | PendSV_Handler | Pendable request for system service |
6 | программируемый | SysTick_Handler | От таймера System |
7 | программируемый | WWDG | Прерывания от периферийных блоков |
8 | программируемый | PVD | |
9 | программируемый | RTC/TAMP | |
10 | программируемый | FLASH | |
11 | программируемый | RCC | |
12 | программируемый | EXTI0_1 | |
13 | программируемый | EXTI2_3 | |
14 | программируемый | EXTI4_15 | |
15 | программируемый | UCPD1/UCPD2 | |
16 | программируемый | DMA_Channel1 | |
17 | программируемый | DMA_Channel2_3 | |
18 | программируемый | DMA_Channel4_5_6_7/DMAMUX | |
19 | программируемый | ADC_COMP | |
20 | программируемый | TIM1_BRK_UP_TRG_COM | |
21 | программируемый | TIM1_CC | |
22 | программируемый | TIM2 | |
23 | программируемый | TIM3 | |
24 | программируемый | TIM6_DAC/LPTIM1 | |
25 | программируемый | TIM7/LPTIM2 | |
26 | программируемый | TIM14 | |
27 | программируемый | TIM15 | |
28 | программируемый | TIM16 | |
29 | программируемый | TIM17 | |
30 | программируемый | I2C1 | |
31 | программируемый | I2C2 | |
32 | программируемый | SPI1 | |
33 | программируемый | SPI2 | |
34 | программируемый | USART1 | |
35 | программируемый | USART2 | |
36 | программируемый | USART3/USART4/LPUART1 | |
37 | программируемый | CEC | |
38 | программируемый | AES/RNG |
Обработка прерываний в STM32G0 подразумевает процессы сохранения контекста перед выполнением обработки прерывания и восстановление контекста после обработки (рисунок 7).
На рисунке 7а представлен процесс обработки одиночного прерывания.
Если в процессе обработки прерывания возникло прерывание с более высоким приоритетом, то система автоматически выполняет еще одну пару операций сохранения/восстановления контекста, как показано на рисунке 7б. В данном случае вначале возникло прерывание IRQ1. Система сохранила контекст исходного приложения и перешла к обработчику IRQ1. Однако в процессе обработки IRQ1 произошло прерывание IRQ2 с более высоким приоритетом. Система сохраняет контекст обработчика IRQ1, выполняет обработку IRQ2, восстанавливает контекст обработчика IRQ1, заканчивает обработку IRQ1 и восстанавливает контекст исходного приложения.
Если в процессе обработки прерывания возникло прерывание с меньшим приоритетом, то система продолжает выполнять обработку исходного обработчика прерывания, как показано на рисунке 7в. После окончания обработки прерывания IRQ1 система не производит восстановления контекста исходного приложения, а переходит к обработке прерывания с более низким приоритетом IRQ2. Только после выполнения обработки IRQ2 восстанавливается контекст исходного приложения.
Стоит отметить, что если в процессе сохранения контекста после возникновения первого прерывания возникло второе прерывание с более высоким приоритетом, то система автоматически переключается на обработку второго прерывания, как показано на рисунке 7г.
Запрет или разрешение прерываний определяет, будет ли выполнено то или иное прерывание процессором или нет. Однако флаги NVIC выставляются вне зависимости от того, разрешено прерывание или нет.
Direct Memory Access Controller (DMA): контроллер прямого доступа к памяти
В микроконтроллерах STM32G0x1 используется семиканальный контроллер прямого доступа к памяти DMA (в некоторых линейках пятиканальный, например, в STM32G031xx и STM32G041xx). DMA обеспечивает быстрый обмен данными между периферийными блоками и памятью без участия процессора. Таким образом, процессор освобождается для выполнения других задач.
На рисунке 8 представлена структурная схема контроллера DMA. DMA взаимодействует с шиной AHB помощью двух 32-битных интерфейсов. Один из интерфейсов AHB является ведущим (мастер). С его помощью производится обмен данными между памятью и периферией. Второй интерфейс AHB является ведомым и предназначен для работы с регистрами управления и состояния DMA.
DMA поддерживает четыре режима обмена данными:
- Из периферии в память (Peripheral-to-memory);
- Из памяти в периферию (memory-to-peripheral);
- Из памяти в память (memory-to-memory);
- Из периферии в периферию (peripheral-to-peripheral).
Каждый канал DMA может иметь индивидуальные настройки следующих параметров:
- Формат данных (8/16/32 бита). DMA не упаковывает или распаковывает данные, а пересылает их «как есть», поэтому необходимо учитывать возможные проблемы с выравниванием, если формат данных источника не совпадает с форматом приемника;
- Объем передачи от 1 до 65635 циклов пересылки данных;
- Адрес источника данных;
- Адрес приемника данных;
- Тип инкремента адреса приемника (адрес не изменяется или увеличивается с заданным шагом);
- Тип инкремента адреса передатчика (адрес не изменяется или увеличивается с заданным шагом);
- использование кругового буфера для реализации непрерывного потока данных с автоматической перезагрузкой адресов передатчика и приемника, а также с обновлением счетчика циклов передач. Данный режим удобен, например, при накоплении данных от АЦП.
- Приоритет.
В контроллере DMA применяется двухуровневая система приоритетов на тот случай, если доступ к DMA потребуется нескольким процессам одновременно. По умолчанию используется аппаратный приоритет, который совпадает с номером канала: канал dma_req[0] имеет приоритет 0 (см. рисунок 8), канал dma_req[1] имеет приоритет 1 и т.д. Чем меньше номер приоритета, тем выше приоритет. Например, если одновременно возникли запросы на DMA со стороны канала dma_req[0] и dma_req[1], то сначала будет выполнен запрос от dma_req[0].
Кроме того, для каждого канала может быть назначен программный приоритет четырех уровней: very high, high, medium, и low. Сравнение приоритетов выполняется перед каждой транзакцией данных. При равенстве программных приоритетов арбитраж будет выполнен на основе аппаратных приоритетов.
Каждый канал DMA имеет независимые флаги, сообщающие о завершении передачи (TCIFx), о передаче половины данных (HTIFx ), об обнаружении ошибок (TEIFx), о возникновении прерываний (GIFx).
До сих пор, говоря о каналах DMA, мы не касались конкретных периферийных блоков. Дело в том, что в отличие, например, от семейства STM32F0, в микроконтроллерах STM32G0 запросы прерываний от периферии поступают к DMA-контроллеру не напрямую, а через специальный мультиплексор DMAMUX. Благодаря DMAMUX, запросы к DMA могут направлять до 64 передатчиков/приемников. Подробнее о DMAMUX рассказывается в следующем разделе.
Direct Memory Access Multiplexer (DMAMUX): мультиплексор запросов DMA
DMAMUX – специализированый мультиплексор в составе STM32G0, который позволяет практически произвольно перенаправлять запросы прямого доступа к памяти от периферийных блоков на каналы DMA-контроллера.
Блок схема DMAMUX представлена на рисунке 9. Информация по количеству входов и выходов DMAMUX представлена в таблице 4. Основными функциональными блоками в составе DMAMUX являются семь мультиплексоров запросов (Request multiplexor) и один генератор запросов (Request generator). Каждый мультиплексор запросов выполняет коммутацию запросов DMA на конкретный канал DMA-контроллера. Генератор запросов принимает входные сигналы-триггеры, которые также могут использоваться в качестве источников запросов DMA (подробнее об этом рассказывается ниже).
Таблица 4. Количество входов и выходов DMAMUX в микроконтроллерах STM32G0x1 [1]
Параметр | Значение | Обозначение на схеме |
---|---|---|
Число выходов DMAMUX | 7/5 | dmamux_req_outx |
Число выходов генератора запросов | 4 | dmamux_req_genx |
Число триггерных входов | 23 | dmamux_trgx |
Число синхронизирующих входов | 23 | dmamux_syncx |
Число входных каналов (прием запросов от периферийных устройств) | 57 | dmamux_req_inx |
Каждый мультиплексор запросов имеет по 64 входа. Из них 57 приходится на периферийные блоки (dmamux_req_inx), четыре линии подключены к выходам генератора запросов (dmamux_req_genx), остальные находятся в резерве. Назначение входов представлено в таблице 5. Из таблицы видно, что запрос прерывания может сформировать практически любое периферийное устройство. Коммутация каналов на выход мультиплексора выполняется с помощью поля DMAREQ_ID в регистрах DMAMUX_CxCR.
Таблица 5. Назначение каналов мультиплексора запросов в микроконтроллерах STM32G0x1 [1]
Вход мультиплексора запросов | Источник | Вход мультиплексора запросов | Источник | Вход мультиплексора запросов | Источник |
---|---|---|---|---|---|
1 | dmamux_req_gen0 | 22 | TIM1_CH3 | 43 | TIM15_UP |
2 | dmamux_req_gen1 | 23 | TIM1_CH4 | 44 | TIM16_CH1 |
3 | dmamux_req_gen2 | 24 | TIM1_TRIG_COM | 45 | TIM16_TRIG_COM |
4 | dmamux_req_gen3 | 25 | TIM1_UP | 46 | TIM16_UP |
5 | ADC | 26 | TIM2_CH1 | 47 | TIM17_CH1 |
6 | AES_IN | 27 | TIM2_CH2 | 48 | TIM17_TRIG_COM |
7 | AES_OUT | 28 | TIM2_CH3 | 49 | TIM17_UP |
8 | DAC_Channel1 | 29 | TIM2_CH4 | 50 | USART1_RX |
9 | DAC_Channel2 | 30 | TIM2_TRIG | 51 | USART1_TX |
10 | I2C1_RX | 31 | TIM2_UP | 52 | USART2_RX |
11 | I2C1_TX | 32 | TIM3_CH1 | 53 | USART2_TX |
12 | I2C2_RX | 33 | TIM3_CH2 | 54 | USART3_RX |
13 | I2C2_TX | 34 | TIM3_CH3 | 55 | USART3_TX |
14 | LPUART_RX | 35 | TIM3_CH4 | 56 | USART4_RX |
15 | LPUART_TX | 36 | TIM3_TRIG | 57 | USART4_TX |
16 | SPI1_RX | 37 | TIM3_UP | 58 | UCPD1_RX |
17 | SPI1_TX | 38 | TIM6_UP | 59 | UCPD1_TX |
18 | SPI2_RX | 39 | TIM7_UP | 60 | UCPD2_RX |
19 | SPI2_TX | 40 | TIM15_CH1 | 61 | UCPD2_TX |
20 | TIM1_CH1 | 41 | TIM15_CH2 | 62 | Резерв |
21 | TIM1_CH2 | 42 | TIM15_TRIG_COM | 63 | Резерв |
Выходы мультиплексоров подаются на соответствующие входы DMA-контроллера (dmamux_req_outx) (рисунок 8). Существует два режима работы мультиплексора: простой и с синхронизацией. В простом режиме запросы DMA обрабатываются традиционным способом без каких-либо дополнительных условий. При этом стоит отметить, что у всех мультиплексоров есть встроенный вычитающий счетчик, содержимое которого уменьшается на 1 при обработке каждого запроса DMA (рисунок 10). После перехода через ноль счетчик перезагружается значением, задаваемым в поле NBREQ соответствующего регистра DMAMUX_CxCR. Кроме того, при переходе счетчика через 0 формируется сигнал dmamux_evtx. Такие сигналы могут использоваться в качестве триггерных сигналов для генератора запросов.
Формирование запросов DMA на выходе мультиплексоров может синхронизироваться со входными сигналами dmamux_syncx. В качестве сигналов синхронизации используются: EXTI LINE0… EXTI LINE15, выходы dmamux_evt0… dmamux_evt3, LPTIM1_OUT, LPTIM1_OUT, TIM14_OC. Выбор источника синхронизации выполняется с помощью поля SYNC_ID в регистрах DMAMUX_CxCR. На рисунке 11 представлены диаграммы работы мультиплексора в синхронном режиме. До прихода сигнала синхронизации запрос DMA не обрабатывается. После возникновения сигнала синхронизации обработка запросов DMA выбранного источника разрешается, при этом активизируется встроенный счетчик. При обработке каждого запроса содержимое счетчика уменьшается на 1. При переходе счетчика через ноль канал вновь блокируется и формируется сигнал события dmamux_evtx. В дальнейшем обработка запроса DMA возможна только после прихода следующего сигнала синхронизации. Полярность сигналов синхронизации выбирается пользователем с помощью поля SPOL из регистра DMAMUX_CxCR.
Стоит отдельно коснуться генератора запросов. Этот блок принимает 23 триггерных сигнала и имеет четыре выхода. Коммутация входных каналов на выход генератора осуществляется с помощью полей SIG_ID соответствующих регистров конфигурации DMAMUX_RGxCR. Стоит отметить, что на вход генератора поступают те же сигналы, что используются для синхронизации: EXTI LINE0… EXTI LINE15, выходы dmamux_evt0… dmamux_evt3, LPTIM1_OUT, LPTIM1_OUT, TIM14_OC. С другой стороны, выходные сигналы генератора могут выступать в качестве сигналов запроса DMA. Таким образом, оказывается возможным создание автоматических цепочек запросов DMA.
Мультиплексор DMAMUX может генерировать два типа прерываний и выставлять соответствующие флаги:
- SOFx – приход сигнала синхронизации до того как внутренний счетчик запросов прерываний перейдет через 0;
- OFx – приход сигнала-триггера до того как внутренний счетчик запросов прерываний перейдет через 0.
Extended Interrupt/Event Controler (EXTI): контроллер прерываний и событий
Контроллер EXTI используется для пробуждения системы и процессорного ядра, формирования сигналов событий, а также для генерации прерываний.
Прежде чем говорить о EXTI, необходимо коснуться различий между прерываниями и событиями. Процессорное ядро Cortex M0+ поддерживает два способа перехода в спящий режим: с помощью инструкции WFE (Wait For Event) и с помощью инструкции WFI (Wait For Interrupt).
После выполнения инструкции WFE процессор засыпает, и для его пробуждения необходимо формирование сигнала на специальном входе rxev. Такие сигналы пробуждения называются событиями, а их источниками могут быть порты ввода-вывода и периферийные блоки. Далее процессор просыпается и продолжает выполнять код с того места, на котором остановился. Другими словами, если перед выполнением инструкции WFE выполнялась команда N, то после пробуждения будет выполнена следующая за ней команда N+1.
При работе с прерываниями дело обстоит несколько иначе. После выполнения команды WFI процессор также переходит в спящий режим, но для его пробуждения требуется возникновение прерывания. Прерываниями называются специализированные сигналы, которые формируются в системной и общей периферии и поступают на контроль NVIC. После пробуждения процессор выполняет не следующую команду, а соответствующий обработчик прерывания. Благодаря контроллеру EXTI в микроконтроллерах STM32G0 сигналы прерываний могут выступать также и в роли событий.
Блок схема контроллера EXTI представлена на рисунке 12. Контроллер принимает сигналы от портов ввода-вывода GPIO и от периферии. Все входные сигналы условно называются событиями и бывают двух типов: настраиваемые и прямые.
Прямые события – это сигналы прерываний, сформированные в периферийных блоках, например, прерывания от USART. Они уже аппаратно подключены к контроллеру NVIC (входы nvic(y)). Контроллер EXTI позволяет использовать эти же сигналы в качестве событий для пробуждения системы и ядра.
Настраиваемые события – это сигналы от периферии, которые не имеют собственных прерываний и флагов: сигналы от GPIO, от схемы контроля напряжения питания PVD и от аналоговых компараторов COMP1 и COMP2. Контроллер EXTI позволяет использовать эти события для пробуждения системы и ядра, а также для генерации прерываний. На рисунке 12 прерывания от этих событий обозначены как it_exti_per. Полная расшифровка всех линий EXTI приведена в таблице 7.
Таблица 6. Назначение входов и выходов контроллера EXTI [1]
Сигнал | I/O | Описание |
---|---|---|
Интерфейс с шиной AHB | I/O | Интерфейс с шиной AHB используется для взаимодействия с регистрами управления и состояний EXTI |
hclk | I | Сигнал тактирования шины AHB и EXTI |
Настраиваемые события(y) | I | Настраиваемые асинхронные сигналы (от периферии), которые не имеют собственного прерывания и флага в регистрах соответствующих периферийных блоков |
Прямые события(x) | I | Прямые синхронные и асинхронные сигналы (от периферии), которые имеют собственные прерывания и флаги в регистрах соответствующих периферийных блоков |
IOPort(n) | I | Входы от портов GPIO[15:0] |
exti[15:0] | O | Выходы EXTI, которые используются в качестве триггерных сигналов в других периферийных блоков |
it_exti_per | O | Прерывания от настраиваемых событий |
c_evt_exti | O | Выход сигнала события, синхронизируемый с помощью сигнала hclk |
c_evt_rst | I | Асинхронный вход сброса сигнала c_evt_exti |
sys_wakeup | O | Асинхронный сигнал пробуждения, передаваемый PWR, для активизации ck_sys и hclk |
c_wakeup | O | Сигнал пробуждения, передаваемый PWR, для пробуждения ядра (синхронизируется с помощью сигнала hclk) |
Таблица 7. Источники сигналов для линий EXTI [1]
Линии EXTI | Источник | Тип |
---|---|---|
0-15 | GPIO | Настраиваемая |
16 | PVD output | Настраиваемая |
17 | COMP1 output | Настраиваемая |
18 | COMP2 output | Настраиваемая |
19 | RTC | Прямая |
20 | резерв | — |
21 | TAMP | Прямая |
22 | резерв | — |
23 | I2C1 wakeup | Прямая |
24 | резерв | — |
25 | USART1 wakeup | Прямая |
26 | USART2 wakeup | Прямая |
27 | CEC wakeup | Прямая |
28 | LPUART1 wakeup | Прямая |
29 | LPTIM1 | Прямая |
30 | LPTIM2 | Прямая |
31 | LSE_CSS | Прямая |
32 | UCPD1 wakeup | Прямая |
33 | UCPD2 wakeup | Прямая |
Подключение линий GPIO выполняется с помощью шестнадцати мультиплексоров (рисунок 13). Таким образом, линии EXTI[15:0] являются производными именно от линий GPIO.
Рассмотрим подробнее подключение и использование выходов контроллера EXTI.
Выходы EXTI[15:0]. Эти выходы поступают в матрицу межсоединений IMX и используются в качестве триггерных сигналов для АЦП и ЦАП (см. раздел, посвященный IMX). EXTI[15:0] также поступают на входы системного контроллера SYSCFG, а далее через логические схемы на контроллер прерываний NVIC (см. раздел, посвященный NVIC).
Выходы sys_wakeup и c_wakeup необходимы для пробуждения из различных спящих режимов. Сигнал sys_wakeup активизирует источники тактирования (сигналы ck_sys и hclk), а сигнал c_wakeup пробуждает процессорное ядро. Для формирования этих сигналов могут использоваться как прямые, так и настраиваемые события (при этом у пользователя есть возможность выбор фронта/среза). Все разрешенные события объединены по схеме ИЛИ. Стоит отметить, что маскирование событий-источников выполняется либо с помощью регистров EXTI_IMR, либо с помощью регистров EXTI_EMR (в данной схеме эти регистры объединяются по схеме ИЛИ).
Как уже говорилось выше, выходы it_exti_per подключаются к NVIC и необходимы для генерации прерываний от GPIO и периферийных блоков, не имеющих собственных прерываний. Для маскирования этих прерываний используется регистр EXTI_IMR1.
Сигнал c_event подключен ко входу процессора rxev и используется для пробуждения ядра после выполнения команды WFE. Источниками этого сигнала являются прямые и настраиваемые события, объединение с помощью схемы ИЛИ. Маскирование событий-источников выполняется с помощью регистров EXTI_EMR.
Стоит еще раз подчеркнуть, что для прерываний и событий есть собственные регистры маскирования EXTI_EMRx и EXTI_IMRx. Причем если для настраиваемых событий эти регистры имеют понятное назначение, то для прямых событий необходимо дать некоторые пояснения. Дело в том, что линии прямых событий уже подключены к NVIC и имеют собственные регистры маскирования в составе периферийных блоков. Для них функционал регистров EXTI_IMRx ограничен маскированием при формировании сигналов sys_wakeup и c_wakeup.
Debug (DBG): модуль отладки
Модуль DBG обеспечивает пользователям широкие возможности отладки при работе с микроконтроллерами STM32G0: программирование flash-памяти, поддержка точек останова, чтение содержимого регистров и памяти. Инфраструктура DBG использует стандарт ARM® CoreSight™, который поддерживается большинством производителей отладочных инструментов.
DBG включает в себя функционал, заложенный на уровне ядра Cortex-M0+, и дополнительный функционал на уровне SoC. Блок схема DBG представлена на рисунке 14.
Подключение внешних отладчиков производится с помощью специального порта Debug Access Port (DAP) и двухпроводного интерфейса Serial Wire Debug (SWD). Использование для отладки всего двух линий (SWDIO – вывод PA13, SWCLK – вывод PA14) является большим плюсом для маловыводных микроконтроллеров STM32G0. Кроме того, при необходимости эти выводы могут выступать и в качестве выводов общего назначения. Сразу после сброса порты PA13 и PA14 по умолчанию настраиваются для работы в качестве линий SWD, однако пользователь может вручную перенастроить их для своих собственных нужд.
Все отладочные блоки, входящие в состав процессора, подключены к ядру и к DAP посредством отдельной шины (Private Peripheral Bus). При этом отладчик имеет доступ к регистрам отладочных блоков даже когда процессор выполняет программу. Кроме функциональных блоков модуль DBG имеет и ROM-память, которая содержит различную служебную информацию.
Основными отладочными блоками в составе DBG являются:
- DWT (Data watchpoint trigger) – используется для генерации сигналов при обнаружении совпадений между считанными данными (или адресом команды) и содержимым компаратора, задаваемым отладчиком. Кроме того, содержимое счетчика команд (регистр ядра R15) копируется и может быть считано из регистра PCSR, входящего в состав DWT.
- BPU (Break point unit) – используется для обнаружения точек останова. Для этого также применяются компараторы. В Cortex-M0+ имеется аппаратная поддержка четырех точек останова. После обнаружения точки останова процессор переходит в режим Halt mode. Точка останова может располагаться только во Flash-памяти, за исключением случаев, когда программа выполняется из ОЗУ.
- DBGMCU (MCU debug box) – блок, не относящийся к ядру и позволяющий учитывать особенности STM32G0. В частности DBGMCU отвечает за эмуляцию режимов пониженного потребления в процессе отладки. Именно благодаря DBGMCU, после входа в режим Stop и Standby тактирование и питание системы сохраняется. DBGMCU также позволяет «заморозить» сторожевые таймеры, чтобы предотвратить не желаемый сброс. Доступ к регистрам DBGMCU выполняется так же, как и к другим периферийным блокам – с помощью шины APB.
Reset and Clock Control (RCC): система тактирования и сброса
Рассмотрим особенности системы тактирования и сброса микроконтроллеров STM32G0 на примере STM32G0x1.
RCC поддерживает три типа сброса:
- Системный сброс (system reset);
- Сброс по питанию (power reset);
- Сброс дежурного домена (RTC domain reset);
Системный сброс. В результате системного сброса происходит сброс всех регистров за исключением регистров самой RCC и регистров дежурного домена (RTC domain).
Источниками системного сброса могут быть:
- внешний сигнал низкого уровня на входе NRST (external reset),
- сигнал от независимого сторожевого таймера (IWDG reset),
- сигнал от оконного таймера (WWDG reset),
- программный сброс (Software reset),
- сброс при ошибочном переходе в спящий режим (Low-power mode security reset),
- сброс при установке бита OBL_LAUNCH в регистре FLASH_CR (Option byte loader reset),
- сброс при подаче питания.
Конкретный источник, вызвавший сброс, можно определить с помощью содержимого регистра управления и состояния RCC_CSR.
Аппаратная реализация схемы системного сброса представлена на рисунке 15. Из нее видно, что все источники сброса являются равноправными и подключены по схеме логического ИЛИ (за исключением входа NRST). Результирующий сигнал управляет выходным транзистором, который в свою очередь подключен к выводу NRST.
Предлагаемая схема имеет ряд особенностей. Во-первых, вывод NRST имеет встроенный подтягивающий резистор, триггер Шмитта и фильтр, а, значит, для нормального выполнения внешнего или внутреннего сброса не потребуется дополнительных компонентов. Во-вторых, NRST может использоваться в качестве обычного порта ввода-вывода PF2 (режим работы NRST определяется с помощью битов NRST_MODE[1:0]). В-третьих, дополнительный сигнал удержания сброса (управляется битом IRHEN) гарантирует сброс даже при подключении внешнего конденсатора к выводу NRST.
Сброс по питанию. Сброс по питанию выполняется в трех случаях:
- При формировании сигналов сброса от схем BOR и POR, контролирующих напряжение питания. При этом сбрасываются все регистры за исключением регистров дежурного домена (RTC domain).
- при выходе из режима Standby mode. При этом сбрасываются все регистры домена VCORE. Содержимое остальных регистров сохраняется (RTC, WKUP, IWDG).
- при выходе из режима Shutdown mode. При этом сбрасываются все регистры за исключением регистров дежурного домена (RTC domain).
Сброс дежурного домена. В данном случае происходит сброс дежурного домена (регистров управления, регистров RTC, дежурных регистров). Для выполнения такого сброса необходимо установить бит BDRST в регистре RCC_BDCR.
Рассмотрим основные особенности системы тактирования микроконтроллеров STM32G0x1.
На рисунке 16 представлено дерево тактирования, которое предполагает использование нескольких генераторов:
- Встроенный высокочастотный RC-генератор HSI16 с частотой 16 МГц;
- Встроенный низкочастотный RC-генератор LSI с частотой 32 кГц;
- Внешний высокочастотный генератор или резонатор HSE с диапазоном допустимых частот 4…48 МГц;
- Внешний высокочастотный генератор или резонатор LSE с частотой 32,768 кГц;
- Внешний высокочастотный генератор или резонатор для индивидуального тактирования I2S;
- Схема ФАПЧ (PLL) с тремя выходами: PLLRCLK, PLLQCLK, PLLPCLK.
открыть картинку в полном формате
Все перечисленные источники (за исключением генератора для I2S) могут использоваться для формирования системного тактового сигнала SYSCLK. Тактовый сигнал шины AHB (HCLK) образуется из сигнала SYSCLK с помощью делителя. В свою очередь HCLK используется для формирования тактового сигнала APB (PCLK).
LSE может использоваться во всех без исключения режимах работы, в том числе в дежурном режиме VBAT mode. Встроенный генератор LSI может применяться во всех режимах за исключением Shutdown и VBAT mode. Генераторы HSI16 и HSE могут работать в режимах до Stop включительно.
Стоит отметить наличие в STM32G0 блока защиты системы тактирования (Clock Security System). При возникновении каких-либо проблем с внешними генераторами система автоматически переключится на внутренний генератор HSI16. При этом речь идет о контроле не только HSE, но и LSE, что существенно повышает надежность приложений.
Говоря о надежности, также стоит упомянуть о высокой стабильности встроенного генератора HSI16. В диапазоне 0…85°С погрешность частоты его выходного сигнала составляет всего 1%. Кроме того, у пользователей есть возможность калибровки HSI16 и LSI с помощью внешнего генератора HSE и встроенных таймеров (TIM14, TIM16 или TIM17).
В STM32G0 выход OSC_OUT может быть использован для остановки внешнего генератора с целью снижения потребления.
Система RCC позволяет независимо управлять тактированием каждого периферийного блока. Это помогает существенно уменьшить потребление. Кроме того, для уменьшения потребления используются различные режимы работы (см. раздел, посвященный контроллеру PWR). Тем не менее, необходимо иметь в виду, что в каждом из режимов на систему RCC накладываются ограничения, часть из которых представлена в таблице 8.
Таблица 8. Ограничение максимальных частот в различных режимах потребления [1]
Сигнал | Максимальная разрешенная частота, МГц | ||
---|---|---|---|
Range 1 | Range 2 | Low Power run/sleep | |
HSI16 | 16 | 16 | — |
HSE | 48 | 16 | — |
PLLPCLK | 122 | 40 | — |
PLLQCLK | 128 | 32 | — |
PLLRCLK | 64 | 16 | — |
SYSCLK | 64 | 16 | 2 МГц |
Таблица 8 также указывает на еще одну особенность системы тактирования – частота сигналов PLLQCLK и PLLPCLK может превышать системную частоту SYSCLK. Это возможно благодаря наличию умножителя в составе ФАПЧ. При этом частота генератора VCO и вовсе достигает 344 МГц (Range 1).
У микроконтроллеров STM32G0 есть два дополнительных вывода, на которые могут быть поданы внутренние сигналы тактирования:
- На выход MCO могут напрямую или через делитель подаваться сигналы HSI16, HSE, LSI, LSE, SYSCLK, и PLLRCLK;
- На выход LSO могут подаваться сигналы LSI или LSE.
Система тактирования и сброса может генерировать прерывания и устанавливать соответствующие флаги при наступлении следующих событий:
- Нарушение работы генератора LSE;
- Нарушение работы генератора HSE;
- PLL готов к работе;
- HSE готов к работе;
- LSE готов к работе;
- HSI готов к работе;
- LSI готов к работе.
Power Controller (PWR): контроллер питания
Контроллер питания PWR поддерживает доменную организацию системы питания. Рассмотрим контроллер PWR подробнее на примере линейки микроконтроллеров STM32G0x1. При этом еще раз отметим, что некоторые параметры питания для других линеек могут отличаться. Для уточнения конкретных значений следует обращаться к документации.
Структура контроллера PWR представлена на рисунке 17. Дадим краткую характеристику всем перечисленным на схеме сигналам:
- VDD – внешний источник 1,7…3,6 В, который напрямую питает внутренние регуляторы, часть аналоговых схем (например схемы сброса), контроллер питания и встроенные генераторы. Подключение этого источника производится к выводу микроконтроллера VDD/VDDA. Стоит сразу пояснить, что нижняя граница диапазона питающих напряжений 1,7 В определяется граничным напряжением VPOR(MAX) схемы сброса POR (power-on reset). После подачи напряжения питания схема POR освобождает сигнал сброса, после чего микроконтроллер может работать с напряжением питания вплоть до граничного значения напряжения VPDR(MIN) схемы сброса PDR (power-down reset), то есть до 1,6 В. Для микроконтроллеров из линейки STM32G0x0 диапазон питающих напряжений составляет 2,0…3,6 В.
- VDDA – питание аналоговой части микроконтроллера. Физически в качестве VDD и VDDA выступает один и тот же источник питания, подключаемый к выводу микроконтроллера VDD/VDDA. Верхняя граница диапазона напряжений VDDA соответствует VDD и составляет 3,6 В, а минимально допустимая нижняя граница зависит от задействованной аналоговой периферии: от 1,62 В (для АЦП и компараторов COMP), от 1,8 В (для ЦАП), от 2,4 В (для VREFBUF).
- VDDIO1 = VDD – питание портов ввода-вывода I/O. Уровни напряжения совпадают с VDD.
- VBAT – внешний источник 1,55…3,6 В, используемый для питания некоторых периферийных блоков в дежурном режиме при отключении основного питания. Источник подключается к выводу VBAT микроконтроллера. К домену VBAT (также называемому доменом RTC) относятся: RTC, TAMP, LSE и дежурные регистры.
- VREF+ – источник опорного напряжения для АЦП и ЦАП. В качестве VREF+ может выступать внешний источник, подключаемый к соответствующему выводу микроконтроллера. При этом напряжение VREF+ должно быть равно VDDA, если VDDA < 2 В. Если же VDDA > 2 В, то напряжение VREF+ должно лежать в диапазоне 2 В… VDDA . В качестве VREF+ может использоваться и встроенный буфер VREFBUF с программируемым выходным напряжением 2,048 В или 2,5 В. Выбор конкретного значения производится с помощью бита VRS из регистра VREFBUF_CSR. Это напряжение также может подаваться на вывод VREF+ микроконтроллера. Стоит иметь в виду, что такой вывод есть не у всех корпусных исполнений. Для микроконтроллеров без вывода VREF+ буфер VREFBUF должен быть всегда отключен.
- VCORE – питание домена VCORE, к которому относится процессор, цифровая периферия, SRAM и Flash (для питания Flash также используется VDD). Напряжение VCORE получается из основного напряжения питания VDD с помощью встроенных регуляторов.
Для формирования напряжения VCORE используются встроенные регуляторы: основной регулятор MR (main regulator) и малопотребляющий регулятор LPR (low-power regulator). Основной регулятор MR позволяет выполнять динамическое управление напряжением питания (Dynamic voltage scaling management), которое заключается в изменении напряжения VCORE для обеспечения оптимального соотношения между производительностью и потреблением. Для этого MR использует два режима работы:
- Range 1 – высокопроизводительный режим, в котором напряжение VCORE = 1,2 В. При этом тактовая частота системы может быть максимальной и достигать 64 МГц, время доступа к Flash имеет минимальное значение. Кроме того, допускается как чтение, так и запись Flash. В таком режиме потребление ядра составляет около 100 мкА/МГц.
- Range 2 – режим низкого потребления, в котором напряжение VCORE = 1,0 В. Тактовая частота системы ограничена значением 16 МГц, время доступа к Flash увеличено, а запись и стирание Flash невозможно. В этом режиме потребление уменьшается до 93 мкА/МГц.
Если требуется обеспечить еще меньший уровень потребления, следует снижать рабочую частоту. На частотах менее 2 МГц основной регулятор MR может быть отключен, а для питания домена VCORE будет достаточно малопотребляющего регулятора LPR. Режим с выключенным регулятором MR является одной из разновидностей активного режима работы. Кроме того для уменьшения потребления предназначен целый набор специальных спящих режимов.
Дадим краткую характеристику всем возможным режимам работы (таблица 9):
- Run – активный режим работы. В данном режиме процессорное ядро активно. Память и периферия доступны без каких-либо ограничений (кроме режима Range 2). Для уменьшения потребления могут быть использованы различные способы: активное управление напряжением питания (режимы Range 1 и Range 2 регулятора MR), снижение тактовой частоты системы, снижение частоты тактирования используемых периферийных блоков, отключение тактирования неиспользуемых периферийных блоков, отключение внешнего генератора HSE и др.
- Low-power run – малопотребляющий активный режим с отключенным основным регулятором MR и питанием домена VCORE от малопотребляющего регулятора LPR. В данном режиме ограничена максимальная частота системы (2 МГц) и возможность записи и стирания Flash.
- Sleep – тактирование ядра отключено, периферия (в том числе системная периферия, например, NVIC, SysTick и др.) и память остается в активном состоянии. Пробуждение может происходить при возникновении событий или прерываний.
- Low-power sleep – аналогичен режиму Sleep, но для питания домена VCORE используется регулятор LPR, а основной регулятор MR отключается для экономии потребления.
- Stop 0 – содержимое SRAM и всех регистров сохраняется. Все сигналы тактирования в домене VCORE остановлены. PLL, HSI16 и HSE – отключены. Некоторые периферийные блоки могут активировать HSI16 для своих нужд. Для тактирования используются LSI и LSE. Отдельные периферийные блоки, в частности RTC, TAMP, LPTIM1, LPTIM2, LPUART, USART, I2C могут быть включены или выключены по желанию пользователя. В режиме Stop 0 используется основной регулятор MR, который обеспечивает меньшую задержку пробуждения при выходе из спящего режима, но за счет увеличенного потребления.
- Stop 1 – режим аналогичен Stop 0, но для питания домена VCORE используется регулятор LPR, а основной регулятор MR отключается для экономии потребления. Расплатой за это становится увеличение времени пробуждения.
- Standby mode with SRAM – питание домена VCORE отключено, однако содержимое ОЗУ может быть сохранено. Для этого должен быть установлен бит RRS в регистре PWR_CR3. Питание ОЗУ осуществляется от регулятора LPR. Все сигналы тактирования в домене VCORE, а также генераторы PLL, HSI16 и HSE – остановлены. Для тактирования могут использоваться LSI и LSE. RTC и TAMP могут быть включены или выключены по желанию пользователя (Standby mode with RTC и Standby mode without RTC).
- Standby – аналогичен предыдущему режиму, но содержимое ОЗУ не сохраняется (должен быть сброшен бит RRS в регистре PWR_CR3). Регулятор LPR выключен.
- Shutdown mode – питание домена VCORE отключено. Все сигналы тактирования в домене VCORE, а также генераторы PLL, HSI16, HSE, LSI – остановлены. Для тактирования доступен только LSE. В данном режиме также отключаются блоки мониторинга напряжения.
Отдельно следует отметить дежурный режим с питанием от батарейки. При отключении основного питания микроконтроллер автоматически переключается на питание от VBAT (с помощью встроенного ключа). В таком режиме поддерживается работа домена VBAT: RTC, TAMP, LSE и дежурных регистров. При включении питания микроконтроллер автоматически возвращается к питанию от VDD.
В таблице 9 кратко изложены основные особенности всех режимов работы микроконтроллеров STM32G0.
Таблица 9. Особенности режимов пониженного потребления [1]
Режим | Вход в режим | Выход из режима | Источник тактирования | Использование регуляторов напряжения | |
---|---|---|---|---|---|
MR | LPR | ||||
Run | — | — | Любой | Вкл | Вкл |
Low-power run | Установить бит LPR | Сбросить бит LPR | Любой кроме PLL | Выкл | вкл |
Sleep (Sleep-now или Sleep-on-exit) | WFI или выход из ISR | Любое прерывание | Любой | Вкл | Вкл |
WFE | Событие Wakeup | ||||
Low-power sleep |
Установить бит LPR + WFI или возврат из ISR |
любое прерывание | Любой кроме PLL | Выкл | Вкл |
Установить бит LPR + WFE |
Событие Wakeup | ||||
Stop 0 | LPMS=”000” + бит SLEEPDEEP + WFI или выход из ISR или WFE |
Любое разрешенное событие EXTI | Все источники тактирования отключены, кроме LSI и LSE |
Вкл | Вкл |
Stop 1 | LPMS=”001” + бит SLEEPDEEP + WFI или выход из ISR или WFE |
Выкл | Вкл | ||
Standby with SRAM | LPMS=”011”+ установка бита RRS + бит SLEEPDEEP + WFI или выход из ISR или WFE |
Сигнал на выводе WKUP, событие от RTC, событие от TAMP, внешний сигнал сброса на выводе NRST, сброс от IWDG |
Выкл | Вкл | |
Standby | LPMS=”011” + сброс бита RRS + бит SLEEPDEEP + WFI или выход из ISR или WFE |
Выкл | Выкл | ||
Shutdown | LPMS=”1—” + бит SLEEPDEEP + WFI или выход из ISR или WFE |
Сигнал на выводе WKUP, событие от RTC, событие от TAMP, внешний сигнал сброса на выводе NRST |
Все источники тактирования отключены кроме LSE |
Выкл | Выкл |
Как уже было отмечено ранее, каждый из режимов пониженного потребления характеризуется набором активной периферии. Кроме того, большая часть периферии STM32G0 позволяет пробуждать систему с помощью прерываний или событий. В таблице 10 рассмотрена работа системной и общей периферии в спящих режимах. При рассмотрении таблицы следует также уделить внимание примечаниям.
Таблица 10. Работа периферии в режимах пониженного потребления [1]
Блок | Run | Sleep | Low-power run | Low-power sleep | Stop 0/1 | Standby | Shutdown | VBAT | |||
---|---|---|---|---|---|---|---|---|---|---|---|
— | wakeup | — | wakeup | — | wakeup | ||||||
CPU | Y | — | Y | — | — | — | — | — | — | — | — |
Flash | Y | Y | O(2) | O(2) | O(2) | — | — | — | — | — | — |
SRAM | Y | Y(3) | Y | Y(3) | Y | — | O(4) | — | — | — | — |
Backup Registers | Y | Y | Y | Y | Y | — | Y | — | Y | — | Y |
Brown-out reset (BOR) | Y | Y | Y | Y | Y | Y | Y | Y | — | — | — |
Programmable Voltage Detector (PVD) | O | O | O | O | O | O | — | — | — | — | — |
DMA | O | O | O | O | — | — | — | — | — | — | — |
HSI16 | O | O | O | O | —(5) | — | — | — | — | — | — |
High Speed External (HSE) | O | O | O | O | — | — | — | — | — | — | — |
Low Speed Internal (LSI) | O | O | O | O | O | — | O | — | — | — | — |
Low Speed External (LSE) | O | O | O | O | O | — | O | — | O | — | O |
PLL | O | O | — | — | — | — | — | — | — | — | — |
Clock Security System (CSS) | O | O | O(6) | O(6) | — | — | — | — | — | — | — |
Clock Security System для LSE | O | O | O | O | O | O | O | O | — | — | — |
RTC / Auto wakeup | O | O | O | O | O | O | O | O | O | O | O |
TAMPx (x=1,2) | O | O | O | O | O | O | O | O | O | O | O |
USARTx (x=1,2) | O | O | O | O | O(7) | O(7) | — | — | — | — | — |
USARTx (x=3,4) | O | O | O | O | — | — | — | — | — | — | — |
Low-power UART (LPUART1) | O | O | O | O | O(7) | O(7) | — | — | — | — | — |
I2C1 | O | O | O | O | O(8) | O(8) | — | — | — | — | — |
I2C2 | O | O | O | O | — | — | — | — | — | — | — |
SPIx (x=1,2) | O | O | O | O | — | — | — | — | — | — | — |
ADC | O | O | O | O | — | — | — | — | — | — | — |
DAC | O | O | O | O | O | — | — | — | — | — | — |
VREFBUF | O | O | O | O | O | — | — | — | — | — | — |
COMPx (x=1,2) | O | O | O | O | O | O | — | — | — | — | — |
Датчик температуры | O | O | O | O | — | — | — | — | — | — | — |
Таймеры (TIMx) | O | O | O | O | — | — | — | — | — | — | — |
Low-power timer 1 (LPTIM1) | O | O | O | O | O | O | — | — | — | — | — |
Low-power timer 2 (LPTIM2) | O | O | O | O | O | O | — | — | — | — | — |
Independent watchdog (IWDG) | O | O | O | O | O | O | O | O | — | — | — |
Window watchdog (WWDG) | O | O | O | O | — | — | — | — | — | — | — |
SysTick | O | O | O | O | — | — | — | — | — | — | — |
Random number generator (RNG)(9) | O | O | O | O | — | — | — | — | — | — | — |
AES hardware accelerator(9) | O | O | O | O | — | — | — | — | — | — | — |
CRC calculation unit | O | O | O | O | — | — | — | — | — | — | — |
GPIOs | O | O | O | O | O | O | (10) | до 5 входов (11) |
(12) | до 5 входов (11) |
— |
1. Обозначения: Y = включен, O = Опционально — = выключен. 2. Flash-память может быть переведена в режим Power down mode. По умолчанию Flash активна. 3. Тактирование SRAM может быть включено или выключено. 4. Содержимое SRAM сохраняется, если установлен бит RRS в регистре PWR_CR3. 5. Некоторые периферийные блоки могут активировать HSI16 в режиме Stop. При этом HSI16 используется только той периферией, которая его активировала. HSI автоматически отключается, если не используется 6. Если CSS используется для контроля HSE в режиме Low power run или Low power sleep, необходимо выбирать правильное значение делителя HSIDIV, чтобы частота SYSCLK не превысила допустимое значение. В противном случае будет сгенерирована ошибка работы внешнего генератора. 7. Прием данных USART и LPUART остается возможным в режиме Stop. Также остается возможность пробуждения по началу приема или по событию совпадения адреса и приему кадра. 8. Функция обнаружения адреса I2C остается активной в режиме Stop и может пробуждать систему по прерыванию при совпадении адреса. 9. Доступно не во всех моделях STM32G0. 10. Порты ввода-вывода сохраняют настройки (pull-up, pull-down или floating) в режиме Standby. 11. Порты ввода-вывода имеют возможность пробуждения системы из режимов Standby/Shutdown (WKUPx). 12. Порты ввода-вывода сохраняют настройки (pull-up, pull-down или floating) в режиме Shutdown, но после выхода из этого режима настройки сбрасываются. |
Для мониторинга напряжения питания в составе STM32G0 есть схемы сброса POR/PDR и BOR. Эти блоки контролируют напряжение VDD и при его уменьшении ниже заданных пороговых значений удерживают микроконтроллер в состоянии сброса.
General Purpose Inputs/Outputs interface (GPIO): порты ввода-вывода
В составе STM32G0 присутствует пять портов (GPIOA … GPIOD и GPIOF), каждый из которых содержит до 16 линий. Ранее уже было сказано, что в отличие от STM32F0, в микроконтроллерах STM32G0 управление портами ввода-вывода GPIO напрямую выполняется процессорным ядром с помощью специального порта. Благодаря этому, быстродействие GPIO оказывается высоким даже при низких тактовых частотах. Переключение каждого вывода занимает всего два такта, при этом каждый вывод имеет возможность настройки быстродействия с учетом требований потребления и ЭМС. Многие выводы совместимы с логикой 5 В.
На рисунке 18 представлена блок-схема порта ввода-вывода. Схема содержит регистры с побитовым доступом, модули входного и выходного драйвера, систему подтяжек на выходе. Благодаря этим блокам, порты ввода-вывода могут быть настроены для работы в следующих режимах:
- Вход без подтяжки;
- Вход с подтяжкой к питанию (pull-up);
- Вход с подтяжкой к земле (pull-down);
- Аналоговый вход/выход;
- Выход с открытым стоком и возможностью подтяжки к питанию или к земле;
- Выход push-pull с возможностью подтяжки к питанию или к земле;
- Выход альтернативной функции с открытым стоком и возможностью подтяжки к питанию или к земле;
- Выход альтернативной функции push-pull с возможностью подтяжки к питанию или к земле.
Для настройки режима работы GPIO используются 32-битные регистры:
- GPIOx_MODER – определяет функционал выводов (цифровой вход, цифровой выход, альтернативная функция или аналоговый вход/выход);
- GPIOx_OTYPER – определяет тип выхода: push-pull или открытый сток;
- GPIOx_OSPEEDR – определяет быстродействие (00: Very low speed, 01: Low speed, 10: High speed, 11: Very high speed);
- GPIOx_PUPDR – определяет подключение подтяжки на выходе;
- GPIOx_IDR – содержит текущее состояние входов;
- GPIOx_ODR – определяет текущее состояние выходов;
- GPIOx_BSRR и GPIOx_BSRR – позволяют осуществлять атомарное управление выходами;
- GPIOx_LCKR – позволяет зафиксировать конфигурацию входов/выходов до следующего сброса;
- GPIOx_AFRH и GPIOx_AFRL – определяют выбор альтернативной функции вывода.
Также стоит отметить, что многие микроконтроллеры STM32G0 обладают небольшим числом выводов, чтобы компенсировать этот недостаток были предприняты некоторые меры:
- Выводы NRST, BOOT, SWDIO, SWCLK, а также выводы, относящиеся к подключению HSE и LSE, имеют возможность работы в режиме обычных GPIO;
- Порты PA9 и PA10 могут быть перенаправлены на выходы P11 и PA12;
- Количество выводов питания было сокращено. В корпусных исполнениях с числом выводов до 64 используется только одна пара VDD-VSS.
Литература
Исчтоник: Компэл