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

Регистры АЦП ESP32-C3

Регистры цифрового контроллера АЦП ESP32-C3: разовое измерение одного канала, непрерывное измерение по таблице каналов с передачей через DMA, фильтры, пороговый монитор, тактирование и встроенный датчик температуры.

У ESP32-C3 два 12-битных SAR АЦП: АЦП1 с каналами 0…4 на GPIO0…GPIO4 и АЦП2 с каналом 0 на GPIO5. Ими управляет контроллер APB_SARADC по адресу 0x6004 0000. АЦП2 делит доступ с Wi-Fi, поэтому для измерений при работающем радио берут АЦП1.

Разовое измерение настраивается в APB_SARADC_ONETIME_SAMPLE_REG: выбрать АЦП, канал и ослабление, установить ONETIME_START и дождаться флага ADC1_DONE или ADC2_DONE; результат лежит в APB_SARADC_1_DATA_STATUS_REG или 2_DATA_STATUS_REG. Непрерывное измерение идёт по таблице SAR_PATT_TAB — до восьми записей «канал и ослабление» — и складывает результаты в память через GDMA.

Ослабление 0…3 расширяет диапазон входного напряжения примерно до 0,75, 1,05, 1,3 и 2,5 В. Калибровочные константы АЦП записаны в eFuse, ESP-IDF учитывает их в схемах калибровки adc_cali (esp_adc/adc_cali.h; старый esp_adc_cal в ESP-IDF 6 удалён).

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

Пример на C

