Nrst stm32 что это

от admin

Записки программиста

Ранее мы познакомились с несколькими отладочными платами на базе микроконтроллеров STM32 — это Blue Pill, платами серии Nucleo, и даже такой экзотикой, как Кракен. Все это здорово, но что, если нам захочется использовать микроконтроллер не в прототипе, а в полноценном готовом устройстве? Не вкорячивать же в него плату Nucleo! Поэтому сегодня мы разберемся, как работать с STM32 напрямую, то есть, прямо на макетной плате, на примере микроконтроллера STM32F103C8T6. Казалось бы, тема эта несложная, однако есть пара подводных граблей, про которые стоит знать.

Fun fact! Аналогичную инструкцию для микроконтроллеров AVR вы найдете в посте Как собрать Arduino прямо на макетной плате.

Примечание: Пользуясь случаем, я хотел бы поблагодарить пользователей форума easyelectronics.ru за то, что помогли мне разобраться с парой проблем, возникших при изучении сего вопроса. Особой благодарности заслуживают пользователи dosikus_2 и BusMaster, так как они раньше других предложили верные решения.

Итак, первая сложность заключается в том, что микроконтроллеры STM32 не бывают в DIP-корпусах, а значит понадобится переходник. STM32F103C8T6 имеет корпус LQFP-48, для которого готового переходника у меня не было. Такой переходник можно вытравить самому, можно поискать на eBay. Я прикинул, что в будущем мне понадобится больше одного переходника. А еще я могу захотеть подарить парочку из них, так как многие мои коллеги занимаются электроникой в качестве хобби. Плюс мне не хотелось долго ждать доставки. Поэтому я спроектировал собственный переходник в KiCad и заказал десяток плат на Резоните. Также для вашего удобства я залил плату на OSH Park. Следует однако учесть, что в пересчете на одну плату цены у OSH Park существенно выше, чем у Резонита, и доставка обычно занимает несколько недель против трех дней.

Допустим, переходник у нас уже есть. Далее открываем даташит [PDF] и смотрим распиновку микроконтроллера (стр 16):

Наиболее интересные нам сейчас пины я выделил цветом. Подключаем их таким образом:

  • Пины VSS* (8, 23, 35 и 47) идут к земле;
  • Пины VDD* (9, 24, 36 и 48) — к 3.3 В;
  • NRST (7) оставляем висеть неподключенным, но готовим перемычку для подключения его к земле в случае необходимости. Если места на макетке хватает, вместо перемычки можно использовать кнопку с конденсатором для защиты от дребезга. При этом подтягивающий резистор к плюсу не требуется, так как такой резистор уже есть в самом микроконтроллере;
  • BOOT0 (44) определяет, откуда микроконтроллер будет загружать прошивку. Нам нужно, чтобы он делал это из flash-памяти, поэтому подключаем к земле. При этом напряжение на пине BOOT1 (20) не имеет значения, и этот пин может использоваться для обычного GPIO;
  • SWIO и SWCLK (34 и 37) — к соответствующим пинам программатора;
  • Наконец, пин PC13 (2) у нас будет мигать светодиодом;

Важно! Между каждой парой соседних пинов VSS и VDD втыкаем по конденсатору на 100 нФ, и желательно — как можно ближе к пинам микроконтроллера. Без этого микроконтроллер в лучшем случае не будет прошиваться (я проверял). Некоторые же источники утверждают, что без конденсаторов его можно даже сжечь в момент подачи питания.

В итоге должно получиться примерно следующее:

Использование микроконтроллеров STM32 на макетной плате

Теперь можно приступать и к генерации проекта в STM32CubeMX. Только обязательно проверьте, чтобы SWD был включен:

Как включить SWD в STM32CubeMX

Если забыть включить SWD и прошить микроконтроллер, прошить его во второй раз будет затруднительно. У меня по умолчанию SWD был выключен. В интернете пишут, что это считается багом в STM32CubeMX, который что-то никак не починят. При этом проявляется баг только для микроконтроллеров определенных серий.

Спрашивается, а что делать, если мы случайно прошили микроконтроллер прошивкой, которая отключает SWD? В этой ситуации выполняем следующие шаги. (1) Пин NRST подключаем к земле, или, если вместо перемычки вы использовали кнопку, нажимаем и держим кнопку. (2) Говорим st-info —probe . Должны увидеть что-то вроде:

Заметьте, что программатор видит 0 байт flash-памяти. На этом шаге это нормально. (3) Выдергиваем перемычку между NRST и землей, или отпускаем кнопку. Несмотря на то, что ранее в микроконтроллер была залита какая-то прошивка, сейчас она не будет запущена. Если же повторить команду st-info —probe , окажется, что программатор видит всю flash-память:

После этого можно спокойно говорить make erase или make flash , а значит и включить SWD, как это было описано выше.

Фактически, мы получили собственную минимальную отладочную плату, собранную на макетке. За исключением описанных выше моментов, работа с ней ничем не отличается от работы с той же Blue Pill. Правим код, компилируем, прошиваем, при необходимости повторяем — все работает, как часы. Цель достигнута!

Эта заметка, разумеется, не претендует на то, чтобы полностью заменить собой даташит. В частности, за кадром осталось подключение внешних кварцевых резонаторов (LSE и HSE) и другие вопросы. Но в них, думаю, вы без труда разберетесь и самостоятельно.

Исходники к этому посту я выложил на GitHub. В репозитории вы найдете как простенькую прошивку для микроконтроллера, так и KiCad-проект адаптера для LQFP-48 вместе с готовыми Gerber-файлами.

Как обычно, если у вас есть вопросы, дополнения, возражения, и так далее — не стесняйтесь оставлять комментарии!

Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.

What is the use of NRST pin in STM32F401RCT6?

What is the use of the NRST pin in STM32F401RTC microcontroller. I am using the SWD interface to program and debug flash memory of the controller. I am finding NRST pins in both microcontroller as well as stlink debugger.

I am confused, what is the use of NRST pins? Is it used to reset the program which we flash and allow us to program it again? And why is a capacitor connected on the outer side of the pin and to ground?

enter image description here

What is the use of it in microcontroller and Stlink? How does it work?

I checked in Google. The explanation given was too technical, so kindly explain to me in simple terms.

3 Answers 3

Is it used to reset the program which we flash and allow us to program it again?

It seems you are confused about what reset actually resets. It does not «reset the program», it resets the MCU. The content of flash is not changed, so previously written program is still available.

Specifically, while NRST pin is connected to the ground the MCU stays in «reset state», i.e. it does not do anything, the clocks are stopped and the program that is already flashed is not running.

