Skip to content

Commit 8ba4058

Browse files
committed
bugfix(pwm): add SLEEP0_CONF reg to stop timer
1 parent 72cbf0d commit 8ba4058

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

components/esp8266/driver/pwm.c

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ static const char *TAG = "pwm";
5555
#define AHEAD_TICKS3 2
5656
#define MAX_TICKS 10000000ul
5757

58-
#define PWM_VERSION "PWM v3.2"
58+
#define PWM_VERSION "PWM v3.4"
5959

6060
typedef struct {
6161
uint32_t duty; /*!< pwm duty for each channel */
@@ -259,9 +259,7 @@ esp_err_t pwm_get_phase(uint8_t channel_num, float *phase_p)
259259
static void pwm_timer_enable(uint8_t enable)
260260
{
261261
if (0 == enable) {
262-
ENTER_CRITICAL();
263262
REG_WRITE(WDEVTSF0TIMER_ENA, REG_READ(WDEVTSF0TIMER_ENA) & (~WDEV_TSF0TIMER_ENA));
264-
EXIT_CRITICAL();
265263
} else {
266264
REG_WRITE(WDEVTSF0TIMER_ENA, WDEV_TSF0TIMER_ENA);
267265
}
@@ -310,15 +308,20 @@ static void IRAM_ATTR pwm_timer_intr_handler(void)
310308
pwm_obj->this_target = AHEAD_TICKS1 + AHEAD_TICKS3;
311309
}
312310

313-
REG_WRITE(WDEVTSF0TIMER_ENA, 0);
311+
REG_WRITE(WDEVSLEEP0_CONF, REG_READ(WDEVSLEEP0_CONF) & (~WDEV_TSFUP0_ENA));
312+
REG_WRITE(WDEVTSF0TIMER_ENA, REG_READ(WDEVTSF0TIMER_ENA) & (~WDEV_TSF0TIMER_ENA));
314313
REG_WRITE(WDEVTSFSW0_LO, 0);
315314
//WARNING, pwm_obj->this_target - AHEAD_TICKS1 should be bigger than 2
316315
REG_WRITE(WDEVTSF0_TIMER_LO, pwm_obj->this_target - AHEAD_TICKS1);
317316
REG_WRITE(WDEVTSF0TIMER_ENA, WDEV_TSF0TIMER_ENA);
317+
REG_WRITE(WDEVSLEEP0_CONF, REG_READ(WDEVSLEEP0_CONF) | WDEV_TSFUP0_ENA);
318318
}
319319

320320
static void pwm_timer_start(uint32_t period)
321321
{
322+
ENTER_CRITICAL();
323+
REG_WRITE(WDEVSLEEP0_CONF, REG_READ(WDEVSLEEP0_CONF) & (~WDEV_TSFUP0_ENA));
324+
REG_WRITE(WDEVTSF0TIMER_ENA, REG_READ(WDEVTSF0TIMER_ENA) & (~WDEV_TSF0TIMER_ENA));
322325
// suspend all task to void timer interrupt missed
323326
// TODO, do we need lock interrupt here, I think interrupt context will not take 1ms long
324327
// time low field to 0
@@ -335,8 +338,11 @@ static void pwm_timer_start(uint32_t period)
335338
pwm_obj->this_target = US_TO_TICKS(period);
336339
// WARNING: pwm_obj->this_target should bigger than AHEAD_TICKS1
337340
REG_WRITE(WDEVTSF0_TIMER_LO, pwm_obj->this_target - AHEAD_TICKS1);
338-
// enable timer
341+
REG_WRITE(WDEVTSF0TIMER_ENA, WDEV_TSF0TIMER_ENA);
342+
REG_WRITE(WDEVSLEEP0_CONF, REG_READ(WDEVSLEEP0_CONF) | WDEV_TSFUP0_ENA);
343+
//enable timer
339344
pwm_timer_enable(1);
345+
EXIT_CRITICAL();
340346
}
341347

342348
static void pwm_timer_register(void (*handle)(void))
@@ -574,7 +580,9 @@ esp_err_t pwm_stop(uint32_t stop_level_mask)
574580
{
575581
int16_t i = 0;
576582

583+
ENTER_CRITICAL();
577584
pwm_timer_enable(0);
585+
EXIT_CRITICAL();
578586
uint32_t level_set = REG_READ(PERIPHS_GPIO_BASEADDR + GPIO_OUT_ADDRESS);
579587

580588
for (i = 0; i < pwm_obj->channel_num; i++) {

components/esp8266/include/esp8266/eagle_soc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,14 @@
148148

149149
#define WDEVTSF0_TIME_LO 0x3ff21004
150150
#define WDEVTSF0_TIME_HI 0x3ff21008
151+
#define WDEVSLEEP0_CONF 0x3ff21014
151152
#define WDEVTSFSW0_LO 0x3ff21018
152153
#define WDEVTSFSW0_HI 0x3ff2101C
153154
#define WDEVTSF0_TIMER_LO 0x3ff2109c
154155
#define WDEVTSF0_TIMER_HI 0x3ff210a0
155156
#define WDEVTSF0TIMER_ENA 0x3ff21098
156157
#define WDEV_TSF0TIMER_ENA BIT(31)
158+
#define WDEV_TSFUP0_ENA BIT(31)
157159

158160
//Watch dog reg {{
159161
#define PERIPHS_WDT_BASEADDR 0x60000900

0 commit comments

Comments
 (0)