Как создать простое приложение с электропитанием по стандарту USB PD, используя STM32CubeMX

1 мая

управление питаниемпотребительская электроникалабораторные приборыуниверсальное применениеST Microelectronicsстатьяинтегральные микросхемысредства разработки и материалыARMCortex-M4МикроконтроллерSTM32USBUSB type-cUSB PDUSB Power deliverySTM32CubeMXUCPD

Статья содержит методические указания по разработке простого приложения-потребителя, питающегося от шины USB по стандарту USB Power Delivery (USBPD), с использованием среды STM32CubeMX. Эта статья касается микроконтроллеров STM32, имеющих в своем составе периферийный модуль UCPD.

Все скриншоты в данной статье были получены при работе с отладочной платой на базе микроконтроллера линейки STM32G0 (рисунок 1), использующего встроенное ПО из пакета поддержки STM32CubeG0. Также для реализации целевого приложения можно использовать оценочные платы на микроконтроллерах линеек STM32G4 и STM32L5 и встроенное ПО из пакетов STM32CubeG4 и STM32CubeL5, соответственно.

Рис. 1. Плата STM32G0 Nucleo-64 с установленной платой расширения X-NUCLEO-USBPDM1

Рис. 1. Плата STM32G0 Nucleo-64 с установленной платой расширения X-NUCLEO-USBPDM1

Чтобы облегчить подключение к линиям разъема USB Type-C™, для отладочных плат Nucleo-64 (STM32G0 и STM32G4) имеется плата расширения X-NUCLEO-USBPDM1. Отладочная плата STM32L5 Nucleo-144, а также платы семейств Discovery и Evaluation изначально поддерживают стандарт USB-PD, поскольку на них уже присутствует микросхема защиты линий USB Type-C™ TCPP01-M12.

Простое приложение-потребитель, соответствующее стандарту USB-PD, предназначено для 32-битных микроконтроллеров линеек STM32G0, STM32G4 и STM32L5 на базе процессоров Arm® Cortex®-M.

Сокращения и аббревиатуры приведены в таблице 1.

Таблица 1. Расшифровка сокращений и аббревиатур

Аббревиатура Расшифровка Перевод
AMS Atomic Message Sequence Атомарная последовательность сообщений
APDO Augmented Power Delivery Object Расширенный объект PDO (сообщение о характеристиках)
BSP Board Support Package Пакет поддержки платформы
CAD Cable Detection Module Модуль обнаружения кабеля
CC Communication Channel (As in CC lines) Канал связи (в контексте «линии CC»)
DPM Device Policy Manager Менеджер политик устройства
DRP Dual Role Power (The ability for a product to either source or sink power) Поддержка обеих ролей электропитания (устройство может выступать в качестве как источника, так и потребителя энергии)
DRS Data Role Swap Обмен ролями хоста и устройства
GUI Graphical User Interface Графический интерфейс пользователя
HAL Hardware Abstraction Layer Библиотека высокого уровня
HW Hardware Аппаратное обеспечение
LL Low Layer Библиотека низкого уровня
OVP Over-Voltage Protection Защита от превышения напряжения
PDO Power Delivery Object Объект PDO (сообщение о характеристиках)
PE Policy Engine Механизм применения политик
SNK Power Sink Capability Потребитель энергии
UCPD USB type C power delivery Модуль UCPD

Материалы, относящиеся к экосистеме STMicroelectronics:

  • STM32CubeMX: Генератор кода инициализации STM32Cube;
  • руководство пользователя «Managing USB power delivery systems with STM32 microcontrollers» (UM2552);
  • руководство пользователя «STM32CubeMonitor-UCPD software tool for USB Type-C™ Power Delivery port management» (UM2468);
  • спецификация «TCPP01-M12 USB Type-C port protection» (DS12900);
  • руководство по применению «USB Type-C protection and filtering» (AN4871);
  • краткое описание «STM32CubeMonitor-UCPD software tool for USB Type-C™ Power Delivery port management» (DB3747);
  • техническая статья «Overview of USB Type-C and Power Delivery technologies» (TA0357);
  • руководство по применению «USB Type-C™ Power Delivery using STM32xx Series MCUs and STM32xxx Series MPUs» (AN5225);
  • видеоролик «STM32G0: Create a USB Power delivery sink application in less than 10 minutes»;
  • руководство пользователя платы расширения X-NUCLEO-USBPDM1 (UM2668).

Документы спецификации USB:

Первые шаги

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

