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

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

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

LEDC по адресу 0x6001 9000 — генератор ШИМ, которым ESP-IDF пользуется для яркости светодиодов, сервоприводов и звука. Каждый из шести каналов берёт счётчик одного из четырёх таймеров (поле TIMER_SEL_CHn) и переключает выход, когда счётчик проходит значения HPOINT и HPOINT + DUTY.

Таймеры тактируются общим источником LEDC_CLK — APB_CLK, RC_FAST_CLK или XTAL_CLK по полю APB_CLK_SEL регистра LEDC_CONF_REG. Делитель CLK_DIV_TIMERx дробный: старшие 10 бит — целая часть, младшие 8 — дробь в 1/256. Частота ШИМ = f_LEDC_CLK / (делитель · 2^TIMERx_DUTY_RES).

Новые значения скважности и настроек канала вступают в силу только после записи 1 в PARA_UP_CHn, а таймера — в TIMERx_PARA_UP; скважность в регистре DUTY_CHn задаётся с четырьмя дробными битами.

ЭкземплярБазовый адрес
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_CONF1_REG, LEDC_DUTY_START_LSCH0);     // применить скважность
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Версия блока: дата ревизии аппаратуры0x1906 1700

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

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

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

31302928272625242322212019181716
—OVF_CNT_RESET_CHn
1514131211109876543210
OVF_CNT_EN_CHnOVF_NUM_CHnPARA_UP_CHnIDLE_LV_CHnSIG_OUT_EN_CHnTIMER_SEL_CHn
ПолеБитыДоступСбросНазначение
OVF_CNT_RESET_CHn16WT0Сброс счётчика периодов
OVF_CNT_EN_CHn15R/W0Включить счёт периодов
OVF_NUM_CHn14:5R/W0x000Число периодов минус 1 до прерывания OVF_CNT
PARA_UP_CHn4WT0Запись 1 применяет HPOINT, DUTY и настройки плавности
IDLE_LV_CHn3R/W0Уровень выхода, когда канал остановлен
SIG_OUT_EN_CHn2R/W0Включить выход канала
TIMER_SEL_CHn1:0R/W0x0Номер таймера 0…3 для канала

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

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

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

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

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

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

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

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

31302928272625242322212019181716
DUTY_START_CHnDUTY_INC_CHnDUTY_NUM_CHnDUTY_CYCLE_CHn
1514131211109876543210
DUTY_CYCLE_CHnDUTY_SCALE_CHn
ПолеБитыДоступСбросНазначение
DUTY_START_CHn31R/W/SC0Запись 1 запускает применение новой скважности или плавное изменение
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: текущая скважность

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

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

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

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

31302928272625242322212019181716
—TIMERn_PARA_UP—TIMERn_RSTTIMERn_PAUSECLK_DIV_TIMERn
1514131211109876543210
CLK_DIV_TIMERnTIMERn_DUTY_RES
ПолеБитыДоступСбросНазначение
TIMERn_PARA_UP25WT0Запись 1 применяет делитель и разрядность
TIMERn_RST23R/W1Сбросить счётчик и держать в нуле
TIMERn_PAUSE22R/W0Остановить счётчик
CLK_DIV_TIMERn21:4R/W0x00000Делитель: 10 бит целой части и 8 бит дроби (1/256)
TIMERn_DUTY_RES3:0R/W0x0Разрядность счётчика 1…14 бит

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

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

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

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

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

1514131211109876543210
OVF_CNT_CH5_INT_RAWOVF_CNT_CH4_INT_RAWOVF_CNT_CH3_INT_RAWOVF_CNT_CH2_INT_RAWOVF_CNT_CH1_INT_RAWOVF_CNT_CH0_INT_RAWDUTY_CHNG_END_CH5_INT_RAWDUTY_CHNG_END_CH4_INT_RAWDUTY_CHNG_END_CH3_INT_RAWDUTY_CHNG_END_CH2_INT_RAWDUTY_CHNG_END_CH1_INT_RAWDUTY_CHNG_END_CH0_INT_RAWTIMER3_OVF_INT_RAWTIMER2_OVF_INT_RAWTIMER1_OVF_INT_RAWTIMER0_OVF_INT_RAW
ПолеБитыДоступСбросНазначение
OVF_CNT_CH5_INT_RAW15R/W0Канал 5: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH4_INT_RAW14R/W0Канал 4: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH3_INT_RAW13R/W0Канал 3: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH2_INT_RAW12R/W0Канал 2: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH1_INT_RAW11R/W0Канал 1: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH0_INT_RAW10R/W0Канал 0: счётчик периодов достиг OVF_NUM_CHn + 1
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: регистр 32.10.

