• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Таймеры RTL8711

pvvx

Активный участник сообщества
@pvvx, благодарю за информацию.

Структура регистров в rtl8195a_timer.h соответствует описанию 1-го таймера в D2000 (их в доках всего 2).
Обращения из кода к структуре через макросы HAL_TIMER_READ32(addr) и HAL_TIMER_WRITE32(addr, value) в основном происходит через функцию HalTimerInitRtl8195a_Patch(), в которой в качестве адреса используется TIMER_INTERVAL*pHalTimerAdap->TimerId + смещение требуемого регистра.
TIMER_INTERVAL*pHalTimerAdap->TimerId для 8 значений TimerId (0-7) даёт 8 адресов:
0x40002000 для TimerId=0; //RTC
0x40002014 для TimerId=1; //
0x40002028 для TimerId=2; // PWM_3
0x4000203c для TimerId=3; // PWM_0
0x40002050 для TimerId=4; // PWM_1
0x40002064 для TimerId=5; // PWM_2
0x40002078 для TimerId=6; //
0x4000208c для TimerId=7. //
Дамп регистров снятый в JLink при инициализации мною PWM сигнала на PC_2 верно отображает регистры для TimerId=5, а также инициированный с TimerId=1 таймер. При этом вся структура таймерных регистров повторяется с шагом 0x100 (4 блока).

В принципе это всё, что нарыл в SDK. Это ни на грамм не приблизило меня к аппаратному управлению состоянием pwm пина от таймера в режиме PWM Mode.
Поэтому, если это возможно, хотелось бы получить помощь в конфигурации предделителя(-лей) таймеров и как выходы таймеров подключить в пинам?
Очень хочется иметь аппаратную реализацию 2-х выходов с импульсом в 1 мксек следующим с частотой от 50 Гц до 50 кГц.
У вас вопрос был про Таймеры. По ним всё есть. PWM же реализован почти так-же, как в D2000, но коммутация выводов сделана по другому - SoC то другой и это к стандартным моделям IP не относится.
Я вот тоже не нашел, где переключается вход GATE таймера на внешний пин. А это вроде есть, но в HAL не задействовано и нет нив одной прошивке хоть сторонней, в отличии от PWM. PWM вообще расписан в SDK вдоль и поперек до уровня API, работает на 100% и ставятся все возможные режимы. Не понимаю интереса в переписывании того, что работает и нормально...
Переключение таймеров на более высокую частоту тактирования пока не найдено и его может и не быть. Что там ещё можно менять?
50Гц дцать бит у вас выйдет, но выше - фигу. (если только найдете переключение тактирования таймеров на PLL)
Остается делать PWM на I2S - там за 6 МГц и он умеет циклически выводить по DMA непрерывно. Для звука - достаточно (см. MP3 - там два канала звука 48 кГц в 96 бит ШИМ+адаптивка)
Или стучитесь в Realtek и подписывайте NDA с ними :)
 
Последнее редактирование:

KomX

Member
У вас вопрос был про Таймеры. По ним всё есть. PWM же реализован почти так-же, как в D2000, но коммутация выводов сделана по другому - SoC то другой и это к стандартным моделям IP не относится.
В том то и дело, что коммутации никакой, - всё программно реализовано.

Я вот тоже не нашел, где переключается вход GATE таймера на внешний пин. А это вроде есть, но в HAL не задействовано и нет нив одной прошивке хоть сторонней, в отличии от PWM. PWM вообще расписан в SDK вдоль и поперек до уровня API, работает на 100% и ставятся все возможные режимы. Не понимаю интереса в переписывании того, что работает и нормально...
Интерес в желании получить аппаратный ШИМ без чрезмерной траты ресурсов, как в Вашем предложении с I2S.
Хотя... Если ослабить критерий длительности строба (1 мкс), скажем до 10 мкс, то уложиться в пару килобайт на выводимые массивы можно...
Кстати, где можно подсмотреть управление пинами от DMA (где и как конфигурируется)?
 

pvvx