Чтобы достичь указанной цели, необходимо выполнить следующие операции:

  1. Используя среду STM32CubeMX, настроить модуль UCPD, подключив к линиям CC встроенные подтягивающие резисторы Rd, чтобы обеспечить обнаружение резистора Rp на стороне источника.
  2. Измерить напряжение VBUS подключенного источника. Код инициализации АЦП генерируется средой STM32CubeMX, однако код для запуска процесса измерения нужно будет добавить самостоятельно.
  3. В заключение следует отправить устройству-источнику запрос в соответствии с протоколом USB-PD и установить определенное соглашение. Эта операция также реализуется вручную путем редактирования файлов с исходным кодом, сгенерированных средой STM32CubeMX.

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

  1. Добавить в код приложения функции трассировки, которые используют виртуальный COM-порт отладчика ST-LINK для передачи отладочной информации от платы на ПК.
  2. Активировать встроенный инструментарий, обеспечивающий обмен данными с Java-приложением, имеющим удобный графический интерфейс, которое может значительно облегчить разработку и отладку конечного приложения.

Пошаговое руководство по работе в среде STM32CubeMX

Обязательные этапы

Действия, описанные ниже, связаны с модулем UCPD, который имеется в ряде микроконтроллеров семейства STM32, например, STM32G071xx и STM32G431xx. Это периферийное устройство обеспечивает обмен данными по линиям CC в соответствии со стандартом USB-PD. На плате расширения X-NUCLEO-USBPDM1 установлены микросхема TCPP01-M12 с защитой от перегрева, которая обеспечивает защиту линий CC от перенапряжения, а также гнездо USB Type-C™.

Обращаем ваше внимание, что на оценочной плате STM32L5 Nucleo-144, а также на платах семейств Discovery и Evaluation микросхема защиты TCPP01-M12 уже установлена.

Запуск среды STM32CubeMX и выбор микроконтроллера

На рисунке 2 представлен интерфейс среды STM32CubeMX.

Рис. 2. Пользовательский интерфейс среды STM32CubeMX после запуска

Рис. 2. Пользовательский интерфейс среды STM32CubeMX после запуска

Создайте новый проект, выбрав пункт меню File/New Project или нажав на кнопку «ACCESS TO MCU SELECTOR». Поставьте флажки «STM32G0» и «LQFP64», чтобы сузить выбор возможных микроконтроллеров, и двойным щелчком выберите из списка модель STM32G071RB (рисунок 3).

Рис. 3. Выбор МК STM32G0

Рис. 3. Выбор МК STM32G0

Настройка модуля UCPD

Теперь мы можем активировать периферийный модуль UCPD, входящий в состав микроконтроллера.

Этот модуль отвечает за обнаружение поддержки подсоединенным устройством спецификации Power Delivery и обмен данными с этим устройством по линиям CC. Более подробная информация содержится в разделе «USB Type-C™/USB Power Delivery interface (UCPD)» справочного руководства на STM32G071 (RM0444).

Раскройте категорию «Connectivity» в левой части окна и выберите пункт «UCPD1». В микроконтроллере STM32G0 имеются два модуля UCPD; микросхема TCPP01 на плате расширения подключается к выводам первого модуля (UCPD1).

Мы будем разрабатывать приложение для устройства-потребителя, поэтому в раскрывающемся списке «UCPD mode» выберите пункт «Sink». Снимите выделение с флажка «Dead Battery Signals», чтобы отключить функционал модуля UCPD, отвечающий за сигнализацию о разряде собственного источника питания (рисунок 4). Наше устройство (отладочная плата и плата расширения) питаются от ST-LINK, а логика обработки состояния «разряд батареи», имеющаяся в микросхеме TCPP01, для упрощения нашей первой программы отключена установкой джампера DB-3.3V на плате расширения.

Рис. 4. Основные настройки модуля UCPD

Рис. 4. Основные настройки модуля UCPD

Теперь необходимо настроить каналы DMA и разрешить прерывания (рисунок 5).

Рис. 5. Настройка DMA для модуля UCPD

Рис. 5. Настройка DMA для модуля UCPD

Для обмена данными по USB-PD-протоколу посредством модуля UCPD в нашем устройстве используется DMA, поэтому мы должны сконфигурировать каналы DMA для передачи и приема. К примеру, для приема (RX) можно использовать канал 1 модуля DMA1, а для передачи (TX) – канал 2 модуля DMA1.

Соответствующие прерывания DMA активируются автоматически, однако напрямую пользовательским ПО они не используются. Все операции, связанные с модулем UCPD, выполняются в обработчиках прерываний этого модуля (рисунок 6).

Рис. 6. Разрешение прерываний модуля UCPD

Рис. 6. Разрешение прерываний модуля UCPD