1514131211109876543210
OVF_CNT_CH5_INT_STOVF_CNT_CH4_INT_STOVF_CNT_CH3_INT_STOVF_CNT_CH2_INT_STOVF_CNT_CH1_INT_STOVF_CNT_CH0_INT_STDUTY_CHNG_END_CH5_INT_STDUTY_CHNG_END_CH4_INT_STDUTY_CHNG_END_CH3_INT_STDUTY_CHNG_END_CH2_INT_STDUTY_CHNG_END_CH1_INT_STDUTY_CHNG_END_CH0_INT_STTIMER3_OVF_INT_STTIMER2_OVF_INT_STTIMER1_OVF_INT_STTIMER0_OVF_INT_ST
ПолеБитыДоступСбросНазначение
OVF_CNT_CH5_INT_ST15RO0Канал 5: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH4_INT_ST14RO0Канал 4: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH3_INT_ST13RO0Канал 3: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH2_INT_ST12RO0Канал 2: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH1_INT_ST11RO0Канал 1: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH0_INT_ST10RO0Канал 0: счётчик периодов достиг OVF_NUM_CHn + 1
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: регистр 32.11.

1514131211109876543210
OVF_CNT_CH5_INT_ENAOVF_CNT_CH4_INT_ENAOVF_CNT_CH3_INT_ENAOVF_CNT_CH2_INT_ENAOVF_CNT_CH1_INT_ENAOVF_CNT_CH0_INT_ENADUTY_CHNG_END_CH5_INT_ENADUTY_CHNG_END_CH4_INT_ENADUTY_CHNG_END_CH3_INT_ENADUTY_CHNG_END_CH2_INT_ENADUTY_CHNG_END_CH1_INT_ENADUTY_CHNG_END_CH0_INT_ENATIMER3_OVF_INT_ENATIMER2_OVF_INT_ENATIMER1_OVF_INT_ENATIMER0_OVF_INT_ENA
ПолеБитыДоступСбросНазначение
OVF_CNT_CH5_INT_ENA15R/W0Канал 5: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH4_INT_ENA14R/W0Канал 4: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH3_INT_ENA13R/W0Канал 3: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH2_INT_ENA12R/W0Канал 2: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH1_INT_ENA11R/W0Канал 1: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH0_INT_ENA10R/W0Канал 0: счётчик периодов достиг OVF_NUM_CHn + 1
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: регистр 32.12.

1514131211109876543210
OVF_CNT_CH5_INT_CLROVF_CNT_CH4_INT_CLROVF_CNT_CH3_INT_CLROVF_CNT_CH2_INT_CLROVF_CNT_CH1_INT_CLROVF_CNT_CH0_INT_CLRDUTY_CHNG_END_CH5_INT_CLRDUTY_CHNG_END_CH4_INT_CLRDUTY_CHNG_END_CH3_INT_CLRDUTY_CHNG_END_CH2_INT_CLRDUTY_CHNG_END_CH1_INT_CLRDUTY_CHNG_END_CH0_INT_CLRTIMER3_OVF_INT_CLRTIMER2_OVF_INT_CLRTIMER1_OVF_INT_CLRTIMER0_OVF_INT_CLR
ПолеБитыДоступСбросНазначение
OVF_CNT_CH5_INT_CLR15WO0Канал 5: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH4_INT_CLR14WO0Канал 4: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH3_INT_CLR13WO0Канал 3: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH2_INT_CLR12WO0Канал 2: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH1_INT_CLR11WO0Канал 1: счётчик периодов достиг OVF_NUM_CHn + 1
OVF_CNT_CH0_INT_CLR10WO0Канал 0: счётчик периодов достиг OVF_NUM_CHn + 1
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: регистр 32.3.

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

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

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

ПолеБитыДоступСброс
LEDC_DATE31:0R/W0x1906 1700

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

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

Произведение частоты на 2 в степени разрядности не может превышать частоту LEDC_CLK: от APB_CLK 80 МГц это около 4,9 кГц при 14 битах, 19,5 кГц при 12 битах и 312,5 кГц при 8 битах. Делитель дробный, поэтому частоту можно подобрать почти любую в этих пределах.

Почему изменение DUTY не меняет скважность ESP32-C3?

Канал перечитывает настройки только после записи 1 в бит PARA_UP_CHn регистра LEDC_LSCHn_CONF0_REG, а запуск плавного изменения — после установки DUTY_START_CHn в LEDC_LSCHn_CONF1_REG. Значение в DUTY_CHn сдвинуто на 4 бита: младшие четыре — дробная часть.

Источники

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

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

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

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