When you disconnect NRST pin from the ground (release the button) the internal pull-up resistor (marked RPU on the schematics) applies VDD voltage to it, which eventually flips Schmitt trigger and brings MCU out of reset state, at which point it starts executing the program at reset vector.

why is a capacitor connected on the outer side of the pin and to ground?

The capacitor is there to provide some EMS protection and avoid parasitic resets.

What is the use of it in microcontroller and Stlink? How does it work?

Usually the program at reset vector is a bootloader, which will either detect an attempt to upload new program (via USB, CAN, Serial etc. channels) or simply pass execution to the old program already in flash. It is the second case that can be interpreted as «program reset», since the program indeed begins execution from start. However the important difference is that NRST does much more than simple program restart, for example it resets all the MCU registers to their default states.

Note that in your particular case (using SWD interface for programming) the NRST pin is not actually useful, since SWD completely bypasses bootloader and can reset and flash MCU directly. It is only if your program reconfigured SWD pins as regular GPIO then you need hardware reset to flash a new one (remember that NRST resets all registers to default states, including pin configuration). ST-LINK usually uses software reset, however if it does not work you can go into setup interface and change this to hardware.

In short, NRST pin is used to activate bootloader when you need to flash new program using one of the communication channels and to reset MCU to default state when you want to flash new program using SWD interface and SWD pins are not available.

Микроконтроллеры STM32G0: Архитектура и системная периферия

Микроконтроллеры STM32G0 построены на базе малопотребляющего и высокопроизводительного процессорного ядра ARM Cortex-M0+ (рисунок 1).

Рис. 1. Блок схема процессорного ядра ARM Cortex-M0+ с архитектурой ARMv6-M

Рис. 1. Блок-схема процессорного ядра ARM Cortex-M0+ с архитектурой ARMv6-M

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-битных команд, за исключением некоторых команд управления. Это позволяет создавать очень компактный программный код.

Рис. 2. Архитектура ядра Cortex-M0+

Рис. 2. Архитектура ядра Cortex-M0+

Одним из важнейших изменений Cortex-M0+ по сравнению с Cortex-M0 стало уменьшение числа ступеней конвейера. В Cortex-M0+ используется двухуровневый конвейер, который позволяет выполнять обработку команд в два этапа. На первом этапе производится выборка и предварительное декодирование, а на втором декодирование и выполнение. Как уже было сказано, большинство команд ARMv6-M имеет длину 16 бит. Только 6 команд управления имеют длину 32 бита, при том что используются они относительно редко. В результате в идеальном случае за один системный такт может выбираться сразу две 16-битные инструкции.

На рисунке 3 показан простой пример обработки двух 16-битных команд. На первом такте происходит выборка команд и предварительное декодирование первой команды. На втором такте выборка новых инструкций не производится, вместо этого декодируется и выполняется первая команда, а также предварительно декодируется вторая команда, выбранная на первом такте. На третьем такте декодируется и выполняется вторая команда, а также происходит выборка следующих двух 16-битных команд. Как видно из рисунка 3, на втором такте команды не выбираются, а значит, ничто не мешает выполнять выборку данных.

Рис. 3. Обработка двух 16-битных команд

Рис. 3. Обработка двух 16-битных команд

К сожалению, при выполнении команд с переходами происходит потеря содержимого конвейера. На рисунке 4 показан пример выполнения команды условного перехода. На первом такте, как обычно, выполняется выборка двух команд: простой («Инструкция 0») и команды перехода («Переход к метке»). На втором такте выполняется инструкция 0. На третьем такте происходит выборка двух новых команд («Инструкция 1» и «Инструкция 2»). Однако в результате выполнения команды условного перехода процессору требуется обработать команду, расположенную по заданному адресу метки («Инструкция N»). В результате содержимое конвейера теряется, так как уже выбранные команды «Инструкция 1» и «Инструкция 2» оказываются неактуальными.

Рис. 4. Обработка команды перехода приводит к потере содержимого конвейера

Рис. 4. Обработка команды перехода приводит к потере содержимого конвейера

Спецификация 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 выполняет целый ряд задач:

  • Разрешает/запрещает высокоскоростной режим I 2 C и повышенную нагрузочную способность выводов I 2 C;
  • Настраивает USPD-интерфейс;
  • Разрешает/запрещает работу повышающего преобразователя;
  • Настраивает работу модуля IRTIM;
  • Переназначает порты PA11 и PA12 на выводы, занимаемые портами PA9 и PA10 соответственно;
  • Определяет расположение памяти по адресу 0x0000 0000;
  • Разрешает/запрещает некоторые функции безопасности.

Рассмотрим эти задачи подробнее.

В микроконтроллерах STM32G0 присутствуют встроенные I 2 C-контроллеры, которые поддерживают три режима скорости передачи: режим Standard-mode с максимальной скоростью обмена данными до 100 кбит/с, режим Fast-mode с максимальной скоростью 400 кбит/с, режим Fast-mode Plus со скоростью обмена до 1 Мбит/с. Режим Fast-mode Plus требует повышенной нагрузочной способности от портов микроконтроллера. Активизацию функции повышенной нагрузочной способности осуществляет SYSCFG. Для индивидуальной активизации повышенной нагрузочной способности отдельных выводов используются биты I2C_PA9…10_FMP и I2C_PB6…9_FMP регистра SYSCFG_CFGR1. Для активизации повышенной нагрузочной способности всех выводов, относящихся к I 2 C, могут использоваться биты 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: ОЗУ.

Рис. 5. Бит MEM_MODE регистра SYSCFG_CFGR1 определяет адресацию

Рис. 5. Бит MEM_MODE регистра SYSCFG_CFGR1 определяет адресацию

Регистр 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.

Рис. 6. SYSCFG упрощает поиск источников прерываний

Рис. 6. SYSCFG упрощает поиск источников прерываний

В процессе работы микроконтроллеров нередки случаи, когда несколько источников генерируют прерывания практически одновременно. Для того чтобы определить очередность обработки прерываний, используется система приоритетов. В таблице 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. Варианты обработки прерываний

На рисунке 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.

Рис. 8. Структура контроллера DMA [1]

Рис. 8. Структура контроллера DMA [1]

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-контроллера.

Рис. 9. Структура мультиплексора DMAMUX [1]

Рис. 9. Структура мультиплексора DMAMUX [1]

Блок схема 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. Такие сигналы могут использоваться в качестве триггерных сигналов для генератора запросов.

Рис. 10. Генерация событий при переполнении внутреннего вычитающего счетчика [1]