Конфигурация FreeRTOS™

В левой части окна раскройте категорию «Middleware» и выберите пункт «FreeRTOS™» (рисунок 7).

Рис. 7. Конфигурация FreeRTOS

Рис. 7. Конфигурация FreeRTOS

В списке «Interface» секции «Mode» выберите «CMSIS_V1», а в секции «Configuration» задайте размер кучи TOTAL_HEAP_SIZE, равный 5000. Для модели STM32L5, а также при использовании более новых версий пакетов встроенного ПО вместо CMSIS_V1 необходимо выбирать CMSIS_V2.

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

Конфигурация промежуточного ПО USB-PD

В категории «Middleware» выберите «USB-PD», а в списке «Stack Configuration» в средней части окна выберите «UCPD1» (рисунок 8). Чтобы лучше понять, какое место занимает стек USB-PD в конечном приложении, обратитесь к руководству пользователя «Managing USB power delivery systems with STM32 microcontrollers» (UM2552).

Рис. 8. Конфигурация промежуточного ПО USB-PD

Рис. 8. Конфигурация промежуточного ПО USB-PD

Убедитесь, что параметр «port 0 Sink PDO1» в секции «Configuration» имеет значение 0x02019096, пусть в данном случае это и не важно, поскольку в нашем простом учебном примере этот параметр не используется. Значение 0x02019096 соответствует следующей конфигурации: 500 мВ, 1500 мА, поддержка данных обеих ролей (источник/приемник) без поддержки функции быстрой смены ролей (Fast Role Swap). Более подробно назначение отдельных битов данного параметра описано в таблице 6-14 спецификации «Universal Serial Bus Power Delivery Specification, Revision 3.0, Version 2.0, August 28, 2019», приведенной на рисунке 9.

Рис. 9. Фрагмент спецификации с переводом на русский (Таблица 6-14 спецификации «Universal Serial Bus Power Delivery»)

Рис. 9. Фрагмент спецификации с переводом на русский (Таблица 6-14 спецификации «Universal Serial Bus Power Delivery»)

Расшифровка использованного значения 0x02019096 приведена на рисунке 10. Подробная конфигурация стека показана на рисунке 11.

Рис. 10. Расшифровка значения объекта PDO с переводом на русский

Рис. 10. Расшифровка значения объекта PDO с переводом на русский

На вкладке «Stack Port0 Parameters» разработчик указывает, какие функции будет поддерживать разрабатываемое приложение, в том числе номер поддерживаемой версии спецификации USB-PD.

Рис. 11. Подробная конфигурация стека

Рис. 11. Подробная конфигурация стека

Конфигурация АЦП для измерения напряжения VBUS

Чтобы обеспечить работу конечных автоматов Type-C, необходимо контролировать напряжение VBUS. Для этой цели мы будем использовать АЦП, подключенный к шине VBUS через резистивный делитель, чтобы напряжение на входе АЦП не вышло за границы диапазона допустимых напряжений для портов ввода/вывода STM32 (рисунок 12).

Рис. 12. Делитель напряжения на плате расширения X-NUCLEO-USBPDM1

Рис. 12. Делитель напряжения на плате расширения X-NUCLEO-USBPDM1

Если посмотреть на схему платы расширения X-NUCLEO-USBPDM1, можно увидеть, что выход делителя подключен к контакту 34 разъема ST morpho, который соединяется с выводом PB1 микроконтроллера (рисунок 13).

Рис. 13. Фрагменты принципиальных схем платы STM32G0 Nucleo-64 (слева) и платы расширения X-NUCLEO-USBPDM1 (справа)

Рис. 13. Фрагменты принципиальных схем платы STM32G0 Nucleo-64 (слева) и платы расширения X-NUCLEO-USBPDM1 (справа)

В категории «Analog» выберите «ADC1».

Вывод PB1 может быть подключен ко входу девятого канала встроенного АЦП (рисунок 14). Чтобы назначить выводу эту альтернативную функцию, следует поставить флажок «IN9» в секции «Mode» или, кликнув по изображению ножки PB1 в правой части окна (Pinout view), выбрать из списка значение ADC1_IN9.

Рис. 14. Конфигурация АЦП

Рис. 14. Конфигурация АЦП

Затем на вкладке «GPIO Settings» секции «Configuration» введите в поле «User Label» для этого сигнала пользовательское имя «VSENSE» (рисунок 15).

Рис. 15. Настройки входов АЦП

Рис. 15. Настройки входов АЦП

