Перейти к содержанию

Регистры LEDC ESP32-S3

Регистры LEDC ESP32-S3: восемь каналов ШИМ и четыре таймера с дробным 18-битным делителем, разрядность до 14 бит, скважность с четырьмя дробными битами, аппаратное плавное изменение яркости и прерывания переполнения.

LEDC по адресу 0x6001 9000 — генератор ШИМ для яркости светодиодов, сервоприводов и звука. Каждый из восьми каналов берёт счётчик одного из четырёх таймеров (поле TIMER_SEL_CHn) и ставит выход в 1, когда счётчик равен HPOINT_CHn, и в 0 — когда равен HPOINT_CHn + DUTY_CHn[18:4]. Тактирование блока включает бит SYSTEM_LEDC_CLK_EN регистра SYSTEM_PERIP_CLK_EN0_REG.

Таймеры тактируются общим LEDC_CLK — APB_CLK, RC_FAST_CLK или XTAL_CLK по полю APB_CLK_SEL регистра LEDC_CONF_REG (1, 2 и 3). Делитель CLK_DIV_TIMERx дробный: биты 21:12 регистра — целая часть A, биты 11:4 — дробь B, делитель = A + B / 256. Частота ШИМ = f_LEDC_CLK / (делитель · 2^DUTY_RES).

Новые значения HPOINT, DUTY, TIMER_SEL, SIG_OUT_EN и настройки плавного изменения канала применяются после записи 1 в PARA_UP_CHn, делителя и разрядности таймера — после записи 1 в TIMERx_PARA_UP; оба бита сбрасываются сами (раздел 35.3 TRM).

ЭкземплярБазовый адрес
LEDC0x6001 9000

Пример на C

Канал 0: новая скважность 50 % при 13 битах (soc/ledc_reg.h). Макросы доступа REG_WRITE, REG_READ, REG_SET_BIT, REG_CLR_BIT, REG_GET_BIT, REG_SET_FIELD и REG_GET_FIELD объявлены в soc/soc.h ESP-IDF; поле задаётся именем макроса без суффикса, маска и сдвиг берутся из его вариантов _V и _S.

#include "soc/ledc_reg.h"

uint32_t duty = 1 << 12;                                      // 4096 из 8192
REG_WRITE(LEDC_LSCH0_DUTY_REG, duty << 4);                    // 4 дробных бита
REG_SET_BIT(LEDC_LSCH0_CONF0_REG, LEDC_PARA_UP_LSCH0);        // обновить настройки канала

Регистры блока

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
LEDC_LSCHn_CONF0_REG0x0000 + n · 0x0014Канал n: таймер, выход, обновление настроек, счёт периодов0x0000 0000
LEDC_LSCHn_HPOINT_REG0x0004 + n · 0x0014Канал n: значение счётчика, при котором выход ставится в 10x0000 0000
LEDC_LSCHn_DUTY_REG0x0008 + n · 0x0014Канал n: скважность0x0000 0000
LEDC_LSCHn_CONF1_REG0x000C + n · 0x0014Канал n: плавное изменение скважности0x4000 0000
LEDC_LSCHn_DUTY_R_REG0x0010 + n · 0x0014Канал n: текущая скважность0x0000 0000
LEDC_LSTIMERn_CONF_REG0x00A0 + n · 0x0008Таймер n: делитель, разрядность, сброс и пауза0x0080 0000
LEDC_LSTIMERn_VALUE_REG0x00A4 + n · 0x0008Таймер n: текущее значение счётчика0x0000 0000
LEDC_INT_RAW_REG0x00C0Необработанные флаги прерываний0x0000 0000
LEDC_INT_ST_REG0x00C4Флаги прерываний после маски разрешения0x0000 0000
LEDC_INT_ENA_REG0x00C8Разрешение прерываний0x0000 0000
LEDC_INT_CLR_REG0x00CCСброс флагов прерываний записью 10x0000 0000
LEDC_CONF_REG0x00D0Источник такта LEDC0x0000 0000
LEDC_DATE_REG0x00FCВерсия блока: дата ревизии аппаратуры0x1907 2601

Доступ — обозначения TRM: R/W — чтение и запись, RO — только чтение, WO — только запись, WT — запись 1 запускает действие, SS и SC — бит ставится и сбрасывается аппаратно, WTC — сбрасывается записью 1.

LEDC_LSCHn_CONF0_REG — канал n: таймер, выход, обновление настроек, счёт периодов

8 копий, n = 0…7: смещение 0x0000 + n · 0x0014, после сброса 0x0000 0000. TRM: регистр 35.1.