Рис. 10. Генерация событий при переполнении внутреннего вычитающего счетчика [1]

Формирование запросов 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.

Рис. 11. Синхронный режим работы DMAMUX [1]

Рис. 11. Синхронный режим работы DMAMUX [1]

Стоит отдельно коснуться генератора запросов. Этот блок принимает 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 и от периферии. Все входные сигналы условно называются событиями и бывают двух типов: настраиваемые и прямые.

Рис. 12. Блок-схема контроллера EXTI [1]

Рис. 12. Блок-схема контроллера EXTI [1]

Прямые события – это сигналы прерываний, сформированные в периферийных блоках, например, прерывания от 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.

Рис. 13. Мультиплексирование портов GPIO в контроллере EXTI [1]

Рис. 13. Мультиплексирование портов GPIO в контроллере EXTI [1]

Рассмотрим подробнее подключение и использование выходов контроллера 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.

Рис. 14. Структура модуля отладки DEBUG [1]

Рис. 14. Структура модуля отладки DEBUG [1]

Подключение внешних отладчиков производится с помощью специального порта 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.

Рис. 15. Схема системного сброса [1]

Рис. 15. Схема системного сброса [1]

Предлагаемая схема имеет ряд особенностей. Во-первых, вывод 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 кГц;
  • Внешний высокочастотный генератор или резонатор для индивидуального тактирования I 2 S;
  • Схема ФАПЧ (PLL) с тремя выходами: PLLRCLK, PLLQCLK, PLLPCLK.

Рис. 16. Дерево тактирования STM32G0x1 [1]

Рис. 16. Дерево тактирования STM32G0x1 [1]

открыть картинку в полном формате
Все перечисленные источники (за исключением генератора для I 2 S) могут использоваться для формирования системного тактового сигнала 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. Дадим краткую характеристику всем перечисленным на схеме сигналам:

Рис. 17. Система питания микроконтроллеров STM32G0x1 [1]

Рис. 17. Система питания микроконтроллеров STM32G0x1 [1]

  • 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 с помощью встроенных регуляторов.
Читать:
Кто разработал архитектуру arm

Для формирования напряжения 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. Функция обнаружения адреса I 2 C остается активной в режиме 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. Структура портов GPIO [1]

Рис. 18. Структура портов GPIO [1]

На рисунке 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 обладают небольшим числом выводов, чтобы компенсировать этот недостаток были предприняты некоторые меры:

Как прошить чип STM32

В своей недавней статье я подробно разобрал каким образом можно прошивать программным кодом чипы семейства AVR. Сегодня же я рассмотрю способы, которыми можно прошить чипы семейства STM32. Но, я не буду приводить примеры того, как можно «залить» прошивку в микроконтроллер при помощи шнура от утюга или же варианты сопряжения CentOS установленного на Chromebook и программатора от STMicroelectronics. Пойдем по пути наименьшего сопротивления и используем современный ПК с установленной на него Windows 10 64-х битной редакции. В качестве подопытной, которую будем прошивать, возьмем фирменную плату NUCLEO-F103RB. Плата относится к серии Nucleo-64, хотя сами микроконтроллеры 32-х битные. Вероятно, что цифра 64 используется по количеству выводов чипа микроконтроллера, так как для плат серии Nucleo-64 обычно используются LQFP64 корпуса микросхем.

деревья, лес, жуть

Тот самый случай, когда за деревьями не видно леса

В платы Nucleo производитель заботливо уместил средство подключения, программирования и отладки, ST-Link. Плата просто подключается USB-кабелем к компьютеру, и если установлены драйвера, то ее можно прошивать новой прошивкой, связаться по последовательному порту и протоколу, а также начать процедуру отладки. И все по одному кабелю. Однако, ST-Link, вместе с USB-портом, выполнены на куске платы, который можно с легкостью удалить, попросту его отломав. Именно так и поступим, дабы приблизить ситуацию к наиболее распространенной, когда у нас нет встроенного программатора. Ведь нам с вами так или иначе приходится сталкиваться с чипами STM32 без каких- либо дополнительных интегрированных инструментов вообще. Но прежде, чем переходить к практике по прошивке необходимо разобраться в теории, точнее в теории управлением чипами семейства STM32.

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

  • Интерфейсом USART.
  • Интерфейсом JTAG.
  • Интерфейсом ST-LINK.

Начнем по порядку.

Universal Synchronous and Asynchronous Receiver-Transmitter (USART)

Данный коммуникационный протокол позволяет подключаться к чипу даже обычным терминалом. В минимальной конфигурации для подключения к устройству нужен всего один провод. В этом случае данные будут отправляться только в одном направлении. Либо на устройство, либо с устройства. Но все же рекомендуется применять как минимум трехпроводную схему подключения: GND, TX, RX. Для подключения с целью прошивки необходимо использовать только USART1.

На чипе STM32F103RB USART1 располагается на следующих выводах:

  • CK (Clock) – PA8
  • TX – PA9
  • RX – PA10
  • CTS (Clear To Send) – PA11
  • RTS (Request To Send) – PA12

При подключении к USART следует помнить, что чипы семейства STM32 работают на напряжении 3.3 В и не стоит подключаться к ним переходниками с напряжением в 5 вольт.

Joint Test Action Group (JTAG)

JTAG — весьма популярный интерфейс, ставший промышленным стандартом. Интерфейс применяется для подключения к сложным интегральным схемам с целью тестирования и отладки. В том числе, при помощи данного интерфейса можно осуществлять заливку прошивок в чипы STM32.

На чипе STM32F103RB JTAG-интерфейс выведен на следующие позиции:

  • JTMS (JTAG Test Mode Select) – PA13
  • JTCK (JTAG Test Clock) – PA14
  • JTDI (JTAG Test Data Input) – PA15
  • JTDO (JTAG Test Data Output) – PB3
  • JNTRST (JTAG Test nReset) – PB4

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

Single Wire Interface Module (SWIM), Serial Wire Debugging (SWD) и ST-LINK

Фирма ST весьма крупная, на начало 2020 в ней работало более 40 тысяч человек. Это очень много и управлять такой махиной без бюрократического подхода просто невозможно. Поэтому в недрах ST периодически рождаются и формируются различные экосистемы. Экосистема STM32 не стала исключением. Она росла, развивалась до того момента, пока разобраться в нагромождении аббревиатур, названий, интерфейсов, их групп и прочего стало очень не просто. Но возможно. Аббревиатурой SWIM, как правило именуют сразу три сущности: кабель, технологию подключения по одному проводу и аппаратный модуль, обеспечивающий подобное подключение. SWD — означает технологию отладки при использовании последовательного подключения. При чтении литературы и форумов по STM32 можно так же натолкнуться на сокращения типа SWO вкупе с SWV.