На вкладке «Parameter Settings» задайте основные параметры модуля ADC1 (рисунок 16):

  • Clock Prescaler: Synchronous clock mode divided by 4 (тактирование: синхронный режим, делитель на 4);
  • Continuous conversion mode: Enabled (режим непрерывного преобразования: включен);
  • Overrun behavior: Overrun data overwritten (обработка переполнения буфера: старое значение перезаписывается);
  • Sampling time: 160.5 Cycles (длительность выборки: 160,5 тактов).

Рис. 16. Настройка параметров АЦП

Рис. 16. Настройка параметров АЦП

Длительность выборки определяется с учетом выходного сопротивления источника сигнала. В случае платы расширения X-NUCLEOUSBPDM1 это сопротивление больше 10 кОм, поэтому мы используем максимально возможное значение.

Последнее изменение параметров модуля АЦП: на вкладке «User Constants» создайте пользовательскую константу «VDDA_APPLI» со значением 3300, представляющую собой опорное напряжение АЦП, равное 3,3 В (рисунок 17). Эта константа будет использоваться в сгенерированном коде.

Рис. 17. Задание пользовательской константы для АЦП

Рис. 17. Задание пользовательской константы для АЦП

Примечание. При использовании оценочной платы STM32G4 Nucleo-64 необходимо выбрать 15-й канал АЦП (IN15) и задать для параметра «Rank/Sampling Time» значение «247,5 Cycles».

Настройка системы тактирования

Необходимо использовать встроенный генератор HSI, поскольку именно он формирует тактовый сигнал для модуля UCPD (рисунок 18). В качестве входного сигнала мультиплексора системного тактового сигнала (System Clock Mux) выбирается сигнал PLLCLK, из которого формируются сигналы SYSCLK и HCLK с частотой не менее 16 МГц. Максимальная частота не ограничена и для МК STM32G4 может достигать значения 170 МГц. Сигнал HCLK используется для тактирования регистров модуля UCPD, поэтому он должен быть активен.

Рис. 18. Конфигурация системы тактирования

Рис. 18. Конфигурация системы тактирования

На этом все обязательные настройки, требуемые для реализации программы простого устройства-потребителя, соответствующего стандарту USB-PD, завершены. В следующем разделе описываются дополнительные шаги, которые настоятельно рекомендуется сделать для более легкой отладки программы.

Дополнительные настройки, рекомендуемые для отладки

Конфигурация модуля UART для целей отладки

Виртуальный COM-порт (VCP), реализуемый отладчиком ST-LINK, на плате STM32G0 Nucleo-64 подключен к модулю LPUART1 микроконтроллера (рисунок 19).

Рис. 19. Линии STLK платы STM32G0 Nucleo-64

Рис. 19. Линии STLK платы STM32G0 Nucleo-64

Чтобы использовать этот модуль, необходимо выбрать его в категории «Connectivity» и переключить в асинхронный режим (указать в раскрывающемся списке «Mode» значение «Asynchronous»). Кроме того, следует подключить модуль LPUART1 к тем выводам микроконтроллера, которые используются на оценочной плате: PA2 и PA3 (рисунок 20).

Рис. 20. Конфигурация модуля LPUART1 для целей отладки

Рис. 20. Конфигурация модуля LPUART1 для целей отладки

Затем необходимо подключить передатчик модуля LPUART1 к третьему каналу модуля DMA1 (рисунок 21) и разрешить соответствующие прерывания (рисунок 22).

Рис. 21. Настройка DMA для модуля LPUART1

Рис. 21. Настройка DMA для модуля LPUART1

Рис. 22. Разрешение прерываний модуля LPUART1

Рис. 22. Разрешение прерываний модуля LPUART1

Примечание. На оценочной плате STM32G4 Nucleo-64 используется модуль USART1.

Активация встроенной трассировки для целей отладки

Для активации этого функционала разверните категорию «Utilities» в левой части окна и выберите пункт «TRACER_EMB» (рисунок 23). Затем в раскрывающемся списке «Uart Trace Source» секции «Mode» выберите «LPUART1».

Рис. 23. Активация встроенного трассировщика TRACER_EMB

Рис. 23. Активация встроенного трассировщика TRACER_EMB

Вернитесь к конфигурации промежуточного ПО USB-PD и активируйте трассировку, убрав в секции «Mode» флажок «Tracer Source» (TRACER_EMB), как показано на рисунке 24.

Рис. 24. Подключение промежуточного ПО USB-PD к трассировщику TRACER_EMB

Рис. 24. Подключение промежуточного ПО USB-PD к трассировщику TRACER_EMB

Если в процессе отладки потребуется взаимодействовать со стеком USB-PD, используя утилиту мониторинга состояния UCPD STM32CubeMonitor-Power (STM32CubeMonPwr), то можно активировать интерактивный ответчик, имеющийся в составе стека.