31302928272625242322212019181716
—OVF_CNT_RESET_ST_CHnOVF_CNT_RESET_CHn
1514131211109876543210
OVF_CNT_EN_CHnOVF_NUM_CHnPARA_UP_CHnIDLE_LV_CHnSIG_OUT_EN_CHnTIMER_SEL_CHn
ПолеБитыДоступСбросНазначение
OVF_CNT_RESET_ST_CHn17RO0Состояние сброса счётчика периодов
OVF_CNT_RESET_CHn16WO0Запись 1 сбрасывает счётчик переполнений канала
OVF_CNT_EN_CHn15R/W01 — считать переполнения таймера
OVF_NUM_CHn14:5R/W0x000Прерывание OVF_CNT после OVF_NUM_CHn + 1 переполнений
PARA_UP_CHn4WO0Запись 1 применяет HPOINT, DUTY, TIMER_SEL, SIG_OUT_EN и плавное изменение
IDLE_LV_CHn3R/W0Уровень выхода, когда SIG_OUT_EN_CHn = 0
SIG_OUT_EN_CHn2R/W01 — включить выход канала
TIMER_SEL_CHn1:0R/W0x0Таймер канала: 0…3

LEDC_LSCHn_HPOINT_REG — канал n: значение счётчика, при котором выход ставится в 1

8 копий, n = 0…7: смещение 0x0004 + n · 0x0014, после сброса 0x0000 0000. TRM: регистр 35.4.

ПолеБитыДоступСбросНазначение
HPOINT_CHn13:0R/W0x0000Выход ставится в 1, когда счётчик таймера равен этому значению

LEDC_LSCHn_DUTY_REG — канал n: скважность

8 копий, n = 0…7: смещение 0x0008 + n · 0x0014, после сброса 0x0000 0000. TRM: регистр 35.5.

ПолеБитыДоступСбросНазначение
DUTY_CHn18:0R/W0x00000Биты 18:4 — длительность единицы в тактах счётчика, биты 3:0 — дробная часть: столько периодов из 16 на такт длиннее

LEDC_LSCHn_CONF1_REG — канал n: плавное изменение скважности

8 копий, n = 0…7: смещение 0x000C + n · 0x0014, после сброса 0x4000 0000. TRM: регистр 35.2.

В версии 1.6 TRM описание DUTY_START_CHn изменено: теперь это включение плавного изменения. Значение вступает в силу вместе с остальными полями канала после записи 1 в PARA_UP_CHn.

31302928272625242322212019181716
DUTY_START_CHnDUTY_INC_CHnDUTY_NUM_CHnDUTY_CYCLE_CHn
1514131211109876543210
DUTY_CYCLE_CHnDUTY_SCALE_CHn
ПолеБитыДоступСбросНазначение
DUTY_START_CHn31R/W01 — включить плавное изменение скважности
DUTY_INC_CHn30R/W1Направление плавного изменения: 1 — увеличивать, 0 — уменьшать
DUTY_NUM_CHn29:20R/W0x000Число шагов плавного изменения
DUTY_CYCLE_CHn19:10R/W0x000Шаг делается раз в столько переполнений счётчика
DUTY_SCALE_CHn9:0R/W0x000Величина одного шага

LEDC_LSCHn_DUTY_R_REG — канал n: текущая скважность

8 копий, n = 0…7: смещение 0x0010 + n · 0x0014, после сброса 0x0000 0000. TRM: регистр 35.6.

ПолеБитыДоступСбросНазначение
DUTY_R_CHn18:0RO0x00000Текущая скважность канала

LEDC_LSTIMERn_CONF_REG — таймер n: делитель, разрядность, сброс и пауза

4 копии, n = 0…3: смещение 0x00A0 + n · 0x0008, после сброса 0x0080 0000. TRM: регистр 35.7.

31302928272625242322212019181716
—TIMERn_PARA_UP—TIMERn_RSTTIMERn_PAUSECLK_DIV_TIMERn
1514131211109876543210
CLK_DIV_TIMERnTIMERn_DUTY_RES
ПолеБитыДоступСбросНазначение
TIMERn_PARA_UP25WO0Запись 1 применяет делитель и разрядность со следующего переполнения
TIMERn_RST23R/W11 — сбросить счётчик в 0 и держать
TIMERn_PAUSE22R/W01 — остановить счётчик
CLK_DIV_TIMERn21:4R/W0x00000Делитель: биты 21:12 — целая часть A, биты 11:4 — дробь B / 256
TIMERn_DUTY_RES3:0R/W0x0Разрядность: счётчик идёт до 2^DUTY_RES − 1, не больше 14 бит

