16#include "timer_esp8266.h"
24timer_esp8266::timer_esp8266() {
25 _TIMER_::TIMER.FRC1_CTRL = 0;
31timer_esp8266::~timer_esp8266() {
32 _TIMER_::TIMER.FRC1_CTRL = 0;
33 TM1_EDGE_INT_DISABLE();
34 ETS_FRC1_INTR_DISABLE();
37void timer_esp8266::setPeriod(uint32_t us, TIMER::timer_mode mode) {
38 _TIMER_::TIMER.FRC1_CTRL.RELOAD = (mode == TIMER::PERIODIC);
41 _period_load = 80 * us;
43 _TIMER_::TIMER.FRC1_CTRL.DIVIDER = _TIMER_::FRC1_CTRL_DIVIDER__1;
45 if (_period_load > 0x7fffff) {
48 _TIMER_::TIMER.FRC1_CTRL.DIVIDER = _TIMER_::FRC1_CTRL_DIVIDER__16;
50 if (_period_load > 0x7fffff) {
53 _TIMER_::TIMER.FRC1_CTRL.DIVIDER = _TIMER_::FRC1_CTRL_DIVIDER__256;
57 assert(_period_load <= 0x7fffff);
58 _TIMER_::TIMER.FRC1_LOAD = _period_load;
61uint32_t timer_esp8266::getPeriod() {
65void timer_esp8266::setCallback(function<
void()> f) {
67 _TIMER_::TIMER.FRC1_CTRL.INT_TYPE = _TIMER_::FRC1_CTRL_INT_TYPE__EDGE;
68 ETS_FRC_TIMER1_INTR_ATTACH(timer_irq_handler,
this);
69 TM1_EDGE_INT_ENABLE();
70 ETS_FRC1_INTR_ENABLE();
73void timer_esp8266::start() {
74 _TIMER_::TIMER.FRC1_CTRL.ENABLE = 1;
77void timer_esp8266::stop() {
78 _TIMER_::TIMER.FRC1_CTRL.ENABLE = 0;
81bool timer_esp8266::isRunning() {
82 return _TIMER_::TIMER.FRC1_CTRL.ENABLE;
85uint32_t timer_esp8266::getCounter() {
86 return (_period_load - _TIMER_::TIMER.FRC1_COUNT) * _divider / 80;
89void timer_esp8266::resetCounter() {
90 _TIMER_::TIMER.FRC1_LOAD = _period_load;
94 if(timer->_handler) timer->_handler();