SWO это Single wire output, т.е. технология позволяющая по одному проводу выдавать из чипа какую-то информацию. Как правило она используется для отладки, когда разработчики не желают использовать обычные UART для ее вывода, что весьма полезно, так как в любой момент можно подключиться к работающему устройству и начать получать отладочную информацию. Получать и просматривать информацию можно посредством Serial Wire Viewer (SWV). По сути, обычным терминалом с дополнительными функциями. Выдача информации осуществляется только при использовании режима SWD и доступна на микропроцессорах начиная с Cortex-M3.

И подбираясь к самому интересному, хочется отметить, что под наименованием ST-LINK кроется не только комплекс технологий, объединяющих SWIM, SWD, SWO и тому подобное, но еще и программное обеспечение, которое реализует весь набор практик и интерфейсов.

Для подключения ST-LINK на STM32F103RB задействованы следующие выводы:

  • SWDIO (Serial Wire Data Input/Output) – PA13
  • SWCLK (Serial Wire Clock) – PA14
  • TRACESWO (Trace of Serial Wire Output, та самая SWO) – PB3

Для работы через SWIM/SWD нужно-то всего два проводка, не забываем про обязательное соединение земли по всем подключенным устройствам. TRACESWO можно не подключать, особенно если данной функцией вы не пользуетесь, да и для отладки она, а не для загрузки прошивки.

Аппаратное обеспечение

Для работы с STM32 разработано и выпущено в свет великое множество различных аппаратных модулей, вот лишь самые популярные из них:

  • ST-Link;
  • J-Link;
  • Black Magic Probe.

К сожалению, у меня нет на руках ни J-Link, ни тем более Black Magic Probe, поэтому в качестве аппаратных устройств рассмотрим только USART и ST-Link.

ST-Link великий и ужасный

Когда кто-то упоминает устройство ST-Link, то скорее всего имеет ввиду китайский аналог под кодовым названием ST-Link V2 Mini. Небольшой USB-свисточек в цветастом корпусе с десятипиновым разъемом IDC. Именно такой и будем рассматривать далее. Стоят подобные устройства более, чем доступно, работают отменно, подключаются и к семейству STM8, и к семейству STM32. Но прежде пробежимся по версиям ST-Link, ведь ST-Link V2 означает вторую версию устройства.

На начало 2020 актуальны следующие аппаратные версии ST-Link:

  • ST-Link – первая версия устройства, сейчас уже не актуальна. Поддерживается подключение по USB.
  • ST-Link/V2 – вторая версия устройства. Работает с STM8 и STM32. Поддерживается улучшенное подключение по USB.
  • ST-Link/V2.1 – обновленная вторая версия устройства. Работает с STM32 (поддержки SWIM для STM8 нет). Изначально предполагалось использовать ее как встраиваемую часть системы. Поддерживает подключение по USB с технологией виртуального COM-порта, а заодно и как сменный накопитель. В таких системах нет необходимости отдельно подключать USART, достаточно только устройства ST-Link/V2.1. Именно ST-Link/V2.1 интегрирован в отладочную плату NUCLEO-F103RB, поэтому при подключении ее к ПК, подключается и COM-порт и протокол SWIM. А прошивки можно загружать, просто записывая их на чип как на флешку. Удобно, но такие программаторы в виде отдельных устройств в продаже отсутствуют.
  • ST-Link/V3 – третья версия устройства. Бывает в виде версии E (встраивается как часть системы) и S (Set или Standalone, включая SET, MINI и MODS). Работает только с STM32.

Производят ST-Link V2 Mini в массовом порядке все, кому не лень. А не лень в первую очередь нашим китайским друзьям. Вот и поставляют они универсальные отладчики-программаторы в невероятных количествах на мировой рынок. И это хорошо, ведь благодаря массовому выпуску и конкуренции есть возможность приобрести программатор за очень небольшие средства. Да, он не самой последней версии, но работать с ним можно. Нужно только разобраться как.

stlink, st-link, v2, mini, программатор, без крышки, проводки, клетка, пурпурный

Типичные представители китайских ST-Link V2 Mini

На свои устройства, заботливые производители из далекой и большой страны, предусмотрительно наносят распиновку выходов. И делают они это совершенно верно, так как никакой инструкции к устройству не прилагается. Однако, если покопаться в сети, то можно обнаружить, что существует несколько вариантов реализации вывода на китайских ST-Link V2 Mini, поэтому стоит обратить внимание на выводы, при подключении нового устройства.

При первом знакомстве с ST-Link V2 Mini у меня возникло затруднение в плане определение выводов на программаторе. Да, они подписаны и пронумерованы на корпусе, но на самом разъеме кроме ключа нет ничего. Поэтому пришлось повозиться с определением, где первый «шпынек», а где второй и все последующие.

st-link v2 mini, stlink, mini, jtag, прошивка, stm32, stm8, клетчатый, разъем, IDC, IDC10, pin, pins, пины, SWIM, SWDIO

Распиновка у моего ST-Link v2 Mini

Если подключить ST-Link V2 Mini к ПК под управлением Windows 10, то система автоматически найдет драйвер и произведет его установку. Если же драйвер не установился, либо используется версия операционной системы отличная от Win10, то можно поступить двумя путями: а) скачать драйвер с сайта производителя, б) скачать программную оболочку (о них ниже) от STMicroelectronics в поставке которой уже есть драйвер. Хочется сразу предупредить, что скачка любого программного обеспечения от ST возможна только зарегистрированным пользователям. Так компания накапливается данные о своих существующих или потенциальных клиентах.

Чем грозит отсутствие RST на STM32?

У китайских V2 Mini есть еще одна особенность. Поскольку программаторы предназначены как для работы с STM8, так и с STM32, то они содержат сразу выводы и для тех, и для других. Причем выводы на левой части разъема, около ключа, предназначены для подключения STM8 (там задействованы RST и SWIM), а на правой для STM32 (там SWCLK и SWDIO). Поэтому при работе с STM32, даже если подключить на плату вывод с RST, функция аппаратного сброса работать не будет, так как она используется только для семейства чипов STM8, для STM32 применяется другой вывод микрочипа, который не выведен на колодку разъема. Ту же учесть постиг вывод SWO. Увы, за дешевизну и многофункциональность приходится платить. Хотя, некоторые умельцы отключают вывод RST и SWIM и подключают туда верные выводы с нужных ножек микрочипа в программаторе.