LEDC_LSTIMERn_VALUE_REG — таймер n: текущее значение счётчика

4 копии, n = 0…3: смещение 0x00A4 + n · 0x0008, после сброса 0x0000 0000. TRM: регистр 35.8.

ПолеБитыДоступСбросНазначение
TIMERn_CNT13:0RO0x0000Текущее значение 14-битного счётчика

LEDC_INT_RAW_REG — необработанные флаги прерываний

Смещение 0x00C0, адрес 0x6001 90C0, после сброса 0x0000 0000. TRM: регистр 35.9.

ПолеБитыДоступСбросНазначение
OVF_CNT_CH7_INT_RAW19R/W0Канал 7: таймер переполнился OVF_NUM_CH7 + 1 раз
OVF_CNT_CH6_INT_RAW18R/W0Канал 6: таймер переполнился OVF_NUM_CH6 + 1 раз
OVF_CNT_CH5_INT_RAW17R/W0Канал 5: таймер переполнился OVF_NUM_CH5 + 1 раз
OVF_CNT_CH4_INT_RAW16R/W0Канал 4: таймер переполнился OVF_NUM_CH4 + 1 раз
OVF_CNT_CH3_INT_RAW15R/W0Канал 3: таймер переполнился OVF_NUM_CH3 + 1 раз
OVF_CNT_CH2_INT_RAW14R/W0Канал 2: таймер переполнился OVF_NUM_CH2 + 1 раз
OVF_CNT_CH1_INT_RAW13R/W0Канал 1: таймер переполнился OVF_NUM_CH1 + 1 раз
OVF_CNT_CH0_INT_RAW12R/W0Канал 0: таймер переполнился OVF_NUM_CH0 + 1 раз
DUTY_CHNG_END_CH7_INT_RAW11R/W0Канал 7 закончил плавное изменение скважности
DUTY_CHNG_END_CH6_INT_RAW10R/W0Канал 6 закончил плавное изменение скважности
DUTY_CHNG_END_CH5_INT_RAW9R/W0Канал 5 закончил плавное изменение скважности
DUTY_CHNG_END_CH4_INT_RAW8R/W0Канал 4 закончил плавное изменение скважности
DUTY_CHNG_END_CH3_INT_RAW7R/W0Канал 3 закончил плавное изменение скважности
DUTY_CHNG_END_CH2_INT_RAW6R/W0Канал 2 закончил плавное изменение скважности
DUTY_CHNG_END_CH1_INT_RAW5R/W0Канал 1 закончил плавное изменение скважности
DUTY_CHNG_END_CH0_INT_RAW4R/W0Канал 0 закончил плавное изменение скважности
TIMER3_OVF_INT_RAW3R/W0Счётчик таймера 3 дошёл до наибольшего значения
TIMER2_OVF_INT_RAW2R/W0Счётчик таймера 2 дошёл до наибольшего значения
TIMER1_OVF_INT_RAW1R/W0Счётчик таймера 1 дошёл до наибольшего значения
TIMER0_OVF_INT_RAW0R/W0Счётчик таймера 0 дошёл до наибольшего значения

LEDC_INT_ST_REG — флаги прерываний после маски разрешения

Смещение 0x00C4, адрес 0x6001 90C4, после сброса 0x0000 0000. TRM: регистр 35.10.

