• Система автоматизации с открытым исходным кодом на базе 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 страницы? Одни и те-же вопросы задаете. Больше вам ответов не будет.
 
Последнее редактирование:
Сверху Снизу