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

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

Регистры групп таймеров ESP32-C3: в каждой группе 54-битный таймер с 16-битным делителем, будильником и автоперезагрузкой, сторожевой таймер MWDT с четырьмя стадиями и схема калибровки медленного RTC-генератора.

У ESP32-C3 две одинаковые группы таймеров: TIMG0 по адресу 0x6001 F000 и TIMG1 по адресу 0x6002 0000, макросы ESP-IDF принимают номер группы — TIMG_T0CONFIG_REG(1). В каждой группе один таймер общего назначения T0: 54-битный счётчик вверх или вниз, тактируемый APB_CLK или XTAL_CLK через делитель 2…65 536.

Чтобы прочитать счётчик, в TIMG_T0UPDATE_REG записывают 1 — текущее значение защёлкивается в T0LO и T0HI. Будильник сравнивает счётчик с T0ALARMLO и T0ALARMHI и может перезагрузить его значением T0LOADLO и T0LOADHI.

Сторожевой таймер MWDT проходит до четырёх стадий; на каждой — прерывание, сброс процессора или сброс цифровой части. Его регистры защищены: перед записью в WDT_WKEY нужно положить ключ 0x50D83AA1, после настройки — любое другое значение.

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

Пример на C

TIMG0: чтение 54-битного счётчика T0 (soc/timer_group_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/timer_group_reg.h"

REG_WRITE(TIMG_T0UPDATE_REG(0), TIMG_T0_UPDATE);        // защёлкнуть значение
while (REG_GET_BIT(TIMG_T0UPDATE_REG(0), TIMG_T0_UPDATE)) {}
uint64_t t = ((uint64_t)REG_READ(TIMG_T0HI_REG(0)) << 32) | REG_READ(TIMG_T0LO_REG(0));

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

Регистр (ESP-IDF)СмещениеНазначениеПосле сброса
TIMG_T0CONFIG_REG(i)0x0000Таймер 0: включение, направление, делитель, будильник0x6000 2000
TIMG_T0LO_REG(i)0x0004Таймер 0: защёлкнутое значение, младшие 32 бита0x0000 0000
TIMG_T0HI_REG(i)0x0008Таймер 0: защёлкнутое значение, старшие 22 бита0x0000 0000
TIMG_T0UPDATE_REG(i)0x000CТаймер 0: защёлкнуть текущее значение0x0000 0000
TIMG_T0ALARMLO_REG(i)0x0010Таймер 0: значение будильника, младшие 32 бита0x0000 0000
TIMG_T0ALARMHI_REG(i)0x0014Таймер 0: значение будильника, старшие 22 бита0x0000 0000
TIMG_T0LOADLO_REG(i)0x0018Таймер 0: значение перезагрузки, младшие 32 бита0x0000 0000
TIMG_T0LOADHI_REG(i)0x001CТаймер 0: значение перезагрузки, старшие 22 бита0x0000 0000
TIMG_T0LOAD_REG(i)0x0020Таймер 0: загрузить значение перезагрузки сейчас0x0000 0000
TIMG_WDTCONFIG0_REG(i)0x0048Сторож: включение, действия стадий, длительность сброса0x0004 C000
TIMG_WDTCONFIG1_REG(i)0x004CСторож: предделитель0x0001 0000
TIMG_WDTCONFIG2_REG(i)0x0050Сторож: длительность стадии 00x018C BA80
TIMG_WDTCONFIG3_REG(i)0x0054Сторож: длительность стадии 10x07FF FFFF
TIMG_WDTCONFIG4_REG(i)0x0058Сторож: длительность стадии 20x000F FFFF
TIMG_WDTCONFIG5_REG(i)0x005CСторож: длительность стадии 30x000F FFFF
TIMG_WDTFEED_REG(i)0x0060Сторож: кормление0x0000 0000
TIMG_WDTWPROTECT_REG(i)0x0064Сторож: защита записи0x50D8 3AA1
TIMG_RTCCALICFG_REG(i)0x0068Калибровка RTC-генератора: запуск и результат готов0x0001 3000
TIMG_RTCCALICFG1_REG(i)0x006CКалибровка RTC-генератора: результат0x0000 0000
TIMG_INT_ENA_TIMERS_REG(i)0x0070Разрешение прерываний0x0000 0000
TIMG_INT_RAW_TIMERS_REG(i)0x0074Необработанные флаги прерываний0x0000 0000
TIMG_INT_ST_TIMERS_REG(i)0x0078Флаги прерываний после маски разрешения0x0000 0000
TIMG_INT_CLR_TIMERS_REG(i)0x007CСброс флагов прерываний записью 10x0000 0000
TIMG_RTCCALICFG2_REG(i)0x0080Калибровка RTC-генератора: таймаут0xFFFF FF98
TIMG_NTIMERS_DATE_REG(i)0x00F8Версия блока: дата ревизии аппаратуры0x0200 6191
TIMG_REGCLK_REG(i)0x00FCТактирование регистров и таймеров0x6000 0000

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

TIMG_T0CONFIG_REG(i) — таймер 0: включение, направление, делитель, будильник

Смещение 0x0000, после сброса 0x6000 2000. TRM: регистр 11.1.

31302928272625242322212019181716
T0_ENT0_INCREASET0_AUTORELOADT0_DIVIDER
1514131211109876543210
T0_DIVIDERT0_DIVIDER_RST—T0_ALARM_ENT0_USE_XTAL—
ПолеБитыДоступСбросНазначение
T0_EN31R/W0Включить счёт
T0_INCREASE30R/W1Направление: 1 — вверх, 0 — вниз
T0_AUTORELOAD29R/W1Перезагрузка счётчика при срабатывании будильника
T0_DIVIDER28:13R/W0x0001Делитель 2…65 535; 0 и 1 означают 65 536 и 2
T0_DIVIDER_RST12WT0Сброс делителя
T0_ALARM_EN10R/W/SC0Включить будильник; сбрасывается при срабатывании
T0_USE_XTAL9R/W0Такт: 1 — XTAL_CLK, 0 — APB_CLK

TIMG_T0LO_REG(i) — таймер 0: защёлкнутое значение, младшие 32 бита

Смещение 0x0004, после сброса 0x0000 0000. TRM: регистр 11.2.

ПолеБитыДоступСброс
T0_LO31:0RO0x0000 0000

TIMG_T0HI_REG(i) — таймер 0: защёлкнутое значение, старшие 22 бита

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

ПолеБитыДоступСброс
T0_HI21:0RO0x000000

TIMG_T0UPDATE_REG(i) — таймер 0: защёлкнуть текущее значение

Смещение 0x000C, после сброса 0x0000 0000. TRM: регистр 11.4.

ПолеБитыДоступСбросНазначение
T0_UPDATE31R/W/SC0Запись 1 защёлкивает счётчик в T0LO и T0HI; бит сбрасывается сам

TIMG_T0ALARMLO_REG(i) — таймер 0: значение будильника, младшие 32 бита

Смещение 0x0010, после сброса 0x0000 0000. TRM: регистр 11.5.

ПолеБитыДоступСброс
T0_ALARM_LO31:0R/W0x0000 0000

TIMG_T0ALARMHI_REG(i) — таймер 0: значение будильника, старшие 22 бита

Смещение 0x0014, после сброса 0x0000 0000. TRM: регистр 11.6.

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

TIMG_T0LOADLO_REG(i) — таймер 0: значение перезагрузки, младшие 32 бита

Смещение 0x0018, после сброса 0x0000 0000. TRM: регистр 11.7.

ПолеБитыДоступСброс
T0_LOAD_LO31:0R/W0x0000 0000

TIMG_T0LOADHI_REG(i) — таймер 0: значение перезагрузки, старшие 22 бита

Смещение 0x001C, после сброса 0x0000 0000. TRM: регистр 11.8.

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

TIMG_T0LOAD_REG(i) — таймер 0: загрузить значение перезагрузки сейчас

Смещение 0x0020, после сброса 0x0000 0000. TRM: регистр 11.9.

ПолеБитыДоступСбросНазначение
T0_LOAD31:0WT0x0000 0000Любая запись загружает в счётчик T0LOADLO и T0LOADHI

TIMG_WDTCONFIG0_REG(i) — сторож: включение, действия стадий, длительность сброса

Смещение 0x0048, после сброса 0x0004 C000. TRM: регистр 11.10.

31302928272625242322212019181716
WDT_ENWDT_STG0WDT_STG1WDT_STG2WDT_STG3WDT_CONF_UPDATE_ENWDT_USE_XTALWDT_CPU_RESET_LENGTHWDT_SYS_RESET_LENGTH
1514131211109876543210
WDT_SYS_RESET_LENGTHWDT_FLASHBOOT_MOD_ENWDT_PROCPU_RESET_ENWDT_APPCPU_RESET_EN—
ПолеБитыДоступСбросНазначение
WDT_EN31R/W0Включить сторож
WDT_STG030:29R/W0x0Действие стадии 0: 0 — нет, 1 — прерывание, 2 — сброс процессора, 3 — сброс цифровой части (в TRM — reset system)
WDT_STG128:27R/W0x0Действие стадии 1
WDT_STG226:25R/W0x0Действие стадии 2
WDT_STG324:23R/W0x0Действие стадии 3
WDT_CONF_UPDATE_EN22WT0Запись 1 применяет новые настройки сторожа
WDT_USE_XTAL21R/W0Такт сторожа: 1 — XTAL_CLK, 0 — APB_CLK
WDT_CPU_RESET_LENGTH20:18R/W0x1Длительность сигнала сброса процессора
WDT_SYS_RESET_LENGTH17:15R/W0x1Длительность сигнала сброса цифровой части
WDT_FLASHBOOT_MOD_EN14R/W1Сторож работает с начальной загрузки из флеш-памяти
WDT_PROCPU_RESET_EN13R/W0Разрешить сброс процессора
WDT_APPCPU_RESET_EN12R/W0

TIMG_WDTCONFIG1_REG(i) — сторож: предделитель

Смещение 0x004C, после сброса 0x0001 0000. TRM: регистр 11.11.

31302928272625242322212019181716
WDT_CLK_PRESCALE
1514131211109876543210
—WDT_DIVCNT_RST
ПолеБитыДоступСбросНазначение
WDT_CLK_PRESCALE31:16R/W0x0001Предделитель такта сторожа
WDT_DIVCNT_RST0WT0Сброс предделителя

TIMG_WDTCONFIG2_REG(i) — сторож: длительность стадии 0

Смещение 0x0050, после сброса 0x018C BA80. TRM: регистр 11.12.

ПолеБитыДоступСбросНазначение
WDT_STG0_HOLD31:0R/W0x018C BA80Длительность стадии 0 в тактах после предделителя

TIMG_WDTCONFIG3_REG(i) — сторож: длительность стадии 1

Смещение 0x0054, после сброса 0x07FF FFFF. TRM: регистр 11.13.

ПолеБитыДоступСбросНазначение
WDT_STG1_HOLD31:0R/W0x07FF FFFFДлительность стадии 1

TIMG_WDTCONFIG4_REG(i) — сторож: длительность стадии 2

Смещение 0x0058, после сброса 0x000F FFFF. TRM: регистр 11.14.

ПолеБитыДоступСбросНазначение
WDT_STG2_HOLD31:0R/W0x000F FFFFДлительность стадии 2

TIMG_WDTCONFIG5_REG(i) — сторож: длительность стадии 3

Смещение 0x005C, после сброса 0x000F FFFF. TRM: регистр 11.15.

ПолеБитыДоступСбросНазначение
WDT_STG3_HOLD31:0R/W0x000F FFFFДлительность стадии 3

TIMG_WDTFEED_REG(i) — сторож: кормление

Смещение 0x0060, после сброса 0x0000 0000. TRM: регистр 11.16.

ПолеБитыДоступСбросНазначение
WDT_FEED31:0WT0x0000 0000Любая запись перезапускает сторож со стадии 0

TIMG_WDTWPROTECT_REG(i) — сторож: защита записи

Смещение 0x0064, после сброса 0x50D8 3AA1. TRM: регистр 11.17.

ПолеБитыДоступСбросНазначение
WDT_WKEY31:0R/W0x50D8 3AA1Ключ 0x50D83AA1 снимает защиту записи регистров сторожа

TIMG_RTCCALICFG_REG(i) — калибровка RTC-генератора: запуск и результат готов

Смещение 0x0068, после сброса 0x0001 3000. TRM: регистр 11.18.

31302928272625242322212019181716
RTC_CALI_STARTRTC_CALI_MAX
1514131211109876543210
RTC_CALI_RDYRTC_CALI_CLK_SELRTC_CALI_START_CYCLING—
ПолеБитыДоступСброс
RTC_CALI_START31R/W0
RTC_CALI_MAX30:16R/W0x0001
RTC_CALI_RDY15RO0
RTC_CALI_CLK_SEL14:13R/W0x1
RTC_CALI_START_CYCLING12R/W1

TIMG_RTCCALICFG1_REG(i) — калибровка RTC-генератора: результат

Смещение 0x006C, после сброса 0x0000 0000. TRM: регистр 11.19.

31302928272625242322212019181716
RTC_CALI_VALUE
1514131211109876543210
RTC_CALI_VALUE—RTC_CALI_CYCLING_DATA_VLD
ПолеБитыДоступСброс
RTC_CALI_VALUE31:7RO0x0000000
RTC_CALI_CYCLING_DATA_VLD0RO0

TIMG_INT_ENA_TIMERS_REG(i) — разрешение прерываний

Смещение 0x0070, после сброса 0x0000 0000. TRM: регистр 11.21.

1514131211109876543210
—WDT_INT_ENAT0_INT_ENA
ПолеБитыДоступСбросНазначение
WDT_INT_ENA1R/W0Стадия сторожа, настроенная на прерывание
T0_INT_ENA0R/W0Сработал будильник таймера 0

TIMG_INT_RAW_TIMERS_REG(i) — необработанные флаги прерываний

Смещение 0x0074, после сброса 0x0000 0000. TRM: регистр 11.22.

1514131211109876543210
—WDT_INT_RAWT0_INT_RAW
ПолеБитыДоступСбросНазначение
WDT_INT_RAW1R/SS/WTC0Стадия сторожа, настроенная на прерывание
T0_INT_RAW0R/SS/WTC0Сработал будильник таймера 0

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

Смещение 0x0078, после сброса 0x0000 0000. TRM: регистр 11.23.

1514131211109876543210
—WDT_INT_STT0_INT_ST
ПолеБитыДоступСбросНазначение
WDT_INT_ST1RO0Стадия сторожа, настроенная на прерывание
T0_INT_ST0RO0Сработал будильник таймера 0

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

Смещение 0x007C, после сброса 0x0000 0000. TRM: регистр 11.24.

1514131211109876543210
—WDT_INT_CLRT0_INT_CLR
ПолеБитыДоступСбросНазначение
WDT_INT_CLR1WT0Стадия сторожа, настроенная на прерывание
T0_INT_CLR0WT0Сработал будильник таймера 0

TIMG_RTCCALICFG2_REG(i) — калибровка RTC-генератора: таймаут

Смещение 0x0080, после сброса 0xFFFF FF98. TRM: регистр 11.20.

31302928272625242322212019181716
RTC_CALI_TIMEOUT_THRES
1514131211109876543210
RTC_CALI_TIMEOUT_THRESRTC_CALI_TIMEOUT_RST_CNT—RTC_CALI_TIMEOUT
ПолеБитыДоступСброс
RTC_CALI_TIMEOUT_THRES31:7R/W0x1FFFFFF
RTC_CALI_TIMEOUT_RST_CNT6:3R/W0x3
RTC_CALI_TIMEOUT0RO0

TIMG_NTIMERS_DATE_REG(i) — версия блока: дата ревизии аппаратуры

Смещение 0x00F8, после сброса 0x0200 6191. TRM: регистр 11.25 (TIMG_NTIMERS_DATE_REG).

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

TIMG_REGCLK_REG(i) — тактирование регистров и таймеров

Смещение 0x00FC, после сброса 0x6000 0000. TRM: регистр 11.26.

31302928272625242322212019181716
CLK_ENTIMER_CLK_IS_ACTIVEWDT_CLK_IS_ACTIVE—
1514131211109876543210
—
ПолеБитыДоступСброс
CLK_EN31R/W0
TIMER_CLK_IS_ACTIVE30R/W1
WDT_CLK_IS_ACTIVE29R/W1

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

Как прочитать значение таймера TIMG ESP32-C3?

Записать любое значение в TIMG_T0UPDATE_REG (бит T0_UPDATE), дождаться, пока бит сбросится, и прочитать младшие 32 бита из TIMG_T0LO_REG и старшие 22 — из TIMG_T0HI_REG. Без этой записи регистры хранят прошлое защёлкнутое значение.

Как отключить сторожевой таймер MWDT ESP32-C3 через регистры?

Снять защиту записью 0x50D83AA1 в TIMG_WDTWPROTECT_REG, сбросить бит WDT_EN в TIMG_WDTCONFIG0_REG, установить WDT_CONF_UPDATE_EN для применения и вернуть защиту записью любого другого значения. В ESP-IDF сторож группы 0 служит сторожем задач (Task WDT), группы 1 — сторожем прерываний (Interrupt WDT).

Источники

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

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