ПолеБитыДоступСбросНазначение
OVF_CNT_CH7_INT_ST19RO0Канал 7: таймер переполнился OVF_NUM_CH7 + 1 раз
OVF_CNT_CH6_INT_ST18RO0Канал 6: таймер переполнился OVF_NUM_CH6 + 1 раз
OVF_CNT_CH5_INT_ST17RO0Канал 5: таймер переполнился OVF_NUM_CH5 + 1 раз
OVF_CNT_CH4_INT_ST16RO0Канал 4: таймер переполнился OVF_NUM_CH4 + 1 раз
OVF_CNT_CH3_INT_ST15RO0Канал 3: таймер переполнился OVF_NUM_CH3 + 1 раз
OVF_CNT_CH2_INT_ST14RO0Канал 2: таймер переполнился OVF_NUM_CH2 + 1 раз
OVF_CNT_CH1_INT_ST13RO0Канал 1: таймер переполнился OVF_NUM_CH1 + 1 раз
OVF_CNT_CH0_INT_ST12RO0Канал 0: таймер переполнился OVF_NUM_CH0 + 1 раз
DUTY_CHNG_END_CH7_INT_ST11RO0Канал 7 закончил плавное изменение скважности
DUTY_CHNG_END_CH6_INT_ST10RO0Канал 6 закончил плавное изменение скважности
DUTY_CHNG_END_CH5_INT_ST9RO0Канал 5 закончил плавное изменение скважности
DUTY_CHNG_END_CH4_INT_ST8RO0Канал 4 закончил плавное изменение скважности
DUTY_CHNG_END_CH3_INT_ST7RO0Канал 3 закончил плавное изменение скважности
DUTY_CHNG_END_CH2_INT_ST6RO0Канал 2 закончил плавное изменение скважности
DUTY_CHNG_END_CH1_INT_ST5RO0Канал 1 закончил плавное изменение скважности
DUTY_CHNG_END_CH0_INT_ST4RO0Канал 0 закончил плавное изменение скважности
TIMER3_OVF_INT_ST3RO0Счётчик таймера 3 дошёл до наибольшего значения
TIMER2_OVF_INT_ST2RO0Счётчик таймера 2 дошёл до наибольшего значения
TIMER1_OVF_INT_ST1RO0Счётчик таймера 1 дошёл до наибольшего значения
TIMER0_OVF_INT_ST0RO0Счётчик таймера 0 дошёл до наибольшего значения

LEDC_INT_ENA_REG — разрешение прерываний

Смещение 0x00C8, адрес 0x6001 90C8, после сброса 0x0000 0000. TRM: регистр 35.11.

ПолеБитыДоступСбросНазначение
OVF_CNT_CH7_INT_ENA19R/W0Канал 7: таймер переполнился OVF_NUM_CH7 + 1 раз
OVF_CNT_CH6_INT_ENA18R/W0Канал 6: таймер переполнился OVF_NUM_CH6 + 1 раз
OVF_CNT_CH5_INT_ENA17R/W0Канал 5: таймер переполнился OVF_NUM_CH5 + 1 раз
OVF_CNT_CH4_INT_ENA16R/W0Канал 4: таймер переполнился OVF_NUM_CH4 + 1 раз
OVF_CNT_CH3_INT_ENA15R/W0Канал 3: таймер переполнился OVF_NUM_CH3 + 1 раз
OVF_CNT_CH2_INT_ENA14R/W0Канал 2: таймер переполнился OVF_NUM_CH2 + 1 раз
OVF_CNT_CH1_INT_ENA13R/W0Канал 1: таймер переполнился OVF_NUM_CH1 + 1 раз
OVF_CNT_CH0_INT_ENA12R/W0Канал 0: таймер переполнился OVF_NUM_CH0 + 1 раз
DUTY_CHNG_END_CH7_INT_ENA11R/W0Канал 7 закончил плавное изменение скважности
DUTY_CHNG_END_CH6_INT_ENA10R/W0Канал 6 закончил плавное изменение скважности
DUTY_CHNG_END_CH5_INT_ENA9R/W0Канал 5 закончил плавное изменение скважности
DUTY_CHNG_END_CH4_INT_ENA8R/W0Канал 4 закончил плавное изменение скважности
DUTY_CHNG_END_CH3_INT_ENA7R/W0Канал 3 закончил плавное изменение скважности
DUTY_CHNG_END_CH2_INT_ENA6R/W0Канал 2 закончил плавное изменение скважности
DUTY_CHNG_END_CH1_INT_ENA5R/W0Канал 1 закончил плавное изменение скважности
DUTY_CHNG_END_CH0_INT_ENA4R/W0Канал 0 закончил плавное изменение скважности
TIMER3_OVF_INT_ENA3R/W0Счётчик таймера 3 дошёл до наибольшего значения
TIMER2_OVF_INT_ENA2R/W0Счётчик таймера 2 дошёл до наибольшего значения
TIMER1_OVF_INT_ENA1R/W0Счётчик таймера 1 дошёл до наибольшего значения
TIMER0_OVF_INT_ENA0R/W0Счётчик таймера 0 дошёл до наибольшего значения

LEDC_INT_CLR_REG — сброс флагов прерываний записью 1

Смещение 0x00CC, адрес 0x6001 90CC, после сброса 0x0000 0000. TRM: регистр 35.12.