Активация встроенного ответчика монитора UCPD

Чтобы активировать этот ответчик, выберите в категории «Utilities» пункт «GUI_INTERFACE» и поставьте в секции «Mode» флажок «Enable» (рисунок 25). Затем для идентификации платы введите произвольный текст в поля «HWBoardVersionName» и «PDTypeName» на вкладке «Parameter Settings» секции «Configuration».

Рис. 25. Активация ответчика GUI_INTERFACE

Рис. 25. Активация ответчика GUI_INTERFACE

Сохранение проекта

После завершения процесса конфигурирования необходимо перейти во вкладку «Project Manager» главного окна и задать несколько параметров.

Укажите имя и место сохранения проекта (поля «Project Name» и «Project Location» соответственно).

Задайте минимальный размер кучи и стека (поля «Minimum Heap Size» и «Minimum Stack Size» соответственно), равный 0x400 (рисунок 26). Значения этих параметров можно будет уточнить позже, в зависимости от потребностей конкретного приложения.

Рис. 26. Настройки менеджера проекта

Рис. 26. Настройки менеджера проекта

На вкладке «Code Generator» рекомендуется выбрать переключатель «Add necessary library files as reference» (рисунок 27).

Рис. 27. Настройки генератора кода

Рис. 27. Настройки генератора кода

Переключитесь на вкладку «Advanced Settings» и выберите для LPUART значение «LL» (использовать библиотеку низкого уровня), как показано на рисунке 28.

Рис. 28. Расширенные настройки проекта

Рис. 28. Расширенные настройки проекта

Сохраните свою работу, выбрав пункт меню «File/Save Project».

Генерация кода

Нажмите кнопку «Generate Code». Появится окно-предупреждение, сообщающее о том, что не задан подходящий источник формирования временных интервалов для подсистемы HAL (рисунок 29).

Рис. 29. Предупреждение генератора исходного кода

Рис. 29. Предупреждение генератора исходного кода

С точки зрения безопасности для этой цели лучше использовать отдельный таймер.

Примечание. Такой подход принят в качестве стандартного для будущих версий пакетов встроенного ПО, особенно при использовании API CMSIS-RTOS v2, в котором таймер SysTick используется как системный таймер FreeRTOS™. В нашем случае это предупреждение можно игнорировать, нажав на кнопку «Yes».

После этого рекомендуется инициализировать Git-репозиторий в папке с исходным кодом, чтобы отслеживать его изменения в будущем.

Компиляция сгенерированного приложения

При компиляции проекта (рисунок 30) не должно появиться никаких предупреждений или сообщений об ошибках.

Рис. 30. Первая компиляция

Рис. 30. Первая компиляция

В этом проекте имеются следующие папки:

  • Application/User содержит исходные файлы, в которые мы будем вносить изменения в процессе разработки приложения;
  • Drivers содержит драйверы HAL для STM32;
  • Middleware содержит исходные файлы и библиотеки для FreeRTOS и USB-PD;
  • Utilities содержит GUI-утилиту (монитор UCPD) и исходные файлы встроенного трассировщика;
  • Output содержит файлы, полученные в результате компиляции.

Создание законченного приложения USB-PD

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

  • написать функцию калибровки АЦП и запуска преобразования;
  • разрешить таймер DPM, необходимый для работы стека USB-PD;
  • написать обработчики прерываний для пробуждения модуля UCPD;
  • реализовать функцию BSP_USBPD_PWR_VBUSGetVoltage, использующую коэффициент деления, соответствующий делителю напряжения VBUS;
  • дополнить определение функции USBPD_DPM_SNK_EvaluateCapabilities таким образом, чтобы она формировала корректный ответ на один запрос о характеристиках со стороны источника;
  • деактивировать вход микросхемы TCPP01, управляющий логикой обработки ситуации разряда батареи, подав на него высокий уровень или установив соответствующий джампер на плате расширения.

Изменения в файле src/main.c

В этом файле содержится код, выполняющий калибровку и последующий запуск АЦП посредством вызова соответствующих функций HAL. АЦП нам требуется для измерения напряжения VBUS.

Необходимо добавить в файл следующие строки:


...

/* USER CODE BEGIN ADC1_Init 2 */

HAL_ADCEx_Calibration_Start(&hadc1);

HAL_ADC_Start(&hadc1);

/* USER CODE END ADC1_Init 2 */

...

Примечание. Для STM32G4 функция HAL калибровки АЦП имеет другую сигнатуру, поэтому вызов этой функции должен иметь следующий вид:


HAL_ADCEx_Calibration_Start(&hadc1, sConfig.SingleDiff);

Примечание. Данное приложение не оптимально с точки зрения энергопотребления, поскольку АЦП работает постоянно.

Изменения в файле src/stm32g0xx_it.c

  • Функция USBPD_DPM_TimerCounter предназначена для управления таймерами, которые используются стеком USB-PD. Она должна вызываться в функции, которая отвечает за формирование временных интервалов для функций библиотеки HAL (в обработчике прерывания соответствующего таймера, в нашем случае – в обработчике таймера SysTick).
  • Встроенный трассировщик использует прерывания DMA и последовательного приемопередатчика, поэтому необходимо добавить вызов требуемых функций трассировщика в обработчики соответствующих прерываний.
  • Необходимо добавить обработчик прерывания UCPD, чтобы иметь возможность реагировать на различные события, такие как подключение кабеля или прием сообщения.

...

/* USER CODE BEGIN SysTick_IRQn 0 */

USBPD_DPM_TimerCounter();

#if defined( _GUI_INTERFACE)

GUI_TimerCounter(); /* needed with GUI_Interface */

#endif

/* USER CODE END SysTick_IRQn 0 */

...

/* USER CODE BEGIN DMA1_Channel2_3_IRQn 0 */

#if defined(_TRACE)

TRACER_EMB_IRQHandlerDMA();

#endif

/* USER CODE END DMA1_Channel2_3_IRQn 0 */

...

/* USER CODE BEGIN USART3_4_LPUART1_IRQn 0 */

#if defined(_TRACE)

TRACER_EMB_IRQHandlerUSART();

#endif

/* USER CODE END USART3_4_LPUART1_IRQn 0 */

...

/* USER CODE BEGIN UCPD1_2_IRQn 0 */

USBPD_PORT0_IRQHandler();

/* USER CODE END UCPD1_2_IRQn 0 */

...

Изменения в файле src/usbpd_dpm_user.c

Для установления первого соглашения по электропитанию необходимо добавить соответствующий код в определение функции USBPD_DPM_SNK_EvaluateCapabilities. Здесь приводится самый простой вариант, в котором запрашивается только первый объект PDO, соответствующий 5-вольтовому профилю, используемому по умолчанию. В общем случае передаваемые запросы должны соответствовать реальным, конфигурирование которых пока не поддерживается средой STM32CubeMX.

Код, контролируемый макроопределением _GUI_INTERFACE, компилируется в том случае, если предполагается взаимодействие приложения с монитором UCPD.



/* USER CODE BEGIN USBPD_DPM_SNK_EvaluateCapabilities */

USBPD_SNKRDO_TypeDef rdo;

/* Initialize RDO */

rdo.d32 = 0;

/* Prepare the requested pdo */

rdo.FixedVariableRDO.ObjectPosition = 1;

rdo.FixedVariableRDO.OperatingCurrentIn10mAunits = 50;

rdo.FixedVariableRDO.MaxOperatingCurrent10mAunits = 50;

rdo.FixedVariableRDO.CapabilityMismatch = 0;

*PtrPowerObjectType = USBPD_CORE_PDO_TYPE_FIXED;

*PtrRequestData = rdo.d32;

/* USER CODE END USBPD_DPM_SNK_EvaluateCapabilities */

...

/* USER CODE BEGIN USBPD_DPM_SetDataInfo */

/* Forward info to GUI if enabled */

#if defined(_GUI_INTERFACE)

if (NULL != DPM_GUI_SaveInfo)

{

DPM_GUI_SaveInfo(PortNum, DataId, Ptr, Size);

}

#endif

/* USER CODE END USBPD_DPM_SetDataInfo */

...

Изменения в файле src/usbpd_pwr_user.c

Код, приведенный ниже, необходим для корректного определения напряжения VBUS посредством АЦП. Стек USB-PD для определения своих дальнейших действий должен контролировать уровень VBUS на протяжении всего времени, пока будет подключен кабель. В частности, устройство-потребитель разрывает соединение, если напряжение VBUS становится меньше vSafe0V.



/* USER CODE BEGIN include */

#include "main.h"

/* USER CODE END include */

...

/* USER CODE BEGIN BSP_PWR_VBUSGetVoltage */

uint32_t val;

val = __LL_ADC_CALC_DATA_TO_VOLTAGE(VDDA_APPLI, LL_ADC_REG_ReadConversionData12(ADC1), LL_

ADC_RESOLUTION_12B); /* mV */

/* X-NUCLEO-USBPDM board is used */