В принципе, который так же подтверждается практикой, вполне можно не подключать выход сброса на микроконтроллере к программатору. Чипы STM32 весьма стабильны и если в вашей программе нет переназначений выводов, которые используются для SWD, то переход в режим программирования возможен без аппаратного сброса. Однако, если вы что-то напутали и назначили выводам (в случае STM32F103RB это PA13 и PA14) какие-то функции, то просто так запустить программатор не выйдет.

В чем проблема? Дело в том, что по умолчанию, STM32 сразу же запускает на выполнение программный код пользователя. А поскольку чип работает очень быстро, то программным способом не удается поймать момент между запуском чипа и инициализацией выводов SWD. В этом случае необходимо «нажимать» на сброс собственноручно. Ножку Reset микроконтроллера необходимо соединять с землей, запускать подключение SWD, отпускать Reset. Если наловчиться, то таким образом можно добиться срабатывания 8 или даже 9 раз из 10.

В режиме ручного сброса есть нюанс. А именно нештатный загрузчик (bootloader). Его наличие может несколько облегчить работу по подключению неподключаемого чипа, так как обычно загрузчик ждет некоторое время сигнала через UART о начале загрузки прошивки. Однако, насколько мне известно, свой загрузчик устанавливает только Arduino с ядром Maple. Но данный фреймворк уже не актуален в виду окончания его развития и поддержки.

USART/UART

Для подключения по последовательному протоколу к чипу потребуется обыкновенный конвертер USB2COM (USB2TTL, USB2UART или под любым другим наименованием). Я уже рассматривал несколько вариантов, включая кабели с чипами, для подключения по UART к AVR. Смысл подключения к STM32 ровно такой же. Только в качестве преобразователя интерфейсов под STM32 я приобрел платы от Waveshare на чипе PL2303. Платы простейшие, оборудованные всего четырьмя выводами.

При подключении к ПК, автоматически устанавливаются драйвера и устройство определяется в системе как COM-порт. При подключении адаптера к микроконтроллеру стоит обратить внимание на установленную перемычку. Плата от Waveshare способна работать с двумя напряжениями: 3.3 и 5 вольт. С чипами STM32 необходимо работать только в режиме 3.3 вольта.

usb2ttl, usb2uart, usb2com, адаптеры, waveshare

Типичные китайские USB2COM свистки

Подключение адаптера к плате примитивное. Соединяем GND, соединяем выводы адаптера и микроконтроллера Rx и Tx перекрестно (Rx одного идет на Tx другого и наоборот). Все, теперь можно работать.

Стоит ли подключать Vcc?

На ST-Link, как и на USB2TTL есть выводы Vcc/Vdd/V+. На них подается постоянное напряжение в 3.3 вольта, родное для большинства чипов STM32. Стоит ли соединять эти выводы между платой микропроцессора и адаптером? В каких-то случаях да, в каких-то случаях нет.

Если вы планируете прошивать (или проводить отладку) платы без подключения внешнего питания, то подключение Vcc от внешнего адаптера (ST-Link или USB2COM) позволит работать с платой в штатном режиме ее микропроцессора. Он будет думать, что все работает так как надо, а вот возможные силовые элементы, например, реле, отвечать на управляющие запросы уже не смогут. Подключать Vcc сразу от ST-Link и от USB2TTL можно только в том случае, если оба устройства подключены к одному ПК.

Если же программируемое устройство работает со своим питанием, то нужды в подключении дополнительного Vcc от ST-Link или же от USB2UART излишне, а в некоторых случаях может приводить и к выходу из строя адаптеров.

Из этого правила есть исключение. Если используется не китайский аналог аппаратного программатора ST-Link, а «родное» устройство, а на плате или у микроконтроллера используется нестандартное питание, то подключение сенсора напряжения с программатора ST-Link желательно. В этом случае будет происходить согласование уровней интерфейса, а плату микроконтроллера придется запитывать от внешнего устройства.

Соединять GND (землю) между всему устройствами — обязательно.

BOOT0/BOOT1

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

Что интересно, загрузить прошивку через загрузчик можно не только через USART (как все обычно привыкли), но и через CAN-шину, USB-DFU (Direct Firmware Upgrade), I2C и SPI протоколы. Другими словами, хоть через что-то, а загрузиться можно. Но таким многообразием способов загрузки оснащены только старшие модели микроконтроллеров семейства STM32, в младших доступен только USART.

Согласно спецификации, получить доступ к загрузчику можно аж 12 различными способами. Но, далеко не все из них доступны на каждом из чипов семейства STM32, да и обычно используется только способ под номером 1. При загрузке микроконтроллера, необходимо на вывод Boot0 микроконтроллера подать высокий уровень (3.3 В), а на вывод Boot1 низкий (0 В, соединить с землей). При выполнении этих двух условий микроконтроллер запустит прошитый на заводе в чип загрузчик.

У чипа STM32F103RB Boot0 выведен на отдельный вывод, а Boot1 совмещен с выводом PB2. Поэтому, по сути, если ничего не подключать к PB2, то можно оперировать только Boot0 (хотя позже мы увидим, что это не совсем так). Подаем на него высокий сигнал при загрузке чипа (по питанию или по сбросу), и попадаем в загрузчик.

На плате Nucleo-F103RB Boot0 выведен на пин с номером 7 morpho-коннектора. Закоротить на 3.3 вольта его можно при помощи перемычки (на плате есть две запасные перемычки на выводах с нижней стороны) установленной на пины 5-7 (пин 5 это Vdd).

Программное обеспечение

Для загрузки прошивки в чипы STM32 и платы на их основе существует необъятное множество программных продуктов, даже сама ST рекомендует набор из пяти бесплатных утилит для загрузки:

  • STM32CubeProg
  • STLink-Utility
  • STVP (STM32)
  • Flasher-STM32 – для загрузки через UART
  • DfuSe – для загрузки через USB

Пробежимся по ним.

STM32CubeProg

Фирменный программатор от ST, скачивается с официального сайта (не забываем про обязательную регистрацию). STM32CubeProg позиционируется как универсальное средство, содержащее в себе всё необходимое, да еще и под несколько платформ (Windows, Linux, MacOS) сразу. STM32CubeProg можно использовать как в виде графической оболочки, так и в виде консольной версии для любителей клавиатуры и черного экрана терминала. Такая неприхотливость и неразборчивость объяснятся просто — оболочка написана на Java, поэтому может портироваться куда угодно (необходимо только изменять небольшое платформозависимое ядро). ST даже не стали разбивать поставку по операционным системам, просто включили все дистрибутивы в один архив, а пользователь сам разберется, что ему нужно. Удобство неимоверное.