Активный участник сообщества
Что-то мы на разных языках разговариваем (?) :)
Аппаратный PWM:
API: RTL00MP3/pwmout_api.c at master · pvvx/RTL00MP3 · GitHub
HAL: RTL00MP3/hal_pwm.c at master · pvvx/RTL00MP3 · GitHub + RTL00MP3/rtl8195a_pwm.c at master · pvvx/RTL00MP3 · GitHub
Т.е. с PWM всё есть, а вот как сконфигурировать таймеры для работы с ножками, включаемыми
HalETE0PinCtrlRtl8195A()
HalETE1PinCtrlRtl8195A()
HalETE2PinCtrlRtl8195A()
HalETE3PinCtrlRtl8195A()
HalEGTIMPinCtrlRtl8195A()
#define ETE0 164
#define ETE1 165
#define ETE2 166
#define ETE3 167
#define EGTIM 168
Непонятно.
 
Последнее редактирование:

KomX

Member
И где же тут аппаратный ШИМ?
Я эту реализацию ШИМ уже раз сто пересмотрел... В конце-концов запустится один из таймеров описанных в предыдущей реплике с предустановкой в один тик и вызовом TIMER2_7_IRQ.
И уже в недрах TIMER2_7_IRQ происходит работа с
#define REG_PERI_PWM0_CTRL 0x0360
#define REG_PERI_PWM1_CTRL 0x0364
#define REG_PERI_PWM2_CTRL 0x0368
#define REG_PERI_PWM3_CTRL 0x036C
#define REG_PERI_TIM_EVT_CTRL 0x0370
#define REG_PERI_EGTIM_CTRL 0x0374
биты первых четырёх модифицируются в HAL_Pwm_SetDuty_8195a().
Кстати о HAL_Pwm_SetDuty_8195a(). Из-за какого-то нелепого желания разработчика в этой подпрограмме происходит подмена параметров
pPwmAdapt->period = period_tick & 0x3ff;
pPwmAdapt->pulsewidth = pulsewidth_tick & 0x3ff;
что не позволяет корректно выставить период и длительность импульса с pwmout_pulsewidth_us().
 

pvvx

Активный участник сообщества
И где же тут аппаратный ШИМ?
Обычный такой ШИМ. Таймер дергает ножки, сконфигурированные на выход в регистрах SoC... Есть ещё прерывание, по которому можно загрузить новое значение в счетчики периода и длительности импульса по концу периода (если вам каждый надо менять)... ШИМ синхронный на 4 канала (4 пина) - общая длительность периода, что хорошо.
Из-за какого-то нелепого желания разработчика в этой подпрограмме происходит подмена параметров
pPwmAdapt->period = period_tick & 0x3ff;
pPwmAdapt->pulsewidth = pulsewidth_tick & 0x3ff;
что не позволяет корректно выставить период и длительность импульса с pwmout_pulsewidth_us().
В упор не вижу ограничений длительности. Ограничено на 10 бит в тиках. Вы хотите поучить разрешение более бит на ШИМ с цифрового вывода? :eek:
 
Последнее редактирование:

pvvx

Активный участник сообщества
У меня всё хорошо с ШИМ:
Минимальные длительности:
Снимок1384.gif
1 секунда/ 0.5 сек
Снимок1385.gif
10 сек / 0.5 сек
Снимок1386.gif
Ущё уточню, что можно и не синхронно, не от одного таймера все ножки пускать, а на каждую свой таймер или группами. А то так написал, в прошлом соо, что может показаться что только синхронно :)
C ШИМ там всё просто - таймер дает clock на два счетчика - периода и импульса.
На каждую ножку выбирается номер таймера, счетчик периода в пересчетах таймера, длительность импульса в пересчетах таймера. Пределы счетчиков периода и импульса 0..0x3FF, т.е. 10 бит.
 
Последнее редактирование:

KomX

Member
"Посыпаю голову пеплом", - аппаратный ШИМ на 100%!
Правда, у меня получилась минимальная длительность строба 30.5 мкс и, соответственно, 16 кГц с хвостиком максимальная частота.
 

pvvx

