mirror of
https://github.com/esp8266/Arduino.git
synced 2025-06-07 16:23:38 +03:00
Fixes issue of reentrant calls to nointerrupts() exposed functional replacements to cli sei and SREG when dealing with interrupts InterruptLock class to auto stop and restore interrupt level Fix user ISR calls to be like Arduino with interrupts disabled fully.
105 lines
3.0 KiB
C
105 lines
3.0 KiB
C
/*
|
|
timer.c - Timer1 library for esp8266
|
|
|
|
Copyright (c) 2015 Hristo Gochkov. All rights reserved.
|
|
This file is part of the esp8266 core for Arduino environment.
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
#include "wiring_private.h"
|
|
#include "pins_arduino.h"
|
|
|
|
#include "c_types.h"
|
|
#include "ets_sys.h"
|
|
|
|
// ------------------------------------------------------------------ -
|
|
// timer 1
|
|
|
|
static volatile timercallback timer1_user_cb = NULL;
|
|
|
|
void timer1_isr_handler(void *para){
|
|
if ((T1C & ((1 << TCAR) | (1 << TCIT))) == 0) TEIE &= ~TEIE1;//edge int disable
|
|
T1I = 0;
|
|
if (timer1_user_cb) {
|
|
// to make ISR compatible to Arduino AVR model where interrupts are disabled
|
|
// we disable them before we call the client ISR
|
|
uint32_t savedPS = xt_rsil(15); // stop other interrupts
|
|
timer1_user_cb();
|
|
xt_wsr_ps(savedPS);
|
|
}
|
|
}
|
|
|
|
void timer1_isr_init(){
|
|
ETS_FRC_TIMER1_INTR_ATTACH(timer1_isr_handler, NULL);
|
|
}
|
|
|
|
void timer1_attachInterrupt(timercallback userFunc) {
|
|
timer1_user_cb = userFunc;
|
|
ETS_FRC1_INTR_ENABLE();
|
|
}
|
|
|
|
void timer1_detachInterrupt() {
|
|
timer1_user_cb = 0;
|
|
TEIE &= ~TEIE1;//edge int disable
|
|
ETS_FRC1_INTR_DISABLE();
|
|
}
|
|
|
|
void timer1_enable(uint8_t divider, uint8_t int_type, uint8_t reload){
|
|
T1C = (1 << TCTE) | ((divider & 3) << TCPD) | ((int_type & 1) << TCIT) | ((reload & 1) << TCAR);
|
|
T1I = 0;
|
|
}
|
|
|
|
void timer1_write(uint32_t ticks){
|
|
T1L = ((ticks)& 0x7FFFFF);
|
|
if ((T1C & (1 << TCIT)) == 0) TEIE |= TEIE1;//edge int enable
|
|
}
|
|
|
|
void timer1_disable(){
|
|
T1C = 0;
|
|
T1I = 0;
|
|
}
|
|
|
|
//-------------------------------------------------------------------
|
|
// timer 0
|
|
|
|
static volatile timercallback timer0_user_cb = NULL;
|
|
|
|
void timer0_isr_handler(void* para){
|
|
if (timer0_user_cb) {
|
|
// to make ISR compatible to Arduino AVR model where interrupts are disabled
|
|
// we disable them before we call the client ISR
|
|
uint32_t savedPS = xt_rsil(15); // stop other interrupts
|
|
timer0_user_cb();
|
|
xt_wsr_ps(savedPS);
|
|
}
|
|
}
|
|
|
|
void timer0_isr_init(){
|
|
ETS_CCOMPARE0_INTR_ATTACH(timer0_isr_handler, NULL);
|
|
}
|
|
|
|
void timer0_attachInterrupt(timercallback userFunc) {
|
|
timer0_user_cb = userFunc;
|
|
ETS_CCOMPARE0_ENABLE();
|
|
}
|
|
|
|
void timer0_detachInterrupt() {
|
|
timer0_user_cb = NULL;
|
|
ETS_CCOMPARE0_DISABLE();
|
|
}
|
|
|
|
|
|
|