При первом подключении ST-Link V2 программатор может определить, что версия прошивки на ST-Link V2 устарела и предложит ее обновить. При желании можно обновить, на китайских устройствах проблем без или после обновления версии прошивки не обнаружено.

st-link v2 mini плата Nucleo подключение

Огрызок Nucleo-64 с подключенным St-Link V2 MIni

При подключении ST-Link к плате Nucleo с отломанным ST-Link V2.1 подключаем выходы с китайского ST-Link V2 к коннекторам ST morpho CN7 (гребенка с левой стороны) следующим образом:

  • 3.3 V -> Pin5
  • GND -> Pin19
  • SWCLK -> Pin15 (PA14)
  • SWDIO -> Pin13 (PA13)

После физического подключения на плате Nucleo включается светодиод питания (красный) и начинает выполняться прошивка (если туда зашит блинкер, то будет мигать зеленый светодиод). На ST-Link V2 загорается синий светодиод. После нажатия на кнопку Connect в STM32CubeProgrammer микроконтроллер переводится в режим остановки, считывается некоторый объем памяти и устройство готово к программированию или любым другим операциям. ST-Link V2 в этот момент сигнализирует о режиме остановки попеременным миганием синего и красного светодиодов.

stm32cube, connected, stm32

Программатор подключившийся к плате посредством интерфейса ST-Link

Cube Programmer, помимо просто прошивки позволяет выполнять следующие операции:

  • Читать и сохранять Flash-память микроконтроллера, если она не защищена от чтения.
  • Очищать как Flash-память, так и внешнюю память микроконтроллера. Причем очищать можно как поблочно, так и все целиком. Под внешней памятью тут подразумевается память, подключенная посредством SPI, FMC, FSMC, QSPI, OCTOSPI и другими интерфейсами, но работать с ней можно только при помощи внешнего загрузчика (в комплекте уже идет набор из внешних загрузчиков под наиболее популярные платы).
  • Устанавливать или снимать флаги запрета чтения Flash иначе чем из программного кода, выполняемого микроконтроллером, снимать или устанавливать флаги запрета записи в конкретные сектора на Flash, и некоторые другие функции.

CubeProg помимо ST-Link может подключаться по UART, USB и OTA (обновление по воздуху). Для начала рассмотрим наиболее интересующий нас вариант подключения посредством ST-Link. При подключении ST-Link V2 к компьютеру и выборе варианта загрузки через ST-Link в окне ST-LINK Configuration отображаются некоторые настройки, которые могут повлиять на способность подключения. Дам пояснения всем им:

  • Serial number — серийный номер микроконтроллера установленного в ST-Link. У всех чипов STM32 есть свой собственный, уникальный серийный номер, а в ST-Link V2 установлен именно чип семейства STM32.
  • Port — подключение посредством SWD или JTAG. Поскольку мы используем ST-Link V2 от безымянного китайского производителя, то в нашем случае функциональным будет только SWD.
  • Frequency (kHz) — частота на которой работает интерфейс SWD или JTAG. Чем больше значение, тем быстрее все будет прошиваться и считываться, но при длинном кабеле могут возникать ошибки. Если все работает, то оставляем в значении по умолчанию.
  • Mode — режим подключения ST-Link к чипу, может принимать три значения. Normal — стандартный вариант подключения: производится сброс, затем перевод устройства в режим остановки. Вариант сброса выбирается в следующем пункте. Connect Under Reset — подключение и остановка выполнения программы в микроконтроллере при сбросе. Тот самый случай, когда выводы ответственные за SWD/JTAG на микроконтроллеры переназначены на другие функции. При этом варианте программатор старается отловить момент, когда происходит сброс (пользователь отпускает кнопку Reset). Hot Plug — подключение без сброса и остановки, применяется для «горячего» изменения регистров или памяти.
  • Reset Mode — выбор варианта сброса, может принимать несколько значений. Software reset — вариант по умолчанию, происходит полный сбор микроконтроллера программным способом за исключением подсистемы отладки. Hardware reset — сброс через вывод Reset микроконтроллера. Физический программатор при этом должен быть подключен к выводу Reset своим управляющим выводом Reset. На китайском варианте ST-Link V2 Mini данная функция неработоспособна. Core reset — сброс ядра микроконтроллера.
  • Access port — на большинстве устройств STM32 всего один порт доступа по SWD/JTAG, поэтому оставляем значение по умолчанию.
  • Shared — позволяет эксклюзивно (Disabled) захватывать подключение к микроконтроллеру, если же функция включена (Enabled) то можно запустить несколько STM32CubeProg или других программных оболочек к одному физическому устройству ST-Link.

Итак, если есть какие-то сложности при подключении программатора к микроконтроллеру, то начинаем играться с настройками. В большинстве случаев помогает переключение в режим Connect Under Reset. А если же проблем нет, то переходим непосредственно к программированию.

STM32CubeProg, st-link, cube prog, firmware update

Процесс обновления прошивки ST-Link в STM32CubeProg

В качестве программы-примера для прошивки я буду использовать обычный Blink («мигатель») написанной на языке MBED (активно продвигается ST для своих плат). Код программы примитивен, но вполне рабочий (и компилируется всего в 50 Кб):

#include «mbed.h»
DigitalOut myled ( LED1 ); int main () <
while ( 1 ) <
myled = 1 ;
wait ( 1 );
myled = 0 ;
wait ( 1 );
>
>

Итак, программа откомпилирована под мой чип (STM32F103RB), Flash-память контроллера предварительно стерта (дабы убедиться, что новая программа работает, а не старая). Мой компилятор подготовил для меня сразу два файла:

  • Файл с расширением elf — промежуточный формат, содержит откомпилированную микропрограмму, но она требует линковки в соответствии с конкретным чипом.
  • Файл с расширением bin — конечный формат для загрузки в конкретный микрочип.

На главной странице CubeProg нажимаем плюсик и выбираем файл с расширением bin для загрузки. Если с файлом все в порядке, то его содержимое (в одном из форматов разрядности) открывается в окне просмотра. Теперь можно подключится к чипу, если чип уже не подключен, и нажимаем Download (тут странно, ведь в нашей культуре загрузка прошивки в чип была бы выгрузкой, Upload). Отключаем программный программатор (Disconnect) и перезагружаем плату. После перезагрузки встроенный светодиод начинает мигать.

cube prog, stm32, загрузчик

Альтернативный способ загрузки прошивки в Cube Prog

