Сетевые технологии

Лабораторная работа №13. Работа с LED PWM контроллером

Разбить на страницы
Показывать лекцию целиком

13.1 Цели и задачи

Цель работы - изучить порядок работы со средой создания программного обеспечения, освоить правила настройки портов ввода-вывода микроконтроллера ESP32-C3. Задачи:

  • Изучить архитектуру микроконтроллера ESP32-C3
  • Освоить работу с среде VSCode для разработки микроконтроллерных приложений.
  • Разработать программу для управления контактами GPIO.
  • Презентация к блоку "Микроконтроллеры RISC-V"

    13.2 Основные теоретические сведения о работе с микроконтроллерами для RISC-V

    В настоящее время на рынке представлены микросхемы микроконтроллеров с архитектурой RISC-V различных производителей, например, 32 разрядные контроллеры SweRV Core (Western Digital); FE310 (SiFive); RV32M1 (NXP); MHS001 Huangshan (HUAMI); GD32VF103 (GigaDevice); CH32V103 (WCH); К1986ВК025 (Миландр); ESP32-C3 (Espressif); MIK32 (Микрон).

    Перечисленные ядра, исполняющее инструкции RISC-V, разных производителей отличаются: глубиной конвейера, размерами и организацией кэша данных и команд, реализацией схем предсказаний переходов. При этом все ядра используют общую ISA (Instruction Set Architecture).

    Описание использованного ядра RISC-V

    Предлагаемый практикум ориентирован на работу с микроконтроллером ESP-RISC-V (ESP32-C3) компании Espressif Systems. Архитектура микроконтроллера показана на Рис. 13.1.

    CPU and Memory. Процессорное ядро ESP-RISC-V представляет собой 32-разрядное ядро, основанное на RISC-V ISA, называемой "I" с префиксом RV32 или RV64 в зависимости от ширины целочисленного регистра. Эта базовая ISA реализует целочисленные вычислительные инструкции, целочисленные инструкции загрузки, сохранения и управления и является обязательной для всех реализаций RISC-V. Кроме того в ядре реализованы стандартные расширения: инструкций целочисленного умножения и деления ("M") и расширение набора сжатых инструкций стандарта RISC-V ("C"). Для реализации операций умножения и деления предусмотрены соответствующие 32-битные модули. Ядро имеет 4-х ступенчатый скалярный конвейер, оптимизированный по площади, мощности и производительности и поддерживающий тактовую частоту до 160 МГц. В состав процессорного ядра входят контроллер прерываний (INTC), обеспечивающий обработку 32 векторизованных прерываний с семью уровнями приоритета; модуль отладки (JTAG); и системная шина (SYS BUS) для доступа к памяти и периферийным устройствам.

    (рис 13.1) Архитектура микроконтроллера ESP-RISC-V (ESP32-C3)

    Внутренняя память ESP32-C3 разделена на три сегмента: внутреннее ПЗУ (384 КБ), внутренняя SRAM (400 КБ) и Real Time Clock (RTC) FAST Memory (8 КБ).

  • Внутреннее ПЗУ (384 КБ). ПЗУ содержит программные инструкции и некоторые данные низкоуровневых системных программ.
  • Внутренняя память SRAM (400 КБ). Внутреннее статическое ОЗУ- это энергозависимая память, к которой процессор может быстро получить доступ в течение одного такта работы. Часть SRAM может быть настроена на работу в качестве кэша для доступа к внешней памяти. Доступ к некоторым частям SRAM возможен только через шину инструкций процессор, а к некоторым можно обращаться как через шину команд процессора, так и через шину данных процессора.
  • Память RTC (Real Time Clock). RTC реализована в виде статического ОЗУ (SRAM), поэтому является волатильной, однако устойчивой в глубоком сне. RTC FAST Memory (8 КБ): к памяти RTC FAST может обращаться только центральный процессор, и она обычно используется для хранения инструкций и данных, которые должны сохраняться во время глубокого сна.
  • Внутри каждого сегмента могут существовать различные ограничения доступа к шине (например, некоторые части сегмента могут быть доступны только по шине данных процессора), поэтому каждый сегмент также дополнительно делится на части. Части внутренней памяти и диапазоны их адресов на шине данных и/или шине команд приведены в Таблице 13.1.

    Части внутренней памяти и диапазоны их адресов на шине данных и/или шине команд
    Тип шины Границы адресов Размер Применение
    Младший адрес Старший адрес
    Data bus 0x3FF0_0000 0x3FF1_FFFF 128 Internal ROM 0
    0x3FC8_0000 0x3FCD_FFFF 384 Internal SRAM
    Instruction bus 0x4000_0000 0x4003_FFFF 256 Internal ROM
    0x4004_0000 0x4005_FFFF 128 Internal ROM 1
    0x4037_C000 0x4037_FFFF 16 Internal SRAM 0
    0x4038_0000 0x403D_FFFF 384 Internal SRAM 1
    Data/Instruction bus 0x5000_0000 0x5000_1FFF 8 RTC FAST Memory

    Общая структура и разделение адресов памяти показаны на Рис. 13.2.

    Кэш-память (Cache), доступная только для чтения, представляет собой восьмистороннюю ассоциативную память, ее размер составляет 16 КБ, размер блока - 32 байта. Когда кэш активен, он занимает часть пространства внутренней памяти. Кэш единый для инструкций и данных, но одновременно может реализовывать кеширование либо инструкций, либо данных. При возникновении промаха кэш-памяти контроллер кэша инициирует запрос к внешней памяти по отношению к ядру памяти.

    Обращение процессора к внешней памяти через кэш показано на Рис. 13.2. В соответствии с настройками MMU (блок управления памятью) кэш сопоставляет адрес процессора с физическим адресом внешней памяти. Благодаря такому сопоставлению адресов ESP32-C3 может адресовать до 16 МБ внешней флэш-памяти.

    Блок Peripherals содержит следующие модули:

  • GDMA (General Direct Memory Access) - общий контроллер прямого доступа к памяти, он обеспечивает передачу данных от периферийных устройств в память без участия центрального процессора, что позволяет снизить нагрузку на ЦП.
  • ESP32-C3 имеет 22 вывода GPIO, которым можно назначить различные функции путем конфигурирования соответствующих регистров. Некоторые GPIO могут использоваться для аналоговых функций, например, для подключения входного сигнала АЦП. Все GPIO имеют возможность выбора внутреннего подтягивания или отвода, или могут быть установлены в высокоимпедансное состояние. Когда GPIO сконфигурированы как входные, входное значение может быть считано программно через регистр. Входные GPIO также могут быть настроены для генерации прерываний процессора по фронту или по уровню. Все цифровые выводы ввода-вывода являются двунаправленными, неинвертирующими и трехпозиционными, включая входные и выходные буферы с трехпозиционным управлением. Эти выводы могут быть мультиплексированы с другими функциями, такими как UART, SPI и т.д. Для работы с низким энергопотреблением GPIO могут быть переведены в состояние удержания. Для маршрутизации сигналов от периферийных устройств к выводам GPIO используются IO MUX и матрица GPIO, обеспечивая высококонфигурируемый ввод/вывод.
  • (рис 13.2) Распределение адресного пространства ESP32-C3

    В кристалле реализованы контроллеры последовательных интерфейсов.

    SPI (Serial Peripheral Interface) - синхронный последовательный интерфейс, используемый для связи с внешними периферийными устройствами. В ESP32-C3 интегрированы три контроллера SPI: SPI0, SPI1, предназначенные в основном для внутреннего использования и SPI2 (GP-SPI2 или General Purpose SPI2), обладающий широкими возможностями коммуникации. На рис. 13.3 показаны варианты организации обмена данными с устройствами SPI.

    (рис 13.3) Подключение SPI контроллеров ESP32-C3

    ESP32-C3 имеет два контроллера универсального асинхронного приемника/передатчика UART: UART0 и UART1, контроллер интерфейса I2S и шины I2C (Inter-Integrated Circuit). Для автомобильных и промышленных приложений в кристалл ESP32-C3 встроен двухпроводной автомобильный контроллер TWAI®. Для программирования флэш-памяти системы, для чтения выходных данных программы, а также для подключения отладчика в кристалле ESP32-C3 встроен контроллер USB Serial/JTAG, объединяющий функциональность USB-последовательного преобразователя и адаптера USB-to-JTAG, что исключает необходимость внешних адаптеров. В кристалле имеется устройство дистанционного управления RMT (Remote Control Peripheral), поддерживающее два канала инфракрасной дистанционной передачи и два канала инфракрасного дистанционного приема.

    Для обработки аналоговых сигналов в микроконтроллере предусмотрены два 12-битных аналого-цифровых преобразователя ADC (Analog-to-Digital Converter) последовательного приближения (SAR ADC), которые могут обрабатывать аналоговые сигналы с шести выводов.

    ШИМ-контроллер LED LED PWM может генерировать независимые цифровые сигналы по шести каналам. ШИМ контроллер используется для управления свечением светодиодов, при котором при котором длительность единичного широтно-импульсно-модулированного сигнала определяет яркость свечения за счет мерцания. Контроллер может генерировать цифровые сигналы с настраиваемыми периодами и рабочим циклом с точностью до 18 бит, поддерживая плавное увеличение или уменьшение рабочего цикла. При этом можно использовать несколько источников синхронизации, включая внешний кристалл. Контроллер может работать даже тогда, когда процессор находится в спящем режиме.

    Температурный датчик (Temperature Sensor) предназначен для определения температуры внутри микросхемы. Температура определяется такими факторами, как тактовая частота микроконтроллера или нагрузка на входы/выходы. Выходной сигнал датчика представляет собой напряжение, которое преобразуется АЦП в цифровое значение.

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

    Блок Security содержит модули, реализующие защиту: контроль разрешений на доступ к внутренней и внешней памяти; модули шифрования и дешифрования памяти; средства криптографического аппаратного ускорения, реализованные на алгоритме симметричного шифрования AES (Advanced Encryption Standard), алгоритме безопасного хеширования SHA (Secure Hash Algorithm ) и криптографическом алгоритме с открытым ключом RSA (Rivest, Shamir и Adleman), генератор случайных чисел RNG (Random Number Generator) и средства проверки подлинности сообщений, использующий односторонние хеш-функции HMAC (Hash-based Message Authentication Code).

    Блок Wireless digital circuit содержит следующие модули, обеспечивающие передачу данных по радиоканалам. Приемник 2,4 ГГц, демодулирующий радиочастотный сигнал 2,4 ГГц в квадратурные сигналы базовой полосы и преобразующий их в цифровую форму с помощью двух высокоскоростных АЦП высокого разрешения. В приемник интегрированы ВЧ-фильтры, средства автоматической регулировки усиления сигнала, схемы подавления смещения по постоянному току и фильтры базовой полосы. Передатчик 2,4 ГГц модулирующий квадратурные сигналы базовой полосы в радиочастотный сигнал 2,4 ГГц и управляющий антенной с помощью мощных фильтров. Встроенные средства цифровой калибровки дополнительно улучшают линейность усилителя мощности. Тактовый генератор, вырабатывающий квадратурные тактовые сигналы 2,4 ГГц как для приемника, так и для передатчика.

    Модуль Wi-Fi MAC реализует полный MAC-протокол Wi-Fi 802.11 b/g/n, поддерживая базовый набор услуг (BSS) STA и SoftAP под управлением функции распределенного управления.

    Модуль Bluetooth поддерживает оба существующих протокола: классический с базовой скоростью и повышенной скоростью передачи данных Bluetooth 4.2 BR/EDR (Basic Rate / Enhanced Data Rate) и Bluetooth LE (Low Energy) с низким энергопотреблением. Для подключения и настройки радиомодулей используются функции API Wi-Fi, предоставляемые производителем микроконтроллера.

    13.2.1 Описание платы прототипирования CORE ESP32

    Для выполнения макетных экспериментов используется плата CORE ESP32, разработанная на основе Espressif Systems ESP32-C3. Основная плата поддерживает UART, GPIO, SPI, I2C, ADC, PWM и другие интерфейсы, которые можно выбрать и настраивать в соответствии с решаемой задачей. Описание внешних контактов платы приведено на рис. 13.4.

    (рис 13.4) Отладочная плата Core-ESP32

    Питание платы CORE-ESP32-C3 можно обеспечить следующими способами:

  • источник питания интерфейса USB Type-C, этот способ используется по умолчанию и предпочтителен во время отладки;
  • блок питания с контактами 5 В и GND;
  • блок питания с контактами 3V3 и GND.
  • На плате CORE ESP32 установлены:

  • 2 светодиода, контакты для подключения к ним показаны в таблице 13.2.
  • две кнопки: кнопка BOOT может реализовать функцию загрузки BOOT, кнопка RST может реализовать функцию сброса, контакты для подключения к кнопкам показаны в таблице 13.3.
  • Индикация платы
    Cветодиод GPIO Описание
    D4 IO12 Активный высокий уровень
    D5 IO13 Активный высокий уровень
    Кнопки платы
    Кнопка Функция контакта Описание
    BOOT /GPIO9 При нажатии кнопки микроконтроллер переходит в режим загрузки Активный низкий уровень
    RST При нажатии кнопки происходит сброс микроконтроллера Активный низкий уровень

    При работе с платой необходимо учитывать следующие особенности:

  • BOOT (IO09) Нельзя допустить подачу на контакт IO09 нуля до включения питания, микроконтроллер перейдет в режим загрузки.
  • Для проектирования используйте вывод IO08, а прямое внешнее подключение не рекомендуется, поскольку при загрузке и записи на выводе IO08 низкий уровень, а последовательный порт нельзя использовать для загрузки.
  • При написании собственного программного обеспечения следует обратить внимание на режим флэш-памяти. Существуют следующие режимы:
  • DIO - хост SPI использует технологию "быстрого чтения двойного ввода-вывода". Два контакта SPI используются для записи части адреса флэш-памяти и для чтения данных флэш-памяти: требуется вдвое меньше тактов по сравнению со стандартным SPI.
  • DOUT - хост SPI использует "быстрое чтение с двумя выходами". Два контакта SPI используются для чтения данных флэш-памяти. Немного медленнее, чем DIO, поскольку адрес записывается через один вывод данных MOSI (Master Out Slave In).
  • QIO - хост SPI использует технологию "Quad I/O Fast Read". Четыре контакта SPI используются для записи части адреса флэш-памяти и для чтения данных флэш-памяти: этим фазам требуется четверть тактового цикла по сравнению со стандартным SPI.
  • QOUT - хост SPI использует функцию быстрого чтения с четырьмя выходами. Четыре контакта SPI используются для считывания данных флэш-памяти. Немного медленнее, чем QIO, поскольку адрес записывается через один вывод данных MOSI.
  • При настройке флэш-памяти QIO сигналы SPI SPIHD (IO12) и SPIWP (IO13) мультиплексируются. Чтобы увеличить количество доступных GPIO, плата разработки выбирает режим DIO с использованием 2-проводного SPI и в этом случае контакты IO12 и IO13 не подключены к флэш-памяти.
  • Сигнал VDD внешней флэш-памяти SPI подключен к системе питания 3,3 В. Во время использования не требуется настраивать другие источники питания. Применяется общий 2-проводной режим связи SPI.
  • По умолчанию контакт VDD флэш-памяти SPI подключен к GPIO11, и для его использования в качестве GPIO необходимо выполнить его перенастройку.
  • 13.2.2 Подготовка среды проектирования

    Для проектирования под выбранный микроконтроллер необходимо иметь следующие инструменты:

  • инструментарий для компиляции кода для ESP32;
  • инструменты сборки проектов (CMake и Ninja) для создания полноценного приложения для ESP32;
  • среду проектирования ESP-IDF, которая содержит API (библиотеки программного обеспечения и исходный код) для ESP32 и сценарии для работы с набором инструментов разработки.
  • В качестве сред разработки можно использовать среду на основе Eclipse или VSCode (Visual Studio Code) с соответствующими расширениями. В текущей работе будет использован VSCode, для подготовки среды необходимо выполнить его установку, воспользовавшись ссылкой. После установки VSCode необходимо активизировать расширение ESP-IDF для работы с микроконтроллером. По указанной ссылке находится подробная инструкция по установке расширения Espressif IDF.

    После завершения установки рекомендуется открыть шаблон проекта командой Open Folder. В левой части окна VS Code (рис. 13.5) размещена панель управления, содержащая следующие основные элементы:

  • Проводник, позволяющий переходить между файлами проекта.
  • Поиск, реализующий поиск конкретных слов внутри документа.
  • Система управления версиями, предназначенная для взаимодействия с Git, просмотра изменений в коде и разных его версий.
  • Запуск кода, обеспечивающий запуск и проверку кода.
  • Расширения, показывающий список расширений, которые можно дополнительно установить в VS Code.
  • (рис 13.5) Рабочее окно VS Code

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

  • Указать COM порт, к которому подключается плата. Определение номера порта происходит автоматически после подключения платы к компьютеру, которое осуществляется через USB порт. После активизации команды выбора COM порта появится выпадающий список, в котором будут показаны активные устройства с последовательным подключением.
  • Указать микросхему, в которую осуществляется загрузка проекта, выбрав в выпадающем списке ESP32C3. Также указать способ загрузки, как показано на рис. 13.6.
  • Выполнить сборку и загрузку проекта и запустить монитор для наблюдения результатов работы. Эти операции можно запускать соответствующими командами, закрепленными в строке за отдельными пиктограммами, а можно запустить весь процесс одной пиктограммой, интегрирующей три команды вместе.
  • (рис 13.6) Меню выбора способа загрузки

    После загрузки проекта в плату в окне монитора можно отслеживать статус процессов сборки и загрузки, а также контролировать процесс работы программы.

    13.2.3 GPIO

    На рис. 13.7 показана общая схема работы IO MUX и матрицы GPIO.

    (рис 13.7) IO MUX и матрица GPIO

    Матрица GPIO обеспечивает переключение между входными/выходными сигналами периферийных устройств и контактами. 42 входных сигнала периферийных устройств могут быть подключены к любым выводам GPIO, также, как и любой из 78 периферийных выходных сигналов могут быть скоммутированы на любой контакт GPIO. Поддерживается синхронизация сигналов периферийных входов на основе тактовой шины APB.

    IO MUX конфигурируется через регистр IO_MUX_GPIOn_REG для каждого вывода GPIO. Контакт может быть настроен на функцию, маршрутизируемую матрицей GPIO, или подключен, минуя матрицу GPIO. Обход матрицы актуален для улучшения частоты работы высокоскоростных цифровых сигналов (SPI, JTAG, UART), поскольку в этом случае IO MUX используется для прямого подключения выводов к периферийным устройствам.

    Электрический интерфейс между логикой микросхемы и выводом GPIO показан на рис. 13.8. Схема управляется с помощью сигналов разрешения входа (IE), разрешение выхода (OE), WPU и WPD подключения подтягивающих резисторов (pull-up и pull-down). Bonding pad - точка, используемая для физического подключения от корпуса микросхемы к выводу GPIO.

    (рис 13.8) Внутренняя структура подключения к контакту микросхемы

    13.2.4 Ввод данных в периферийные устройства через GPIO матрицу

    Для считывания данных с контакта GPIO X в периферийный сигнал Y, необходимо выполнить следующие действия:

  • Настроить регистр GPIO_FUNCY_IN_SEL_CFG_REG, соответствующий периферийному сигналу Y в матрице GPIO:
  • установить GPIO_SIGY_IN_SEL, чтобы разрешить ввод периферийного сигнала через матрицу GPIO;
  • установить GPIO_FUNCX_IN_SEL на нужный вывод GPIO.
  • Некоторые периферийные сигналы не имеют действительного бита GPIO_SIGy_IN_SEL, а именно, эти периферийные устройства могут только получать входные сигналы через матрицу GPIO.

  • Дополнительно можно включить фильтр для входных сигналов, установив регистр IO_MUX_GPIOX_FILTER_EN. Фильтровать можно только сигналы длительностью более двух тактов.
  • Синхронизировать вход GPIO, установив GPIO_PINX_REG, соответствующий выводу GPIO X, следующим образом:
  • установить GPIO_PINX_SYNC1_BYPASS, чтобы разрешить входной сигнал, синхронизированный по нарастающему или по спадающему фронту;
  • установить GPIO_PINX_SYNC2_BYPASS, чтобы разрешить входной сигнал, синхронизированный по нарастающему или спадающему фронту во втором такте.
  • Настроить регистр IO MUX для включения входного сигнала внешнего контакта. Для этого установить IO_MUX_GPIOX_REG соответствующий выводу GPIO X, следующим образом:
  • установить IO_MUX_GPIOX_FUN_IE для разрешения входа;
  • установить или снять IO_MUX_GPIOX_FUN_WPU и IO_MUX_GPIOX_FUN_WPD, чтобы включить или отключить подтягивающие и отводящие резисторы.
  • Пример: подключение контакта I2S_MCLK_in, индекс сигнала 12 к GPIO7 (MTDO), будет выглядеть следующим образом:

  • установить значение GPIO_SIG12_IN_SEL в регистре GPIO_FUNC12_IN_SEL_CFG_REG, чтобы разрешить ввод периферийного сигнала через матрицу GPIO.
  • установить значение GPIO_FUNC12_IN_SEL в регистре GPIO_FUNC12_IN_SEL_CFG_REG равным 7.
  • установить IO_MUX_GPIO7_FUN_IE в регистре IO_MUX_GPIO7_REG, чтобы разрешить ввод пинов.
  • 13.2.5 Вывод данных из периферийных устройств через GPIO матрицу

    Для вывода сигнала Y из периферийного устройства в порт X GPIO, а затем в IO MUX и далее на внешний контакт нужно выполнить следующие действия.

  • Сконфигурировать регистры GPIO_FUNCX_OUT_SEL_CFG_REG и GPIO_ENABLE_REG[X], соответствующие конкретному выводу GPIO в матрице GPIO (рекомендуется использовать регистры W1TS (запись 1 для установки) и W1TC (запись 1 для сброса) для установки или сброса GPIO_ENABLE_REG.
  • установить поле GPIO_FUNCX_OUT_SEL в регистре GPIO_FUNCX_OUT_SEL_CFG_REG на индекс нужного периферийного выходного сигнала Y.
  • если сигнал должен быть всегда включен как выходной, нужно установить бит GPIO_FUNCX_OEN_SEL в регистре GPIO_FUNCX_OUT_SEL_CFG_REG и бит в регистре GPIO_ENABLE_W1TS_REG, соответствующий выводу GPIO X. Чтобы сигнал разрешения выхода определялся внутренней логикой.
  • установить соответствующий бит в регистре GPIO_ENABLE_W1TC_REG, чтобы отключить выходной сигнал с контакта GPIO вывод.
  • Для выхода с открытым стоком установить бит GPIO_PINX_PAD_DRIVER в регистре GPIO_PINX_REG, соответствующем выводу GPIO X.
  • Настроить регистр IO MUX для включения выхода через матрицу GPIO. Установить IO_MUX_GPIOX_REG, соответствующий выводу GPIO X, следующим образом:
  • Установите в поле IO_MUX_GPIOX_MCU_SEL желаемую функцию IO MUX, соответствующую выводу GPIO X. Эта функция GPIO должна иметь числовое значение 1, для всех выводов.
  • Установите в поле IO_MUX_GPIOX_FUN_DRV требуемое значение силы тока выходного сигнала (0 ~ 3). Чем выше числовое значение, тем больший ток может быть получен от внешнего контакта. При настройках следует ориентироваться на следующие значения
  • 0: ~5 мА
  • 1: ~10 мА
  • 2: ~20 мА (значение по умолчанию)
  • 3: ~40 мА
  • Если используется режим открытого стока, следует установить/очистить биты IO_MUX_GPIOX_FUN_WPU и IO_MUX_GPIOX_FUN_WPD для включения/выключения внутренних подтягивающих/отключающих резисторов.

    13.2.6 Прямой ввод и вывод через IO MUX

    Некоторые высокоскоростные сигналы (SPI и JTAG) могут обходить матрицу GPIO для улучшения высокочастотных цифровых характеристик. В этом случае IO MUX используется для прямого подключения этих выводов к периферийным устройствам.

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

    Для обхода матрицы GPIO для входных периферийных сигналов необходимо настроить два регистра:

  • IO_MUX_GPIOn_MCU_SEL для пина GPIO должен быть установлен на требуемую функцию пина. Список функций контактов функций см. в разделе 5.12.
  • Снять значение GPIO_SIGn_IN_SEL, чтобы направить входной сигнал непосредственно на периферийное устройство.
  • Чтобы обойти матрицу GPIO для выходных сигналов периферийного устройства, IO_MUX_GPIOn_MCU_SEL для пина GPIO должен быть установлен на требуемую функцию пина.

    13.2.7 Аналоговые функции выводов GPIO

    Некоторые выводы GPIO в ESP32-C3 обеспечивают аналоговые функции. Если вывод используется для аналоговых целей, необходимо отключить подтягивающие и понижающие резисторы, выполнив следующие действия:

  • Установить IO_MUX_GPIOn_MCU_SEL в 1, и очистить IO_MUX_GPIOn_FUN_IE, IO_MUX_GPIOn_FUN_WPU, IO_MUX_GPIOn_FUN_WPD.
  • Записать 1 в GPIO_ENABLE_W1TC[n], чтобы снять разрешение на вывод.
  • Настройка регистров осуществляется с использованием функций API. При выполнении работы будут использованы следующие функции:

  • gpio_reset_pin (gpio_num_t gpio_num) сбрасывает настройки пина gpio_num к стандартным (если на этом пине есть возможность подключения к разным периферийным устройствам, то выбрана функция GPIO, подключено подтягивание, отключен ввод и вывод). Её необходимо использовать перед настройкой.
  • gpio_set_direction (gpio_num_t gpio_num, gpio_mode_t mode) устанавливает на пин gpio_num режим работы mode. Доступные режимы:
  • GPIO_MODE_DEF_DISABLE - ввод и вывод отключены;
  • GPIO_MODE_DEF_INPUT - только ввод;
  • GPIO_MODE_DEF_OUTPUT - только вывод;
  • GPIO_MODE_DEF_OD - выход с открытым коллектором.
  • Режимы можно комбинировать, например, режим, заданный как (GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT), разрешает чтение и запись.
  • gpio_set_level (gpio_num_t gpio_num, uint32_t level) устанавливает заданный уровень level на выход пина gpio_num. Уровень может принимать значения 0(low) или 1(high).
  • vTaskDelay (500/portTICK_PERIOD_MS) откладывает выполнение программы на заданное количество тиков. Для перевода значения в миллисекунды его нужно разделить на константу portTICK_PERIOD_MS.
  • 13.3 Задания на лабораторную работу

    Подготовить программу, обеспечивающую управление светодиодами в соответствии с заданным вариантом.

  • Обеспечить включение/выключение двух диодов в противофазе с частотой 1 Гц.
  • Обеспечить включение светодиода с изменяющейся частотой от 1 Гц до 50 Гц с равномерным шагом 5 Гц.
  • Обеспечить включение светодиода с постоянной частотой 50 Гц с равномерным шагом и изменяющейся от 20% до 80% скважностью.
  • 13.3.1 Описание последовательности выполнения работы

  • Установить среду проектирования в соответствии с рекомендациями раздела "Подготовка среды проектирования".
  • Открыть шаблон проекта командой Open Folder. В качестве шаблона для первого проекта можно использовать проект Sample_project, находящийся в каталоге esp\ esp-idf\examples\get-started\
  • Подготовить текст основной программы в соответствии с заданием, используя шаблон, реализующий мигание светодиода и приведенный в п. 13.3.2.
  • 13.3.2 Пример выполнения задания на защиту

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "driver/gpio.h"
    #include "led_strip.h"
    #define LED1 12
    static uint8_t s_led_state;
    static void blink_led(void)
    {
        gpio_set_level(LED1, s_led_state);
    }
    static void configure_led(void)
    {
        gpio_reset_pin(LED1);
        gpio_set_direction(LED1, GPIO_MODE_OUTPUT);
    }
    void app_main(void)
    {
        s_led_state = 0;
        configure_led();
        while (1) {
            blink_led();
            s_led_state = !s_led_state;
            vTaskDelay(500/portTICK_PERIOD_MS);
        }
    }
    

    13.4 Вопросы для контроля

  • Какие существуют варианты коммутации выходов периферийных устройств с внешними контактами?
  • Как осуществляется настройка внешних контактов для реализации альтернативных функций?
  • Какие режимы доступны для внешних контактов микросхемы, как их можно изменять?
  • Страницы:

    13.1 Цели и задачи

    Цель работы - изучить порядок работы со средой создания программного обеспечения, освоить правила настройки портов ввода-вывода микроконтроллера ESP32-C3. Задачи:

  • Изучить архитектуру микроконтроллера ESP32-C3
  • Освоить работу с среде VSCode для разработки микроконтроллерных приложений.
  • Разработать программу для управления контактами GPIO.
  • Презентация к блоку "Микроконтроллеры RISC-V"

    13.2 Основные теоретические сведения о работе с микроконтроллерами для RISC-V

    В настоящее время на рынке представлены микросхемы микроконтроллеров с архитектурой RISC-V различных производителей, например, 32 разрядные контроллеры SweRV Core (Western Digital); FE310 (SiFive); RV32M1 (NXP); MHS001 Huangshan (HUAMI); GD32VF103 (GigaDevice); CH32V103 (WCH); К1986ВК025 (Миландр); ESP32-C3 (Espressif); MIK32 (Микрон).

    Перечисленные ядра, исполняющее инструкции RISC-V, разных производителей отличаются: глубиной конвейера, размерами и организацией кэша данных и команд, реализацией схем предсказаний переходов. При этом все ядра используют общую ISA (Instruction Set Architecture).

    Описание использованного ядра RISC-V

    Предлагаемый практикум ориентирован на работу с микроконтроллером ESP-RISC-V (ESP32-C3) компании Espressif Systems. Архитектура микроконтроллера показана на Рис. 13.1.

    CPU and Memory. Процессорное ядро ESP-RISC-V представляет собой 32-разрядное ядро, основанное на RISC-V ISA, называемой "I" с префиксом RV32 или RV64 в зависимости от ширины целочисленного регистра. Эта базовая ISA реализует целочисленные вычислительные инструкции, целочисленные инструкции загрузки, сохранения и управления и является обязательной для всех реализаций RISC-V. Кроме того в ядре реализованы стандартные расширения: инструкций целочисленного умножения и деления ("M") и расширение набора сжатых инструкций стандарта RISC-V ("C"). Для реализации операций умножения и деления предусмотрены соответствующие 32-битные модули. Ядро имеет 4-х ступенчатый скалярный конвейер, оптимизированный по площади, мощности и производительности и поддерживающий тактовую частоту до 160 МГц. В состав процессорного ядра входят контроллер прерываний (INTC), обеспечивающий обработку 32 векторизованных прерываний с семью уровнями приоритета; модуль отладки (JTAG); и системная шина (SYS BUS) для доступа к памяти и периферийным устройствам.

    (рис 13.1) Архитектура микроконтроллера ESP-RISC-V (ESP32-C3)

    Внутренняя память ESP32-C3 разделена на три сегмента: внутреннее ПЗУ (384 КБ), внутренняя SRAM (400 КБ) и Real Time Clock (RTC) FAST Memory (8 КБ).

  • Внутреннее ПЗУ (384 КБ). ПЗУ содержит программные инструкции и некоторые данные низкоуровневых системных программ.
  • Внутренняя память SRAM (400 КБ). Внутреннее статическое ОЗУ- это энергозависимая память, к которой процессор может быстро получить доступ в течение одного такта работы. Часть SRAM может быть настроена на работу в качестве кэша для доступа к внешней памяти. Доступ к некоторым частям SRAM возможен только через шину инструкций процессор, а к некоторым можно обращаться как через шину команд процессора, так и через шину данных процессора.
  • Память RTC (Real Time Clock). RTC реализована в виде статического ОЗУ (SRAM), поэтому является волатильной, однако устойчивой в глубоком сне. RTC FAST Memory (8 КБ): к памяти RTC FAST может обращаться только центральный процессор, и она обычно используется для хранения инструкций и данных, которые должны сохраняться во время глубокого сна.
  • Внутри каждого сегмента могут существовать различные ограничения доступа к шине (например, некоторые части сегмента могут быть доступны только по шине данных процессора), поэтому каждый сегмент также дополнительно делится на части. Части внутренней памяти и диапазоны их адресов на шине данных и/или шине команд приведены в Таблице 13.1.

    Части внутренней памяти и диапазоны их адресов на шине данных и/или шине команд
    Тип шины Границы адресов Размер Применение
    Младший адрес Старший адрес
    Data bus 0x3FF0_0000 0x3FF1_FFFF 128 Internal ROM 0
    0x3FC8_0000 0x3FCD_FFFF 384 Internal SRAM
    Instruction bus 0x4000_0000 0x4003_FFFF 256 Internal ROM
    0x4004_0000 0x4005_FFFF 128 Internal ROM 1
    0x4037_C000 0x4037_FFFF 16 Internal SRAM 0
    0x4038_0000 0x403D_FFFF 384 Internal SRAM 1
    Data/Instruction bus 0x5000_0000 0x5000_1FFF 8 RTC FAST Memory

    Общая структура и разделение адресов памяти показаны на Рис. 13.2.

    Кэш-память (Cache), доступная только для чтения, представляет собой восьмистороннюю ассоциативную память, ее размер составляет 16 КБ, размер блока - 32 байта. Когда кэш активен, он занимает часть пространства внутренней памяти. Кэш единый для инструкций и данных, но одновременно может реализовывать кеширование либо инструкций, либо данных. При возникновении промаха кэш-памяти контроллер кэша инициирует запрос к внешней памяти по отношению к ядру памяти.

    Обращение процессора к внешней памяти через кэш показано на Рис. 13.2. В соответствии с настройками MMU (блок управления памятью) кэш сопоставляет адрес процессора с физическим адресом внешней памяти. Благодаря такому сопоставлению адресов ESP32-C3 может адресовать до 16 МБ внешней флэш-памяти.

    Блок Peripherals содержит следующие модули:

  • GDMA (General Direct Memory Access) - общий контроллер прямого доступа к памяти, он обеспечивает передачу данных от периферийных устройств в память без участия центрального процессора, что позволяет снизить нагрузку на ЦП.
  • ESP32-C3 имеет 22 вывода GPIO, которым можно назначить различные функции путем конфигурирования соответствующих регистров. Некоторые GPIO могут использоваться для аналоговых функций, например, для подключения входного сигнала АЦП. Все GPIO имеют возможность выбора внутреннего подтягивания или отвода, или могут быть установлены в высокоимпедансное состояние. Когда GPIO сконфигурированы как входные, входное значение может быть считано программно через регистр. Входные GPIO также могут быть настроены для генерации прерываний процессора по фронту или по уровню. Все цифровые выводы ввода-вывода являются двунаправленными, неинвертирующими и трехпозиционными, включая входные и выходные буферы с трехпозиционным управлением. Эти выводы могут быть мультиплексированы с другими функциями, такими как UART, SPI и т.д. Для работы с низким энергопотреблением GPIO могут быть переведены в состояние удержания. Для маршрутизации сигналов от периферийных устройств к выводам GPIO используются IO MUX и матрица GPIO, обеспечивая высококонфигурируемый ввод/вывод.
  • (рис 13.2) Распределение адресного пространства ESP32-C3

    В кристалле реализованы контроллеры последовательных интерфейсов.

    SPI (Serial Peripheral Interface) - синхронный последовательный интерфейс, используемый для связи с внешними периферийными устройствами. В ESP32-C3 интегрированы три контроллера SPI: SPI0, SPI1, предназначенные в основном для внутреннего использования и SPI2 (GP-SPI2 или General Purpose SPI2), обладающий широкими возможностями коммуникации. На рис. 13.3 показаны варианты организации обмена данными с устройствами SPI.

    (рис 13.3) Подключение SPI контроллеров ESP32-C3

    ESP32-C3 имеет два контроллера универсального асинхронного приемника/передатчика UART: UART0 и UART1, контроллер интерфейса I2S и шины I2C (Inter-Integrated Circuit). Для автомобильных и промышленных приложений в кристалл ESP32-C3 встроен двухпроводной автомобильный контроллер TWAI®. Для программирования флэш-памяти системы, для чтения выходных данных программы, а также для подключения отладчика в кристалле ESP32-C3 встроен контроллер USB Serial/JTAG, объединяющий функциональность USB-последовательного преобразователя и адаптера USB-to-JTAG, что исключает необходимость внешних адаптеров. В кристалле имеется устройство дистанционного управления RMT (Remote Control Peripheral), поддерживающее два канала инфракрасной дистанционной передачи и два канала инфракрасного дистанционного приема.

    Для обработки аналоговых сигналов в микроконтроллере предусмотрены два 12-битных аналого-цифровых преобразователя ADC (Analog-to-Digital Converter) последовательного приближения (SAR ADC), которые могут обрабатывать аналоговые сигналы с шести выводов.

    ШИМ-контроллер LED LED PWM может генерировать независимые цифровые сигналы по шести каналам. ШИМ контроллер используется для управления свечением светодиодов, при котором при котором длительность единичного широтно-импульсно-модулированного сигнала определяет яркость свечения за счет мерцания. Контроллер может генерировать цифровые сигналы с настраиваемыми периодами и рабочим циклом с точностью до 18 бит, поддерживая плавное увеличение или уменьшение рабочего цикла. При этом можно использовать несколько источников синхронизации, включая внешний кристалл. Контроллер может работать даже тогда, когда процессор находится в спящем режиме.

    Температурный датчик (Temperature Sensor) предназначен для определения температуры внутри микросхемы. Температура определяется такими факторами, как тактовая частота микроконтроллера или нагрузка на входы/выходы. Выходной сигнал датчика представляет собой напряжение, которое преобразуется АЦП в цифровое значение.

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

    Блок Security содержит модули, реализующие защиту: контроль разрешений на доступ к внутренней и внешней памяти; модули шифрования и дешифрования памяти; средства криптографического аппаратного ускорения, реализованные на алгоритме симметричного шифрования AES (Advanced Encryption Standard), алгоритме безопасного хеширования SHA (Secure Hash Algorithm ) и криптографическом алгоритме с открытым ключом RSA (Rivest, Shamir и Adleman), генератор случайных чисел RNG (Random Number Generator) и средства проверки подлинности сообщений, использующий односторонние хеш-функции HMAC (Hash-based Message Authentication Code).

    Блок Wireless digital circuit содержит следующие модули, обеспечивающие передачу данных по радиоканалам. Приемник 2,4 ГГц, демодулирующий радиочастотный сигнал 2,4 ГГц в квадратурные сигналы базовой полосы и преобразующий их в цифровую форму с помощью двух высокоскоростных АЦП высокого разрешения. В приемник интегрированы ВЧ-фильтры, средства автоматической регулировки усиления сигнала, схемы подавления смещения по постоянному току и фильтры базовой полосы. Передатчик 2,4 ГГц модулирующий квадратурные сигналы базовой полосы в радиочастотный сигнал 2,4 ГГц и управляющий антенной с помощью мощных фильтров. Встроенные средства цифровой калибровки дополнительно улучшают линейность усилителя мощности. Тактовый генератор, вырабатывающий квадратурные тактовые сигналы 2,4 ГГц как для приемника, так и для передатчика.

    Модуль Wi-Fi MAC реализует полный MAC-протокол Wi-Fi 802.11 b/g/n, поддерживая базовый набор услуг (BSS) STA и SoftAP под управлением функции распределенного управления.

    Модуль Bluetooth поддерживает оба существующих протокола: классический с базовой скоростью и повышенной скоростью передачи данных Bluetooth 4.2 BR/EDR (Basic Rate / Enhanced Data Rate) и Bluetooth LE (Low Energy) с низким энергопотреблением. Для подключения и настройки радиомодулей используются функции API Wi-Fi, предоставляемые производителем микроконтроллера.

    13.2.1 Описание платы прототипирования CORE ESP32

    Для выполнения макетных экспериментов используется плата CORE ESP32, разработанная на основе Espressif Systems ESP32-C3. Основная плата поддерживает UART, GPIO, SPI, I2C, ADC, PWM и другие интерфейсы, которые можно выбрать и настраивать в соответствии с решаемой задачей. Описание внешних контактов платы приведено на рис. 13.4.

    (рис 13.4) Отладочная плата Core-ESP32

    Питание платы CORE-ESP32-C3 можно обеспечить следующими способами:

  • источник питания интерфейса USB Type-C, этот способ используется по умолчанию и предпочтителен во время отладки;
  • блок питания с контактами 5 В и GND;
  • блок питания с контактами 3V3 и GND.
  • На плате CORE ESP32 установлены:

  • 2 светодиода, контакты для подключения к ним показаны в таблице 13.2.
  • две кнопки: кнопка BOOT может реализовать функцию загрузки BOOT, кнопка RST может реализовать функцию сброса, контакты для подключения к кнопкам показаны в таблице 13.3.
  • Индикация платы
    Cветодиод GPIO Описание
    D4 IO12 Активный высокий уровень
    D5 IO13 Активный высокий уровень
    Кнопки платы
    Кнопка Функция контакта Описание
    BOOT /GPIO9 При нажатии кнопки микроконтроллер переходит в режим загрузки Активный низкий уровень
    RST При нажатии кнопки происходит сброс микроконтроллера Активный низкий уровень

    При работе с платой необходимо учитывать следующие особенности:

  • BOOT (IO09) Нельзя допустить подачу на контакт IO09 нуля до включения питания, микроконтроллер перейдет в режим загрузки.
  • Для проектирования используйте вывод IO08, а прямое внешнее подключение не рекомендуется, поскольку при загрузке и записи на выводе IO08 низкий уровень, а последовательный порт нельзя использовать для загрузки.
  • При написании собственного программного обеспечения следует обратить внимание на режим флэш-памяти. Существуют следующие режимы:
  • DIO - хост SPI использует технологию "быстрого чтения двойного ввода-вывода". Два контакта SPI используются для записи части адреса флэш-памяти и для чтения данных флэш-памяти: требуется вдвое меньше тактов по сравнению со стандартным SPI.
  • DOUT - хост SPI использует "быстрое чтение с двумя выходами". Два контакта SPI используются для чтения данных флэш-памяти. Немного медленнее, чем DIO, поскольку адрес записывается через один вывод данных MOSI (Master Out Slave In).
  • QIO - хост SPI использует технологию "Quad I/O Fast Read". Четыре контакта SPI используются для записи части адреса флэш-памяти и для чтения данных флэш-памяти: этим фазам требуется четверть тактового цикла по сравнению со стандартным SPI.
  • QOUT - хост SPI использует функцию быстрого чтения с четырьмя выходами. Четыре контакта SPI используются для считывания данных флэш-памяти. Немного медленнее, чем QIO, поскольку адрес записывается через один вывод данных MOSI.
  • При настройке флэш-памяти QIO сигналы SPI SPIHD (IO12) и SPIWP (IO13) мультиплексируются. Чтобы увеличить количество доступных GPIO, плата разработки выбирает режим DIO с использованием 2-проводного SPI и в этом случае контакты IO12 и IO13 не подключены к флэш-памяти.
  • Сигнал VDD внешней флэш-памяти SPI подключен к системе питания 3,3 В. Во время использования не требуется настраивать другие источники питания. Применяется общий 2-проводной режим связи SPI.
  • По умолчанию контакт VDD флэш-памяти SPI подключен к GPIO11, и для его использования в качестве GPIO необходимо выполнить его перенастройку.
  • 13.2.2 Подготовка среды проектирования

    Для проектирования под выбранный микроконтроллер необходимо иметь следующие инструменты:

  • инструментарий для компиляции кода для ESP32;
  • инструменты сборки проектов (CMake и Ninja) для создания полноценного приложения для ESP32;
  • среду проектирования ESP-IDF, которая содержит API (библиотеки программного обеспечения и исходный код) для ESP32 и сценарии для работы с набором инструментов разработки.
  • В качестве сред разработки можно использовать среду на основе Eclipse или VSCode (Visual Studio Code) с соответствующими расширениями. В текущей работе будет использован VSCode, для подготовки среды необходимо выполнить его установку, воспользовавшись ссылкой. После установки VSCode необходимо активизировать расширение ESP-IDF для работы с микроконтроллером. По указанной ссылке находится подробная инструкция по установке расширения Espressif IDF.

    После завершения установки рекомендуется открыть шаблон проекта командой Open Folder. В левой части окна VS Code (рис. 13.5) размещена панель управления, содержащая следующие основные элементы:

  • Проводник, позволяющий переходить между файлами проекта.
  • Поиск, реализующий поиск конкретных слов внутри документа.
  • Система управления версиями, предназначенная для взаимодействия с Git, просмотра изменений в коде и разных его версий.
  • Запуск кода, обеспечивающий запуск и проверку кода.
  • Расширения, показывающий список расширений, которые можно дополнительно установить в VS Code.
  • (рис 13.5) Рабочее окно VS Code

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

  • Указать COM порт, к которому подключается плата. Определение номера порта происходит автоматически после подключения платы к компьютеру, которое осуществляется через USB порт. После активизации команды выбора COM порта появится выпадающий список, в котором будут показаны активные устройства с последовательным подключением.
  • Указать микросхему, в которую осуществляется загрузка проекта, выбрав в выпадающем списке ESP32C3. Также указать способ загрузки, как показано на рис. 13.6.
  • Выполнить сборку и загрузку проекта и запустить монитор для наблюдения результатов работы. Эти операции можно запускать соответствующими командами, закрепленными в строке за отдельными пиктограммами, а можно запустить весь процесс одной пиктограммой, интегрирующей три команды вместе.
  • (рис 13.6) Меню выбора способа загрузки

    После загрузки проекта в плату в окне монитора можно отслеживать статус процессов сборки и загрузки, а также контролировать процесс работы программы.

    13.2.3 GPIO

    На рис. 13.7 показана общая схема работы IO MUX и матрицы GPIO.

    (рис 13.7) IO MUX и матрица GPIO

    Матрица GPIO обеспечивает переключение между входными/выходными сигналами периферийных устройств и контактами. 42 входных сигнала периферийных устройств могут быть подключены к любым выводам GPIO, также, как и любой из 78 периферийных выходных сигналов могут быть скоммутированы на любой контакт GPIO. Поддерживается синхронизация сигналов периферийных входов на основе тактовой шины APB.

    IO MUX конфигурируется через регистр IO_MUX_GPIOn_REG для каждого вывода GPIO. Контакт может быть настроен на функцию, маршрутизируемую матрицей GPIO, или подключен, минуя матрицу GPIO. Обход матрицы актуален для улучшения частоты работы высокоскоростных цифровых сигналов (SPI, JTAG, UART), поскольку в этом случае IO MUX используется для прямого подключения выводов к периферийным устройствам.

    Электрический интерфейс между логикой микросхемы и выводом GPIO показан на рис. 13.8. Схема управляется с помощью сигналов разрешения входа (IE), разрешение выхода (OE), WPU и WPD подключения подтягивающих резисторов (pull-up и pull-down). Bonding pad - точка, используемая для физического подключения от корпуса микросхемы к выводу GPIO.

    (рис 13.8) Внутренняя структура подключения к контакту микросхемы

    13.2.4 Ввод данных в периферийные устройства через GPIO матрицу

    Для считывания данных с контакта GPIO X в периферийный сигнал Y, необходимо выполнить следующие действия:

  • Настроить регистр GPIO_FUNCY_IN_SEL_CFG_REG, соответствующий периферийному сигналу Y в матрице GPIO:
  • установить GPIO_SIGY_IN_SEL, чтобы разрешить ввод периферийного сигнала через матрицу GPIO;
  • установить GPIO_FUNCX_IN_SEL на нужный вывод GPIO.
  • Некоторые периферийные сигналы не имеют действительного бита GPIO_SIGy_IN_SEL, а именно, эти периферийные устройства могут только получать входные сигналы через матрицу GPIO.

  • Дополнительно можно включить фильтр для входных сигналов, установив регистр IO_MUX_GPIOX_FILTER_EN. Фильтровать можно только сигналы длительностью более двух тактов.
  • Синхронизировать вход GPIO, установив GPIO_PINX_REG, соответствующий выводу GPIO X, следующим образом:
  • установить GPIO_PINX_SYNC1_BYPASS, чтобы разрешить входной сигнал, синхронизированный по нарастающему или по спадающему фронту;
  • установить GPIO_PINX_SYNC2_BYPASS, чтобы разрешить входной сигнал, синхронизированный по нарастающему или спадающему фронту во втором такте.
  • Настроить регистр IO MUX для включения входного сигнала внешнего контакта. Для этого установить IO_MUX_GPIOX_REG соответствующий выводу GPIO X, следующим образом:
  • установить IO_MUX_GPIOX_FUN_IE для разрешения входа;
  • установить или снять IO_MUX_GPIOX_FUN_WPU и IO_MUX_GPIOX_FUN_WPD, чтобы включить или отключить подтягивающие и отводящие резисторы.
  • Пример: подключение контакта I2S_MCLK_in, индекс сигнала 12 к GPIO7 (MTDO), будет выглядеть следующим образом:

  • установить значение GPIO_SIG12_IN_SEL в регистре GPIO_FUNC12_IN_SEL_CFG_REG, чтобы разрешить ввод периферийного сигнала через матрицу GPIO.
  • установить значение GPIO_FUNC12_IN_SEL в регистре GPIO_FUNC12_IN_SEL_CFG_REG равным 7.
  • установить IO_MUX_GPIO7_FUN_IE в регистре IO_MUX_GPIO7_REG, чтобы разрешить ввод пинов.
  • 13.2.5 Вывод данных из периферийных устройств через GPIO матрицу

    Для вывода сигнала Y из периферийного устройства в порт X GPIO, а затем в IO MUX и далее на внешний контакт нужно выполнить следующие действия.

  • Сконфигурировать регистры GPIO_FUNCX_OUT_SEL_CFG_REG и GPIO_ENABLE_REG[X], соответствующие конкретному выводу GPIO в матрице GPIO (рекомендуется использовать регистры W1TS (запись 1 для установки) и W1TC (запись 1 для сброса) для установки или сброса GPIO_ENABLE_REG.
  • установить поле GPIO_FUNCX_OUT_SEL в регистре GPIO_FUNCX_OUT_SEL_CFG_REG на индекс нужного периферийного выходного сигнала Y.
  • если сигнал должен быть всегда включен как выходной, нужно установить бит GPIO_FUNCX_OEN_SEL в регистре GPIO_FUNCX_OUT_SEL_CFG_REG и бит в регистре GPIO_ENABLE_W1TS_REG, соответствующий выводу GPIO X. Чтобы сигнал разрешения выхода определялся внутренней логикой.
  • установить соответствующий бит в регистре GPIO_ENABLE_W1TC_REG, чтобы отключить выходной сигнал с контакта GPIO вывод.
  • Для выхода с открытым стоком установить бит GPIO_PINX_PAD_DRIVER в регистре GPIO_PINX_REG, соответствующем выводу GPIO X.
  • Настроить регистр IO MUX для включения выхода через матрицу GPIO. Установить IO_MUX_GPIOX_REG, соответствующий выводу GPIO X, следующим образом:
  • Установите в поле IO_MUX_GPIOX_MCU_SEL желаемую функцию IO MUX, соответствующую выводу GPIO X. Эта функция GPIO должна иметь числовое значение 1, для всех выводов.
  • Установите в поле IO_MUX_GPIOX_FUN_DRV требуемое значение силы тока выходного сигнала (0 ~ 3). Чем выше числовое значение, тем больший ток может быть получен от внешнего контакта. При настройках следует ориентироваться на следующие значения
  • 0: ~5 мА
  • 1: ~10 мА
  • 2: ~20 мА (значение по умолчанию)
  • 3: ~40 мА
  • Если используется режим открытого стока, следует установить/очистить биты IO_MUX_GPIOX_FUN_WPU и IO_MUX_GPIOX_FUN_WPD для включения/выключения внутренних подтягивающих/отключающих резисторов.

    13.2.6 Прямой ввод и вывод через IO MUX

    Некоторые высокоскоростные сигналы (SPI и JTAG) могут обходить матрицу GPIO для улучшения высокочастотных цифровых характеристик. В этом случае IO MUX используется для прямого подключения этих выводов к периферийным устройствам.

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

    Для обхода матрицы GPIO для входных периферийных сигналов необходимо настроить два регистра:

  • IO_MUX_GPIOn_MCU_SEL для пина GPIO должен быть установлен на требуемую функцию пина. Список функций контактов функций см. в разделе 5.12.
  • Снять значение GPIO_SIGn_IN_SEL, чтобы направить входной сигнал непосредственно на периферийное устройство.
  • Чтобы обойти матрицу GPIO для выходных сигналов периферийного устройства, IO_MUX_GPIOn_MCU_SEL для пина GPIO должен быть установлен на требуемую функцию пина.

    13.2.7 Аналоговые функции выводов GPIO

    Некоторые выводы GPIO в ESP32-C3 обеспечивают аналоговые функции. Если вывод используется для аналоговых целей, необходимо отключить подтягивающие и понижающие резисторы, выполнив следующие действия:

  • Установить IO_MUX_GPIOn_MCU_SEL в 1, и очистить IO_MUX_GPIOn_FUN_IE, IO_MUX_GPIOn_FUN_WPU, IO_MUX_GPIOn_FUN_WPD.
  • Записать 1 в GPIO_ENABLE_W1TC[n], чтобы снять разрешение на вывод.
  • Настройка регистров осуществляется с использованием функций API. При выполнении работы будут использованы следующие функции:

  • gpio_reset_pin (gpio_num_t gpio_num) сбрасывает настройки пина gpio_num к стандартным (если на этом пине есть возможность подключения к разным периферийным устройствам, то выбрана функция GPIO, подключено подтягивание, отключен ввод и вывод). Её необходимо использовать перед настройкой.
  • gpio_set_direction (gpio_num_t gpio_num, gpio_mode_t mode) устанавливает на пин gpio_num режим работы mode. Доступные режимы:
  • GPIO_MODE_DEF_DISABLE - ввод и вывод отключены;
  • GPIO_MODE_DEF_INPUT - только ввод;
  • GPIO_MODE_DEF_OUTPUT - только вывод;
  • GPIO_MODE_DEF_OD - выход с открытым коллектором.
  • Режимы можно комбинировать, например, режим, заданный как (GPIO_MODE_DEF_INPUT) | (GPIO_MODE_DEF_OUTPUT), разрешает чтение и запись.
  • gpio_set_level (gpio_num_t gpio_num, uint32_t level) устанавливает заданный уровень level на выход пина gpio_num. Уровень может принимать значения 0(low) или 1(high).
  • vTaskDelay (500/portTICK_PERIOD_MS) откладывает выполнение программы на заданное количество тиков. Для перевода значения в миллисекунды его нужно разделить на константу portTICK_PERIOD_MS.
  • 13.3 Задания на лабораторную работу

    Подготовить программу, обеспечивающую управление светодиодами в соответствии с заданным вариантом.

  • Обеспечить включение/выключение двух диодов в противофазе с частотой 1 Гц.
  • Обеспечить включение светодиода с изменяющейся частотой от 1 Гц до 50 Гц с равномерным шагом 5 Гц.
  • Обеспечить включение светодиода с постоянной частотой 50 Гц с равномерным шагом и изменяющейся от 20% до 80% скважностью.
  • 13.3.1 Описание последовательности выполнения работы

  • Установить среду проектирования в соответствии с рекомендациями раздела "Подготовка среды проектирования".
  • Открыть шаблон проекта командой Open Folder. В качестве шаблона для первого проекта можно использовать проект Sample_project, находящийся в каталоге esp\ esp-idf\examples\get-started\
  • Подготовить текст основной программы в соответствии с заданием, используя шаблон, реализующий мигание светодиода и приведенный в п. 13.3.2.
  • 13.3.2 Пример выполнения задания на защиту

    #include <stdio.h>
    #include "freertos/FreeRTOS.h"
    #include "freertos/task.h"
    #include "driver/gpio.h"
    #include "led_strip.h"
    #define LED1 12
    static uint8_t s_led_state;
    static void blink_led(void)
    {
        gpio_set_level(LED1, s_led_state);
    }
    static void configure_led(void)
    {
        gpio_reset_pin(LED1);
        gpio_set_direction(LED1, GPIO_MODE_OUTPUT);
    }
    void app_main(void)
    {
        s_led_state = 0;
        configure_led();
        while (1) {
            blink_led();
            s_led_state = !s_led_state;
            vTaskDelay(500/portTICK_PERIOD_MS);
        }
    }
    

    13.4 Вопросы для контроля

  • Какие существуют варианты коммутации выходов периферийных устройств с внешними контактами?
  • Как осуществляется настройка внешних контактов для реализации альтернативных функций?
  • Какие режимы доступны для внешних контактов микросхемы, как их можно изменять?
  • Вернуться к учебному плану