Опубликован: 19.01.2025 | Доступ: свободный | Студентов: 0 / 0 | Длительность: 05:57:00
Лекция 14:

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

< Лекция 13 || Лекция 14: 123 || Лекция 15 >

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

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

  1. Сконфигурировать регистры 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 вывод.
  2. Для выхода с открытым стоком установить бит GPIO_PINX_PAD_DRIVER в регистре GPIO_PINX_REG, соответствующем выводу GPIO X.
  3. Настроить регистр 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 для входных периферийных сигналов необходимо настроить два регистра:

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

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

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

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

  1. Установить IO_MUX_GPIOn_MCU_SEL в 1, и очистить IO_MUX_GPIOn_FUN_IE, IO_MUX_GPIOn_FUN_WPU, IO_MUX_GPIOn_FUN_WPD.
  2. Записать 1 в GPIO_ENABLE_W1TC[n], чтобы снять разрешение на вывод.

Настройка регистров осуществляется с использованием функций API. При выполнении работы будут использованы следующие функции:

  1. gpio_reset_pin (gpio_num_t gpio_num) сбрасывает настройки пина gpio_num к стандартным (если на этом пине есть возможность подключения к разным периферийным устройствам, то выбрана функция GPIO, подключено подтягивание, отключен ввод и вывод). Её необходимо использовать перед настройкой.
  2. 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), разрешает чтение и запись.
  3. gpio_set_level (gpio_num_t gpio_num, uint32_t level) устанавливает заданный уровень level на выход пина gpio_num. Уровень может принимать значения 0(low) или 1(high).
  4. vTaskDelay (500/portTICK_PERIOD_MS) откладывает выполнение программы на заданное количество тиков. Для перевода значения в миллисекунды его нужно разделить на константу portTICK_PERIOD_MS.

13.3 Задания на лабораторную работу

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

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

13.3.1 Описание последовательности выполнения работы

  1. Установить среду проектирования в соответствии с рекомендациями раздела "Подготовка среды проектирования".
  2. Открыть шаблон проекта командой Open Folder. В качестве шаблона для первого проекта можно использовать проект Sample_project, находящийся в каталоге esp\ esp-idf\examples\get-started\
  3. Подготовить текст основной программы в соответствии с заданием, используя шаблон, реализующий мигание светодиода и приведенный в п. 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 Вопросы для контроля

  1. Какие существуют варианты коммутации выходов периферийных устройств с внешними контактами?
  2. Как осуществляется настройка внешних контактов для реализации альтернативных функций?
  3. Какие режимы доступны для внешних контактов микросхемы, как их можно изменять?
< Лекция 13 || Лекция 14: 123 || Лекция 15 >