/* Value is multiplied by 5.97 (Divider R6/R7 (40.2K/200K) for VSENSE) */

val *= 597;

val /= 100;

return val;

/* USER CODE END BSP_PWR_VBUSGetVoltage */

...

Формула для вычисления значения переменной val зависит от параметров резистивного делителя (рисунок 12). Для платы расширения X-NUCLEOUSBPDM1 значение напряжения VSENSE получается умножением результата АЦП на 5,97 (делитель R6/R7 = 40,2 кОм/200 кОм). В программе для МК STM32G4 используется BSP v2.0, в котором интерфейс данной функции был немного изменен. Поэтому строку return val в приведенном выше фрагменте надо будет заменить на:



*pVoltage = val;

return BSP_ERROR_NONE;

Примечание. Проект для STM32G4 генерируется не совсем корректно (это известная ошибка), вследствие чего необходимо вручную исправить файл src/usbpd.c, добавив после вызова функции USBPD_DPM_InitCore вызов функции GUI_Init.

Данная ошибка будет исправлена в следующей версии STM32CubeMX для пакетов поддержки STM32G4 версии 1.2.0 и более новых.

Проверка джамперов

На рисунке 31 представлен внешний вид платы расширения X-NUCLEOUSBPDM1.

Рис. 31. Внешний вид платы расширения X-NUCLEOUSBPDM1

Рис. 31. Внешний вид платы расширения X-NUCLEOUSBPDM1

Убедитесь, что оба джампера, установленных на правой гребенке платы расширения, соответствуют целевому микроконтроллеру (STM32G0 или STM32G4) оценочной платы. Затем установите джамперы на левой гребенке в соответствии с рисунком 32.

Рис. 32. Конфигурация перемычек платы расширения X-NUCLEOUSBPDM1

Рис. 32. Конфигурация перемычек платы расширения X-NUCLEOUSBPDM1

  • сигнал неисправности от микросхемы защиты и аппаратный сброс в данном примере не используются;
  • энергопотребление также не оптимизировано, поэтому вывод VCC микросхемы TCPP01 подключен к шине 3,3 В, а не к линии GPIO микроконтроллера (установлен джампер JP2 VCC-3.3V [7-8]);
  • в нашей простой программе логика микросхемы TCPP01, отвечающая за обработку состояния «разряд батареи», не используется, соответственно, установлен джампер JP2 DB-3.3V [11-12].

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

Установление первого явного соглашения по электропитанию

Скомпилируйте приложение, загрузите получившуюся прошивку в микроконтроллер оценочной платы, запустите утилиту монитора UCPD и подключите к разъему кабель от источника питания, поддерживающего стандарт USB-PD. Интерфейс утилиты монитора показан на рисунке 33.

Рис. 33. Процесс установления явного соглашения по электропитанию, отображаемый в окне «UCPD» монитора

Рис. 33. Процесс установления явного соглашения по электропитанию, отображаемый в окне «UCPD» монитора

В правой части окна выводится обмен между STM32G0 и источником питания. Мы можем наблюдать правильную последовательность запросов, обеспечивающих установление явного соглашения:

  1. источник сообщает о своих характеристиках (IN);
  2. МК STM32G0 посылает запрос (OUT);
  3. источник передает сообщения ACCEPT и PS_RDY (IN).

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

Отладка на более низком уровне:

  • Добавьте в окно «Live Watch» переменную «CAD_HW_Handles». Наблюдая за значением этой переменной, можно контролировать установление и разрыв соединения USB Type-C (рисунки 34 и 35).

Рис. 34. Cstate = 3: соединение установлено

Рис. 34. Переменная cstate = 3: соединение установлено

Рис. 35. Cstate = 1: соединение разорвано

Рис. 35. Переменная cstate = 1: соединение разорвано

В файле usbpd_cad_hw_if.c определены следующие константы:




#define USBPD_CAD_STATE_RESET 0u /*!< USBPD CAD State Reset

*/

#define USBPD_CAD_STATE_DETACHED 1u /*!< USBPD CAD State No cable dete

cted */

#define USBPD_CAD_STATE_ATTACHED_WAIT 2u /*!< USBPD CAD State Port partner

detected */

#define USBPD_CAD_STATE_ATTACHED 3u /*!< USBPD CAD State Port partner

attached */

Если на линиях CC нет напряжения – убедитесь, что эти сигналы проходят через микросхему TCPP01, то есть на вывод _DB, активируемый низким уровнем, подано напряжение 3,3 В. Для этого используются джамперы или определенные установки GPIO.