Загрузить прошивку в микроконтроллер можно и на вкладке Erasing & Programming. В этом случае есть возможность настроить параметры загрузки. В данном примере я включил галочки проверки загруженного после прошивки, а так же запуск программы на исполнение после завершения загрузки. При этом ST-Link не выходит из режима подключения к плате, а все так же остается подключенным.

Подключаемся через заводской загрузчик и с использованием STM32 Cube Programmer

Как правило, при подключении через ST-Link проблем не возникает. А вот с UART придется совершить больше действий. Для начала следует убедиться, что в системе есть драйвера под USB2COM адаптер. Под чип PL2303 в Win10 обыкновенно все уже имеется сразу, либо скачивается с серверов обновления Microsoft. Но все равно, следует открыть диспетчер оборудования (Device Manager) и убедиться, что устройство работоспособно и ему назначен соответствующий номер порта. В моем случае устройство подключилось на COM4.

Вторым шагом необходимо провести соответствующую коммутация проводников. Подключить Tx на USB2TTL к выводу PA9, Rx к выводу PA10 (при чтении спецификации не лишним будет обратить внимание на то, что USART1 может быть альтернативно переназначен на другую пару выводов, в случае с F103RB это PB6 и PB7). Затем необходимо подключить вывод PB2 (сюда заведен вывод BOOT1 микрочипа) к любому выводу земли. Подключаем вывод BOOT0 к любому выводу 3.3 V, а также не забываем про соединение GND USB-адаптера и платы. Если плата не питается от чего-то еще, то подключаем так же питание 3.3 V с USB-адаптера на, например, Vdd пин Nucleo (кстати, на Nucleo присутствует перемычка, определяющая откуда на микропроцессор будет подавать питание, с Vdd или от USB встроенного ST-Link, при отломанном ST-Link питание в любом случае будет браться с Vdd).

stm32, usart, st-link, подключение, плата, провода, USB

К Nucleo-64 подключены свистки UART и ST-Link

Таким образом мы подключили USB2UART адаптер к USART1 (именно к USART1 подключается загрузчик) платы Nucleo, подали на нее с того же самого адаптера питание и активировали Схему 1 вызова заводского загрузчика (BOOT0 +3,3V; BOOT1 GND). После нажатия на сброс, если все было подключено верно, вместо выполнения кода мигателя (он остался от предыдущих экспериментов с ST-Link) будет исполнен заводской загрузчик. Небольшое замечание: несмотря на то, что по умолчанию BOOT1 (PB2 в случае Nucleo-F103RB) инициализируется на землю, его все равно рекомендуется жестко соединить с GND, в противном случае возможно срабатывание загрузчика «через раз» (при этом пользовательская прошивка так же не будет вызываться, так как BOOT0 не будет передавать ей управление).

stm32cubeprog, stm32, cube, prog, programmer, uart, usart, загрузчик, бутлоадер, bootloader

STM32 Cube Prog подключенный к плате через заводской загрузчик

Для подключения через USART в CubeProg необходимо выбрать тип подключения UART и выбрать соответствующий COM-порт. В отношении остальных параметров вопрос остается открытым. Дело в том, что заводской загрузчик от ST обладает возможностью автоподстройки под параметры подключения по UART, с другой стороны, на конкретных параметрах и из-за особенностей аппаратного обеспечения может не произойти подключение к загрузчику программатора. Поэтому, если подключение не происходит необходимо в первую очередь поиграться со скоростью подключения, затем с четностью. Если же ничего не помогает, то необходимо еще раз перепроверить все подключения.

После установления связи программатора с платой посредством UART можно пользоваться CubeProgrammer точно так же, как и при подключении через ST-Link. Более того, можно не отключать от платы и сам адаптер ST-Link, на работоспособность его присутствие не влияет. А вот следует ли отключать 3.3 V от BOOT0? Высокий уровень на BOOT0 требуется для инициализации заводского загрузчика. После подключения программатора к чипу, можно отключить BOOT0 от напряжения, тогда при следующей перезагрузке платы управление будет передано пользовательской прошивке, загруженной в чип.

ST-Link Utility

ST-Link Utility, пожалуй, основная и наиболее популярная утилита для загрузки прошивок в STM32 посредством ST-LINK, которой все пользуются. Загружается программный продукт с сайта ST за регистрацию. По набору возможностей и функций ST-Link Utility практически полностью повторяет STM32CubeProg за исключением двух моментов. Utility работает под Windows, Utility может подключаться к платам только посредством SWD или JTAG. Все остальное, начиная от настройки Option Bytes и заканчивая внешними загрузчиками с командной строкой повторяет CubeProg. Да, интерфейс немного отличается, он проще, зато нет никакой Java и в помине.

st-link utility, программатор, stm32

Место где кроются настройки в ST-Link Utility

Настройки подключения (те самые Connect under reset) скрываются в меню Target, там же кроются пункты про прошивке.

st-link itility, stm32, программатор

Все готово к заливке прошивки в ST-Link Utility

Итак, пробуем прошить нашу плату через ST-Link V2 и с применением ST-Link Utility. Подключаемся к устройству, очищаем Flash-память, выбираем наш файл firmware.bin и жмем Start. Секунда ожидания и зеленый индикатор на плате замигал. Прошивка проведена удачно.

Несмотря на то, что ST-Link Utility полностью повторяет часть функций CubeProg, многие разработчики используют именно ее, так как считают, что этот продукт более надежен и прост в использовании.

STVP (STM32)

Утилита STVP (ST Visual Programmer) можно скачать с официального сайта ST. Она работает под управлением Windows и поддерживает не только STM32, но и чипы семейства STM8 (если они кому до сих пор интересны). STVP является часть ST MCU Toolset, который помимо самого программатора включает еще среду разработки STVD и ассемблерный линкер.

stvp, stm32, программирование, контроллер, прошивка, firmware

Вид STVP с подключение к чипу

STVP заточен на ассемблер, на настоящих хардкорщиков, тех кто способен писать программы для микроконтроллеров обращаясь напрямую к регистрам и памяти микроконтроллера. Поэтому он может работать только с файлами hex и s19. Подобного компилятора у меня под рукой не нашлось, поэтому процедуру прошивки пришлось пропустить, тем не менее программатор подключился через китайский ST-Link V2 к моей плате, считал ее память и отобразил все на экране. При наличии желания – связка работоспособная, тем более, что STVP работает не только с ST-Link, но и с RLink, STICE и прочими аппаратными системами ориентированными в основном на семейство STM8.

Flasher-STM32