Активный участник сообщества
Правда, у меня получилась минимальная длительность строба 30.5 мкс и, соответственно, 16 кГц с хвостиком максимальная частота.
Да, это минимум, т.к. такое тактирование таймеров - 32768 Гц
Hal и API в SDK я переписал, но не выкладывал в своем SDK. Там были ошибки, глупые... В ближайшее время кину.
 

Neov

Member
@pvvx, не обнаружили альтернативы us счетчику wifi? Нужно реализовать связь с однопроводными датчиками в духе dht11, ds18b20 на прерываниях.
 

pvvx

Активный участник сообщества
@pvvx, не обнаружили альтернативы us счетчику wifi? Нужно реализовать связь с однопроводными датчиками в духе dht11, ds18b20 на прерываниях.
Аппаратный счетчик TSF доступен в базовом виде SDK.
Описывал и консольный доступ для чтения. RTL00MP3/wifi_console.c at master · pvvx/RTL00MP3 · GitHub
Он, как и у всех, работает только при включенном WiFi блоке.
Отличия от ESP у него в стандарте - он показывает не начало от включения питания, а счет в текущей сети (это требуется для всяких распределенных WiFi сетей и указывает общее время сети...). При обычном соединении типа SoftAP+ST он показывает время у ведущего - к кому присоединен (и передачу своего beacon RTL ведет синхронно с ведущим, с определенным смещением (чтобы оставить максимум незанятого таймслота для приема-передач другим на канале и не попадать на колизии). RFC и прочее по данному делу не изучал, но думаю Realtek сам знает как надо :) ). Так, что смотрите и контролируйте сами начальное смещение, которое зависит от сети по массе условий.
На все события приема beacon (и счета TSF) в SDK есть установка калбаков....
Для Station TSF не нашел - не успел, а беглым поиском не нашлось. Надо смотреть описания структур в хидерах и искать, где он актуальный. Пока не до этого.
Вообще описаний работы WiFi в русскоязычном инете нет и не предвидится, хотя стандартам уже много лет... Отсталый мир... Деревянные игрушки, медвед везде бродит... :)
 
Последнее редактирование:
  • Like
Реакции: Neov

Neov

Member
Он, как и у всех, работает только при включенном WiFi блоке.
Жаль, что других путей нет. WiFi у меня не всегда включен, а счетчик нужен всегда.
Везде подстава. В ESP RTOS SDK hw таймер вообще не работает, так теперь и тут us счетчика нет.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Жаль, что других путей нет. WiFi у меня не всегда включен, а счетчик нужен всегда.
Везде подстава. В ESP RTOS SDK hw таймер вообще не работает, так теперь и тут us счетчика нет.
Ну это не таймер, а счетчик. Есть счетчик в тактах CLK CPU.
Во вторых таймеров дофига - 9-ть с учетом ещё RC таймера... SDK пользует только 1 аппаратный таймер из 8 аппаратных GTIMER.
С учетом другой периферии CPU можно получить аппаратных таймеров с прерываниями более десятка. Вам мало? :eek:
Все таймеры, кроме RC таймера, а так-же CPU отключаются в энерго-экономичном режиме. Будьте внимательны и правильно управляйте PMU (Power Management Unit).
 
Последнее редактирование:

Neov

Member
Во вторых таймеров дофига - 9-ть с учетом ещё RC таймера... SDK пользует только 1 аппаратный таймер из 8 аппаратных GTIMER
Только тактуются они от 32768 Гц. Кстати RC с какой частотой?
Есть счетчик в тактах CLK CPU.
Не подскажете по какому адресу?
Мне всего-то нужен счетчик с периодом порядка 1 us.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Только тактуются они от 32768 Гц. Кстати RC с какой частотой?
С низкой - он же работает на выход из deep_sleep...
Не подскажете по какому адресу?
По стандартному для ARM. Таймеры RTL8711
Задействован в моей сборке SDK...
Вам сложно прочитать тему в 1,5 страницы? Одни и те-же вопросы задаете. Больше вам ответов не будет.
 
Последнее редактирование:
Сверху Снизу