АЦП1, канал 2 (GPIO2), ослабление 3: разовое измерение (soc/apb_saradc_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/apb_saradc_reg.h"

REG_SET_BIT(APB_SARADC_ONETIME_SAMPLE_REG, APB_SARADC1_ONETIME_SAMPLE);
REG_SET_FIELD(APB_SARADC_ONETIME_SAMPLE_REG, APB_SARADC_ONETIME_CHANNEL, 2);
REG_SET_FIELD(APB_SARADC_ONETIME_SAMPLE_REG, APB_SARADC_ONETIME_ATTEN, 3);
REG_WRITE(APB_SARADC_INT_CLR_REG, APB_SARADC_ADC1_DONE_INT_CLR);
REG_CLR_BIT(APB_SARADC_ONETIME_SAMPLE_REG, APB_SARADC_ONETIME_START);
REG_SET_BIT(APB_SARADC_ONETIME_SAMPLE_REG, APB_SARADC_ONETIME_START);
while (!(REG_READ(APB_SARADC_INT_RAW_REG) & APB_SARADC_ADC1_DONE_INT_RAW)) {}
uint32_t raw = REG_GET_FIELD(APB_SARADC_1_DATA_STATUS_REG, APB_SARADC_ADC1_DATA) & 0xFFF;

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
APB_SARADC_CTRL_REG0x0000Запуск, длина таблицы каналов, делитель такта0x4003 8240
APB_SARADC_CTRL2_REG0x0004Таймер непрерывного измерения, инверсия данных0x0000 A1FE
APB_SARADC_FILTER_CTRL1_REG0x0008Коэффициенты фильтров0x0000 0000
APB_SARADC_SAR_PATT_TABn_REG0x0014 + n · 0x0004Таблица каналов для непрерывного измерения, часть n0x0000 0000
APB_SARADC_ONETIME_SAMPLE_REG0x0020Разовое измерение: АЦП, канал, ослабление, запуск0x1A00 0000
APB_SARADC_APB_ADC_ARB_CTRL_REG0x0024Арбитр доступа к АЦП20x0000 0800
APB_SARADC_FILTER_CTRL0_REG0x0028Каналы фильтров и сброс0x0374 0000
APB_SARADC_1_DATA_STATUS_REG0x002CРезультат АЦП10x0000 0000
APB_SARADC_2_DATA_STATUS_REG0x0030Результат АЦП20x0000 0000
APB_SARADC_THRESn_CTRL_REG0x0034 + n · 0x0004Пороговый монитор n: канал и пороги0x0003 FFED
APB_SARADC_THRES_CTRL_REG0x003CВключение пороговых мониторов0x0000 0000
APB_SARADC_INT_ENA_REG0x0040Разрешение прерываний0x0000 0000
APB_SARADC_INT_RAW_REG0x0044Необработанные флаги прерываний0x0000 0000
APB_SARADC_INT_ST_REG0x0048Флаги прерываний после маски разрешения0x0000 0000
APB_SARADC_INT_CLR_REG0x004CСброс флагов прерываний записью 10x0000 0000
APB_SARADC_DMA_CONF_REG0x0050Передача результатов через GDMA0x0000 00FF
APB_SARADC_APB_ADC_CLKM_CONF_REG0x0054Источник и делитель такта АЦП0x0000 0004
APB_SARADC_APB_TSENS_CTRL_REG0x0058Датчик температуры: включение и результат0x0001 8000
APB_SARADC_APB_TSENS_CTRL2_REG0x005CДатчик температуры: такт и время включения0x0000 0002
APB_SARADC_CALI_REG0x0060Калибровка АЦП0x0000 8000
APB_SARADC_APB_CTRL_DATE_REG0x03FCВерсия блока: дата ревизии аппаратуры0x0200 7171

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

APB_SARADC_CTRL_REG — запуск, длина таблицы каналов, делитель такта

Смещение 0x0000, адрес 0x6004 0000, после сброса 0x4003 8240. TRM: регистр 34.1.

31302928272625242322212019181716
WAIT_ARB_CYCLE—XPD_SAR_FORCE—SAR_PATT_P_CLEAR—SAR_PATT_LEN
1514131211109876543210
SAR_PATT_LENSAR_CLK_DIVSAR_CLK_GATED—STARTSTART_FORCE
ПолеБитыДоступСбросНазначение
WAIT_ARB_CYCLE31:30R/W0x1
XPD_SAR_FORCE28:27R/W0x0Питание АЦП: 3 — включено принудительно
SAR_PATT_P_CLEAR23R/W0Сбросить указатель таблицы каналов
SAR_PATT_LEN17:15R/W0x7Число записей таблицы каналов минус 1
SAR_CLK_DIV14:7R/W0x04Делитель такта SAR
SAR_CLK_GATED6R/W1Тактирование SAR
START1R/W0Запустить непрерывное измерение
START_FORCE0R/W0Запуск непрерывного измерения программно

APB_SARADC_CTRL2_REG — таймер непрерывного измерения, инверсия данных

Смещение 0x0004, адрес 0x6004 0004, после сброса 0x0000 A1FE. TRM: регистр 34.2.

31302928272625242322212019181716
—TIMER_ENTIMER_TARGET
1514131211109876543210
TIMER_TARGET—SAR2_INVSAR1_INVMAX_MEAS_NUMMEAS_NUM_LIMIT
ПолеБитыДоступСбросНазначение
TIMER_EN24R/W0Запускать измерения по таймеру
TIMER_TARGET23:12R/W0x00AПериод таймера в тактах АЦП
SAR2_INV10R/W0
SAR1_INV9R/W0
MAX_MEAS_NUM8:1R/W0xFF
MEAS_NUM_LIMIT0R/W0

APB_SARADC_FILTER_CTRL1_REG — коэффициенты фильтров

Смещение 0x0008, адрес 0x6004 0008, после сброса 0x0000 0000. TRM: регистр 34.3.

31302928272625242322212019181716
FILTER_FACTOR0FILTER_FACTOR1—
1514131211109876543210
—
ПолеБитыДоступСброс
FILTER_FACTOR031:29R/W0x0
FILTER_FACTOR128:26R/W0x0

APB_SARADC_SAR_PATT_TABn_REG — таблица каналов для непрерывного измерения, часть n

2 копии, n = 1, 2: смещение 0x0014 + n · 0x0004, после сброса 0x0000 0000. TRM: регистр 34.4.

ПолеБитыДоступСбросНазначение
SAR_PATT_TABn23:0R/W0x000000Четыре записи таблицы по 6 бит: бит 5 — АЦП (sar_sel), биты 4:2 — канал, биты 1:0 — ослабление

APB_SARADC_ONETIME_SAMPLE_REG — разовое измерение: АЦП, канал, ослабление, запуск

Смещение 0x0020, адрес 0x6004 0020, после сброса 0x1A00 0000. TRM: регистр 34.6.

31302928272625242322212019181716
APB_SARADC1_ONETIME_SAMPLEAPB_SARADC2_ONETIME_SAMPLEONETIME_STARTONETIME_CHANNELONETIME_ATTEN—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
APB_SARADC1_ONETIME_SAMPLE31R/W0Разовое измерение на АЦП1
APB_SARADC2_ONETIME_SAMPLE30R/W0Разовое измерение на АЦП2
ONETIME_START29R/W0Переход из 0 в 1 запускает измерение
ONETIME_CHANNEL28:25R/W0xDНомер канала
ONETIME_ATTEN24:23R/W0x0Ослабление входа 0…3

APB_SARADC_APB_ADC_ARB_CTRL_REG — арбитр доступа к АЦП2

Смещение 0x0024, адрес 0x6004 0024, после сброса 0x0000 0800. TRM: регистр 34.7 (APB_SARADC_APB_ADC_ARB_CTRL_REG).

1514131211109876543210
—ADC_ARB_FIX_PRIORITYADC_ARB_WIFI_PRIORITY—ADC_ARB_APB_PRIORITYADC_ARB_GRANT_FORCEADC_ARB_WIFI_FORCE—ADC_ARB_APB_FORCE—
ПолеБитыДоступСброс
ADC_ARB_FIX_PRIORITY12R/W0
ADC_ARB_WIFI_PRIORITY11:10R/W0x2
ADC_ARB_APB_PRIORITY7:6R/W0x0
ADC_ARB_GRANT_FORCE5R/W0
ADC_ARB_WIFI_FORCE4R/W0
ADC_ARB_APB_FORCE2R/W0

APB_SARADC_FILTER_CTRL0_REG — каналы фильтров и сброс

Смещение 0x0028, адрес 0x6004 0028, после сброса 0x0374 0000. TRM: регистр 34.8.

31302928272625242322212019181716
FILTER_RESET—FILTER_CHANNEL0FILTER_CHANNEL1—
1514131211109876543210
—
ПолеБитыДоступСброс
FILTER_RESET31R/W0
FILTER_CHANNEL025:22R/W0xD
FILTER_CHANNEL121:18R/W0xD

APB_SARADC_1_DATA_STATUS_REG — результат АЦП1

Смещение 0x002C, адрес 0x6004 002C, после сброса 0x0000 0000. TRM: регистр 34.9 (APB_SARADC_1_DATA_STATUS_REG).

ПолеБитыДоступСбросНазначение
APB_SARADC1_DATA16:0RO0x00000Результат АЦП1: 12 бит в младших разрядах

APB_SARADC_2_DATA_STATUS_REG — результат АЦП2

Смещение 0x0030, адрес 0x6004 0030, после сброса 0x0000 0000. TRM: регистр 34.10 (APB_SARADC_2_DATA_STATUS_REG).

ПолеБитыДоступСбросНазначение
ADC2_DATA16:0RO0x00000Результат АЦП2

APB_SARADC_THRESn_CTRL_REG — пороговый монитор n: канал и пороги

2 копии, n = 0, 1: смещение 0x0034 + n · 0x0004, после сброса 0x0003 FFED. TRM: регистр 34.11.

31302928272625242322212019181716
—THRESn_LOWTHRESn_HIGH
1514131211109876543210
THRESn_HIGH—THRESn_CHANNEL
ПолеБитыДоступСбросНазначение
THRESn_LOW30:18R/W0x0000Нижний порог
THRESn_HIGH17:5R/W0x1FFFВерхний порог
THRESn_CHANNEL3:0R/W0xDКанал, который контролирует монитор

APB_SARADC_THRES_CTRL_REG — включение пороговых мониторов

Смещение 0x003C, адрес 0x6004 003C, после сброса 0x0000 0000. TRM: регистр 34.13.

31302928272625242322212019181716
THRES0_ENTHRES1_EN—THRES_ALL_EN—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
THRES0_EN31R/W0Включить монитор 0
THRES1_EN30R/W0Включить монитор 1
THRES_ALL_EN27R/W0

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

Смещение 0x0040, адрес 0x6004 0040, после сброса 0x0000 0000. TRM: регистр 34.14.

31302928272625242322212019181716
ADC1_DONE_INT_ENAADC2_DONE_INT_ENATHRES0_HIGH_INT_ENATHRES1_HIGH_INT_ENATHRES0_LOW_INT_ENATHRES1_LOW_INT_ENA—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
ADC1_DONE_INT_ENA31R/W0АЦП1 закончил преобразование
ADC2_DONE_INT_ENA30R/W0АЦП2 закончил преобразование
THRES0_HIGH_INT_ENA29R/W0Результат канала монитора 0 выше верхнего порога
THRES1_HIGH_INT_ENA28R/W0Результат канала монитора 1 выше верхнего порога
THRES0_LOW_INT_ENA27R/W0Результат канала монитора 0 ниже нижнего порога
THRES1_LOW_INT_ENA26R/W0Результат канала монитора 1 ниже нижнего порога

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

Смещение 0x0044, адрес 0x6004 0044, после сброса 0x0000 0000. TRM: регистр 34.15.

31302928272625242322212019181716
ADC1_DONE_INT_RAWADC2_DONE_INT_RAWTHRES0_HIGH_INT_RAWTHRES1_HIGH_INT_RAWTHRES0_LOW_INT_RAWTHRES1_LOW_INT_RAW—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
ADC1_DONE_INT_RAW31RO0АЦП1 закончил преобразование
ADC2_DONE_INT_RAW30RO0АЦП2 закончил преобразование
THRES0_HIGH_INT_RAW29RO0Результат канала монитора 0 выше верхнего порога
THRES1_HIGH_INT_RAW28RO0Результат канала монитора 1 выше верхнего порога
THRES0_LOW_INT_RAW27RO0Результат канала монитора 0 ниже нижнего порога
THRES1_LOW_INT_RAW26RO0Результат канала монитора 1 ниже нижнего порога

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

Смещение 0x0048, адрес 0x6004 0048, после сброса 0x0000 0000. TRM: регистр 34.16.

31302928272625242322212019181716
ADC1_DONE_INT_STADC2_DONE_INT_STTHRES0_HIGH_INT_STTHRES1_HIGH_INT_STTHRES0_LOW_INT_STTHRES1_LOW_INT_ST—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
ADC1_DONE_INT_ST31RO0АЦП1 закончил преобразование
ADC2_DONE_INT_ST30RO0АЦП2 закончил преобразование
THRES0_HIGH_INT_ST29RO0Результат канала монитора 0 выше верхнего порога
THRES1_HIGH_INT_ST28RO0Результат канала монитора 1 выше верхнего порога
THRES0_LOW_INT_ST27RO0Результат канала монитора 0 ниже нижнего порога
THRES1_LOW_INT_ST26RO0Результат канала монитора 1 ниже нижнего порога

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

Смещение 0x004C, адрес 0x6004 004C, после сброса 0x0000 0000. TRM: регистр 34.17.

31302928272625242322212019181716
ADC1_DONE_INT_CLRADC2_DONE_INT_CLRTHRES0_HIGH_INT_CLRTHRES1_HIGH_INT_CLRTHRES0_LOW_INT_CLRTHRES1_LOW_INT_CLR—
1514131211109876543210
—
ПолеБитыДоступСбросНазначение
ADC1_DONE_INT_CLR31WO0АЦП1 закончил преобразование
ADC2_DONE_INT_CLR30WO0АЦП2 закончил преобразование
THRES0_HIGH_INT_CLR29WO0Результат канала монитора 0 выше верхнего порога
THRES1_HIGH_INT_CLR28WO0Результат канала монитора 1 выше верхнего порога
THRES0_LOW_INT_CLR27WO0Результат канала монитора 0 ниже нижнего порога
THRES1_LOW_INT_CLR26WO0Результат канала монитора 1 ниже нижнего порога

APB_SARADC_DMA_CONF_REG — передача результатов через GDMA

Смещение 0x0050, адрес 0x6004 0050, после сброса 0x0000 00FF. TRM: регистр 34.18.

31302928272625242322212019181716
APB_ADC_TRANSAPB_ADC_RESET_FSM—
1514131211109876543210
APB_ADC_EOF_NUM
ПолеБитыДоступСбросНазначение
APB_ADC_TRANS31R/W0Передавать результаты через GDMA
APB_ADC_RESET_FSM30R/W0Сброс автомата контроллера
APB_ADC_EOF_NUM15:0R/W0x00FFЧисло результатов до события конца пакета GDMA

APB_SARADC_APB_ADC_CLKM_CONF_REG — источник и делитель такта АЦП

Смещение 0x0054, адрес 0x6004 0054, после сброса 0x0000 0004. TRM: регистр 34.19 (APB_SARADC_APB_ADC_CLKM_CONF_REG).

31302928272625242322212019181716
—CLK_SELCLK_ENCLKM_DIV_A
1514131211109876543210
CLKM_DIV_ACLKM_DIV_BCLKM_DIV_NUM
ПолеБитыДоступСбросНазначение
CLK_SEL22:21R/W0x0Источник такта АЦП
CLK_EN20R/W0Включить такт АЦП
CLKM_DIV_A19:14R/W0x00
CLKM_DIV_B13:8R/W0x00
CLKM_DIV_NUM7:0R/W0x04Целая часть делителя такта АЦП

APB_SARADC_APB_TSENS_CTRL_REG — датчик температуры: включение и результат

Смещение 0x0058, адрес 0x6004 0058, после сброса 0x0001 8000. TRM: регистр 34.20.

31302928272625242322212019181716
—TSENS_PUTSENS_CLK_DIV
1514131211109876543210
TSENS_CLK_DIVTSENS_IN_INV—TSENS_OUT
ПолеБитыДоступСбросНазначение
TSENS_PU22R/W0Включить датчик температуры
TSENS_CLK_DIV21:14R/W0x06Делитель такта датчика
TSENS_IN_INV13R/W0
TSENS_OUT7:0RO0x00Код датчика температуры

APB_SARADC_APB_TSENS_CTRL2_REG — датчик температуры: такт и время включения

Смещение 0x005C, адрес 0x6004 005C, после сброса 0x0000 0002. TRM: регистр 34.21 (APB_SARADC_APB_TSENS_CTRL2_REG).

1514131211109876543210
TSENS_CLK_SEL—TSENS_XPD_WAIT
ПолеБитыДоступСброс
TSENS_CLK_SEL15R/W0
TSENS_XPD_WAIT11:0R/W0x002

APB_SARADC_CALI_REG — калибровка АЦП

Смещение 0x0060, адрес 0x6004 0060, после сброса 0x0000 8000. TRM: регистр 34.22.

ПолеБитыДоступСброс
CALI_CFG16:0R/W0x08000

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

Смещение 0x03FC, адрес 0x6004 03FC, после сброса 0x0200 7171. TRM: регистр 34.23 (APB_SARADC_APB_CTRL_DATE_REG).

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

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

Как сделать разовое измерение АЦП ESP32-C3 через регистры?

В APB_SARADC_ONETIME_SAMPLE_REG установить APB_SARADC1_ONETIME_SAMPLE, записать канал в ONETIME_CHANNEL и ослабление в ONETIME_ATTEN, затем записать 1 в ONETIME_START, дождаться флага ADC1_DONE_INT_RAW в APB_SARADC_INT_RAW_REG и прочитать 12-битный результат из APB_SARADC_1_DATA_STATUS_REG. Перед запуском ONETIME_START сбрасывают в 0.

Где находятся регистры датчика температуры ESP32-C3?

В том же блоке APB_SARADC: APB_SARADC_APB_TSENS_CTRL_REG включает датчик битом TSENS_PU и отдаёт 8-битный код в TSENS_OUT, APB_SARADC_APB_TSENS_CTRL2_REG выбирает такт и время включения. Перевод кода в градусы с поправкой из eFuse делает драйвер temperature_sensor ESP-IDF.

Источники

  1. Espressif. ESP32-C3 Technical Reference Manual, версия 1.4 — глава 34: таблица 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

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