Flasher-STM32 в девичестве назывался STM32 Flash loader demonstrator и использовался для загрузки демонстрационного мигателя с первыми платами. Загружает прошивки только через UART (он же COM-порт) и присутствует исключительно под Windows. Заполучить прошивальщик можно все там же, с сайта ST.

STM32, Flash Loader, FlashLoader, Flash Demonstrator, программатор, ST

Основные экраны STM32 Flash Loader

Пользоваться загрузчиком очень просто, так как интерфейс скуден и все сложное убрано далеко от глаз. В принципе, все, что в нем есть, это очистка бита защиты flash-памяти чипа от чтения (в микроконтроллерах STM32 есть такая штатная функция, как защита от чтения), управление защитой записи и чтения секторов встроенной flash -памяти, возможность загрузки и выгрузки прошивки и содержимого flash-памяти чипа, редактирование Option Bytes (настроек микроконтроллера).

DfuSe

Наименование DfuSe происходит от Device Firmware Upgrade STMicroelectronics Extension. Методика DFU была придумана для еще более простого обновления прошивок на разработческих платах с портом USB. Программа работает только через подключение по USB. Доступны библиотеки для написания собственных приложений по загрузке прошивок в микроконтроллеры.

dfu, stm32, dfuse, программатор

Основной и единственный экран DfuSe

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

dfu, dfumanager, manager, stm32, программатор

Интерфейс DfuSe Manager для работы с DFU-файлами

Создаются файлы DFU при помощи комплектной утилиты DFU File Manager. Она может не только запаковать прошивку в файл, но и произвести обратный процесс.

К слову сказать, но мне так и не удалось подключить Nucleo-F103RB к DfuSe, так как USB на плате подключается к ST-Link V2.1, а не напрямую к микроконтроллеру. Для работы же DFU требуется прямое подключение микроконтроллера к USB (с согласованием уровней, разумеется). В таком случае, при наличии соответствующих драйверов (и с задействованием схемы с запуском загрузчика) в операционной системе можно загружать прошивку по обычному USB.

Можно ли использовать плату ST-Link V2.1 от плат Nucleo?

В процессе изысканий способов заливки прошивок разными способами в плату на основе чипа STM32 от платы донора Nucleo-64 была успешно отломана часть с программатором ST-Link версии 2.1 с портом USB. И сразу же возникает вопрос, а нельзя ли эту плату в дальнейшем использовать как удобный программатор? Ведь иметь одно устройство, сочетающее в себе сразу три (ST-Link, Virtual COM и USB Mass Storage) ой как удобно.

st-link v2.1, nucleo-64, подключение, плата, провода, шпыньки, пины

Nucleo-64 с подключенным SWD ST-Link V2.1

Давайте попробуем, в качестве бонуса, подключить программатор ST-Link от платы Nucleo обратно к плате Nucleo посредством проводков, словно мы используем произвольный чип STM32 с программатором ST-Link V2.1.

На «огрызке» имеется несколько разъемов и перемычек для подключения чего-либо, вот они:

  • CN2 – выбор режима работы ST-Link через коннектор SWD или же через дорожки на печатной плате.
  • CN3 – выход на UART (пины Tx, Rx).
  • CN4 – коннектор SWD.
  • CN12 и CN11 – на некоторых платах используется как выход для пинов вместо внешнего осцилятора. При поставке закрыты на землю с обратной стороны.
  • JP1 – применяется для ограничения потребления платой через порт USB. Если перемычка снята, то максимальное потребление платой и всей ее обвязкой должно быть не более 300 мА. Если перемычка установлена, то максимальное потребление не должно превышать 100 мА, при этом питание платы Nucleo должно осуществляться через E5V или VIN пины. Однако, если плата подключена по USB не к порту компьютера, а к USB-блоку питания или USB-хабу со своим питанием, то Nucleo-64 можно запитывать и через USB при большом потреблении, но тогда нужно установить перемычку. Ограничения внесены на тот случай, если плата перестает стабильно работать/определяться при перегрузке по питанию порта USB, по большей части относится к портам USB1/USB2.

Итак, для целей использования ST-Link от Nucleo как отдельного программатора ST-Link V2.1 следует:

  • Снять перемычки с CN2, таким образом мы активируем коннектор SWD.
  • Подключить выводы с коннектора CN4, первый пин верхний и обозначен точкой, подключаем сразу к «огрызку» Nucleo-64:
  1. VDD_Target – сенсор питания платы, через него нельзя запитать что-либо, он действует наоборот. При подключении к платам со стандартным питанием его можно не подключать.
  2. SWCLK – подключаем к PA14
  3. GND
  4. SWDIO – подключаем к PA13.
  5. NRST – сброс
  6. SWO – порт по отладочной информации.
  • Также подключаем пины Tx (сверху) и Rx (снизу) к PA10 и PA9 соответственно.
  • Берем питание еще откуда-либо, например, с левого пина JP1, там 3.3 вольта.

Соответственно, если все подключено верно, то появляется сразу три возможности:

  1. При подключении ST-Link V2.1 к ПК по USB подключается папка с несколькими файлами, включая инструкцию. Эта папка – внутренняя Flash-память ST-Link (он так же построен на чипе STM32, поэтому в нем все есть). Если в эту папку скопировать файлик с прошивкой, то он автоматически запишется в подключенную плату. Однако, следует учитывать, что объем «флешки» программатора всего 156 Кб, и очень объемную прошивку залить таким образом может не получиться.
  2. Подключаться по SWD (ST-Link) программаторами и осуществлять все предусмотренные операции. При этом корректно отрабатывает Reset.
  3. Подключаться к USART1 (или любому другому доступному к которому были подключены выводы) терминальной программой. При этом в операционной системе COM-порт определяется как STLink Virtual COM Port. А при наличии правильной конфигурации BOOT01/BOOT1 можно так же обращаться и к заводскому загрузчику.

Вместо заключения

Разработчики STM32 проделали огромную работу, как в плане разработки своих чипов, так и программного обеспечения. Несомненно, что чипы STM32 современны и весьма удобны в работе. Вокруг них собрана невероятная инфраструктура, написаны сотни и тысячи спецификаций, разработаны десятки программных и аппаратных комплексов для работы с микроконтроллерами STM32. Но все это многообразие может вызвать реакцию отторжения у новичка, который может быть просто ошеломлен объемом информации, которую следует переварить, дабы хоть как-то начать ориентироваться в мире STM32. И надеюсь, что мое кратенькое погружение в запутанный мир современной микроэлектроники позволит хоть немного облегчить труд познания.

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

Опубликовано 31.01.2020 автором kvv213 в следующих категориях:
Soft железо статья

Похожие публикации