ПолеБитыДоступСбросНазначение
OVF_CNT_CH7_INT_CLR19WO0Канал 7: таймер переполнился OVF_NUM_CH7 + 1 раз
OVF_CNT_CH6_INT_CLR18WO0Канал 6: таймер переполнился OVF_NUM_CH6 + 1 раз
OVF_CNT_CH5_INT_CLR17WO0Канал 5: таймер переполнился OVF_NUM_CH5 + 1 раз
OVF_CNT_CH4_INT_CLR16WO0Канал 4: таймер переполнился OVF_NUM_CH4 + 1 раз
OVF_CNT_CH3_INT_CLR15WO0Канал 3: таймер переполнился OVF_NUM_CH3 + 1 раз
OVF_CNT_CH2_INT_CLR14WO0Канал 2: таймер переполнился OVF_NUM_CH2 + 1 раз
OVF_CNT_CH1_INT_CLR13WO0Канал 1: таймер переполнился OVF_NUM_CH1 + 1 раз
OVF_CNT_CH0_INT_CLR12WO0Канал 0: таймер переполнился OVF_NUM_CH0 + 1 раз
DUTY_CHNG_END_CH7_INT_CLR11WO0Канал 7 закончил плавное изменение скважности
DUTY_CHNG_END_CH6_INT_CLR10WO0Канал 6 закончил плавное изменение скважности
DUTY_CHNG_END_CH5_INT_CLR9WO0Канал 5 закончил плавное изменение скважности
DUTY_CHNG_END_CH4_INT_CLR8WO0Канал 4 закончил плавное изменение скважности
DUTY_CHNG_END_CH3_INT_CLR7WO0Канал 3 закончил плавное изменение скважности
DUTY_CHNG_END_CH2_INT_CLR6WO0Канал 2 закончил плавное изменение скважности
DUTY_CHNG_END_CH1_INT_CLR5WO0Канал 1 закончил плавное изменение скважности
DUTY_CHNG_END_CH0_INT_CLR4WO0Канал 0 закончил плавное изменение скважности
TIMER3_OVF_INT_CLR3WO0Счётчик таймера 3 дошёл до наибольшего значения
TIMER2_OVF_INT_CLR2WO0Счётчик таймера 2 дошёл до наибольшего значения
TIMER1_OVF_INT_CLR1WO0Счётчик таймера 1 дошёл до наибольшего значения
TIMER0_OVF_INT_CLR0WO0Счётчик таймера 0 дошёл до наибольшего значения

LEDC_CONF_REG — источник такта LEDC

Смещение 0x00D0, адрес 0x6001 90D0, после сброса 0x0000 0000. TRM: регистр 35.3.

31302928272625242322212019181716
CLK_EN—
1514131211109876543210
—APB_CLK_SEL
ПолеБитыДоступСбросНазначение
CLK_EN31R/W01 — такт регистров всегда включён, 0 — только на время записи
APB_CLK_SEL1:0R/W0x0Такт таймеров: 1 — APB_CLK, 2 — RC_FAST_CLK, 3 — XTAL_CLK

LEDC_DATE_REG — версия блока: дата ревизии аппаратуры

Смещение 0x00FC, адрес 0x6001 90FC, после сброса 0x1907 2601. TRM: регистр 35.13.

ПолеБитыДоступСброс
DATE31:0R/W0x1907 2601

Частые вопросы

Какую частоту и разрядность ШИМ даёт LEDC ESP32-S3?

По таблице 35.3-1 TRM при делителе 1: от APB_CLK 80 МГц — 14 бит на 1 кГц, 13 бит на 5 кГц и 12 бит на 10 кГц; от XTAL_CLK 40 МГц — 14 бит на 1 кГц и 13 бит на 4 кГц. Счётчик таймера 14-битный, больше 14 бит не бывает; делитель дробный, поэтому частоту подбирают почти любую в этих пределах.

Зачем младшие 4 бита в DUTY_CHn ESP32-S3?

Это дробная часть скважности. Целая часть — биты 18:4; если в битах 3:0 записано k, то из каждых 16 периодов k периодов идут с импульсом на один такт длиннее. Пример из раздела 35.3.3 TRM: целая часть 10 и дробь 5 дают среднюю скважность 10,3125 такта.

Источники

  1. Espressif. ESP32-S3 Technical Reference Manual, версия 1.8 — глава 35: таблица Register Summary и рисунки регистров — смещения, поля, тип доступа и значения после сброса
  2. Espressif. SVD svd/esp32s3.svd, версия 21 (espressif/svd, коммит be20aa1) — базовые адреса периферии, список регистров и полей; лицензия Apache-2.0
  3. Espressif. ESP-IDF v6.1: заголовки components/soc/esp32s3/register/soc/*_reg.h (коммит fff9895) — имена макросов регистров и полей, сверка положения полей и значений по умолчанию; лицензия Apache-2.0 OR MIT

Нашли ошибку в регистрах?

Другие регистры ESP32-S3

Статьи, инструменты и термины