• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Нужна помощь Прерывания по таймеру

Liberaid

New member
Передо мной стоит задача разобраться в архитектуре xtensa (в частности esp8266)
Самая насущная проблема - написать прерывания по таймеру без SDK

В общем-то, до чего я смог додуматься:
1. Пишу в регистр ccompare0 значение 0 (т.е. по идее каждый раз, когда обнуляется ccount, должно срабатывать прерывание)
2. Ставлю interrupt level на 0
3. Записываю в регистр intenable = 1 << irq_number
4. Пользуюсь (пока) SDKшной функцией _xtos_set_interrupt_handler(irq_number, func), чтобы функция func обрабатывала прерывания

Естественно, ничего не работает)
Все ломается еще на стадии 3
При проверке регистра intenable оказывается, что он постоянно содержит нули
Регистр interrupt постоянно возвращает значение 0x24 (если irq_number = 8)
Если никаких манипуляций не производить, он возвращает 0x64

Понимаю, что пока делаю какой-то бред
Поэтому с нетерпением жду, когда кто-нибудь объяснит хотя бы control flow прерываний в xtens'e )

Заранее благодарен

P.S. Еще в документации к архитектуре xtensa очень часто встречаются таблички, в которых рассказано про всякие параметры. Дак вот, как ими можно пользоваться (например, есть параметр INTTYPE. Как ему задать значение Timer?) Как вообще различать разные типы прерываний?

Спасибо!)
 

pvvx

Активный участник сообщества
esp8266web/int_time_us.c at master · pvvx/esp8266web · GitHub

тут с двумя вариантами + использование NMI прерывания от аппаратного таймера:
esp8266web/main-vectors.c at master · pvvx/esp8266web · GitHub

Тут пример кода считывания ADC по прерыванию аппаратного таймера и отсылке в UDP:
esp8266web/ovls/wdrv at master · pvvx/esp8266web · GitHub

Но там не SDK-кашный подход к записи/чтению регистров.

PS: Скачиваете проект с git и среди файлов "*.c" и "*.h" ищите "TIMER0". Тогда увидите все куски, связанные с TIMER0.
 
Последнее редактирование:
Сверху Снизу