Примечание. В текущей версии среды STM32CubeMX имеется ошибка – в сгенерированном коде не задается режим работы вывода GPIO, подключенного к линии CC2. В файле usbpd_cad_hw_if.c должна присутствовать следующая строка:



LL_GPIO_SetPinMode(GPIOB, LL_GPIO_PIN_4, LL_GPIO_MODE_ANALOG);

При использовании пакета поддержки STM32G4, имеющего версию меньше 1.2.0, не задается необходимый макрос условной компиляции. Самое простое решение данной проблемы – самостоятельно определить макрос MB1367.

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

Рис. 36. Пользовательская кнопка на схеме платы STM32G0 Nucleo-64

Рис. 36. Пользовательская кнопка на схеме платы STM32G0 Nucleo-64

Добавьте кнопку в среде STM32CubeMX (рисунок 37).

Рис. 37. Добавление пользовательской кнопки в среде STM32CubeMX

Рис. 37. Добавление пользовательской кнопки в среде STM32CubeMX

Добавьте следующие строки в файл src/main.c:



/**

* @brief EXTI line detection callbacks

* @param GPIO_Pin Specifies the pins connected EXTI line

* @retval None

*/

void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)

{

if (GPIO_Pin == USER_BUTTON_PIN)
   /* Will display in trace the VBUS value when user button is pressed */

{

char _str[10];

BSP_PWR_VBUSGetVoltage(0);

sprintf(_str,"VBUS:%d", BSP_PWR_VBUSGetVoltage(0));

USBPD_TRACE_Add(USBPD_TRACE_DEBUG, 0, 0, (uint8_t*)_str, strlen(_str));

}

}

А также обработчик соответствующего прерывания в файл src/stm32g0xx_it.c:



/**

* @brief This function handles external line 4_15 interrupt request.

* @retval None

*/

void EXTI4_15_IRQHandler(void)

{

HAL_GPIO_EXTI_IRQHandler(USER_BUTTON_PIN);

}

Следующие шаги

Дополнительно можно реализовать управление питанием микросхемы TCPP01 и ее входом, активирующим логику обработки состояния «разряд батареи» (рисунок 38).

Рис. 38. Добавляем управление микросхемой TCPP01

Рис. 38. Добавляем управление микросхемой TCPP01

Если программа должна управлять этими выводами микросхемы TCPP01, необходимо соответствующим образом изменить конфигурацию джамперов на гребенке JP2 платы расширения. Для получения сигнала о возможных отказах, который формирует микросхема TCPP01, дополнительно следует установить джампер на контакты 5…6 гребенки JP2 (рисунок 39).

Рис. 39. Конфигурация джамперов на плате расширения X-NUCLEOUSBPDM1 при программном управлении выводами FLT, DB и VCC микросхемы TCPP01

Рис. 39. Конфигурация джамперов на плате расширения X-NUCLEOUSBPDM1 при программном управлении выводами FLT, DB и VCC микросхемы TCPP01

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

Заключение

Получившаяся программа – всего лишь первый шаг к созданию полноценного приложения, соответствующего спецификации USB-PD.

Во-первых, мы не уделили ни малейшего внимания вопросу уменьшения потребляемой мощности.

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

Для дальнейшей работы над приложением можно воспользоваться различными демонстрационными примерами для микроконтроллеров линеек STM32G0, STM32G4 и STM32L5. Эти примеры можно найти в папке «Projects» в месте установки пакета встроенного ПО, которые предоставляются компанией STMicroelectronics для всех линеек микроконтроллеров и доступны для скачивания на сайте компании. Например, демонстрационный проект использования модуля UCPD микроконтроллера STM32G0 для соответствующей оценочной платы можно найти в папке .\Projects\STM32G081B-EVAL\Demonstrations\DemoUCPD.

Оригинал статьи

Перевел Андрей Евстифеев по заказу АО КОМПЭЛ.

•••

Наши информационные каналы

О компании ST Microelectronics

Компания STMicroelectronics является №1 производителем электроники в Европе. Компоненты ST широко представлены в окружающих нас потребительских товарах – от iPhone до автомобилей разных марок. Лидеры индустриального рынка выбирают компоненты ST за их надежность и выдающиеся технические параметры. В компании ST работает 48 000 сотрудников в 35 странах. Производственные мощности расположены в 12 странах мира. Более 11 тысяч сотрудников заняты исследованиями и разработками – инновационное лидерство ...читать далее

Товары
Наименование
X-NUCLEO-USBPDM1 (ST)
STM32G071RBT6 (ST)
STM32G071RBI6 (ST)
STM32G071RBT3 (ST)
STM32G474RET6 (ST)
STM32G474RET3 (ST)