@@ -55,7 +55,7 @@ static const char *TAG = "pwm";
55
55
#define AHEAD_TICKS3 2
56
56
#define MAX_TICKS 10000000ul
57
57
58
- #define PWM_VERSION "PWM v3.2 "
58
+ #define PWM_VERSION "PWM v3.4 "
59
59
60
60
typedef struct {
61
61
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)
259
259
static void pwm_timer_enable (uint8_t enable )
260
260
{
261
261
if (0 == enable ) {
262
- ENTER_CRITICAL ();
263
262
REG_WRITE (WDEVTSF0TIMER_ENA , REG_READ (WDEVTSF0TIMER_ENA ) & (~WDEV_TSF0TIMER_ENA ));
264
- EXIT_CRITICAL ();
265
263
} else {
266
264
REG_WRITE (WDEVTSF0TIMER_ENA , WDEV_TSF0TIMER_ENA );
267
265
}
@@ -310,15 +308,20 @@ static void IRAM_ATTR pwm_timer_intr_handler(void)
310
308
pwm_obj -> this_target = AHEAD_TICKS1 + AHEAD_TICKS3 ;
311
309
}
312
310
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 ));
314
313
REG_WRITE (WDEVTSFSW0_LO , 0 );
315
314
//WARNING, pwm_obj->this_target - AHEAD_TICKS1 should be bigger than 2
316
315
REG_WRITE (WDEVTSF0_TIMER_LO , pwm_obj -> this_target - AHEAD_TICKS1 );
317
316
REG_WRITE (WDEVTSF0TIMER_ENA , WDEV_TSF0TIMER_ENA );
317
+ REG_WRITE (WDEVSLEEP0_CONF , REG_READ (WDEVSLEEP0_CONF ) | WDEV_TSFUP0_ENA );
318
318
}
319
319
320
320
static void pwm_timer_start (uint32_t period )
321
321
{
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 ));
322
325
// suspend all task to void timer interrupt missed
323
326
// TODO, do we need lock interrupt here, I think interrupt context will not take 1ms long
324
327
// time low field to 0
@@ -335,8 +338,11 @@ static void pwm_timer_start(uint32_t period)
335
338
pwm_obj -> this_target = US_TO_TICKS (period );
336
339
// WARNING: pwm_obj->this_target should bigger than AHEAD_TICKS1
337
340
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
339
344
pwm_timer_enable (1 );
345
+ EXIT_CRITICAL ();
340
346
}
341
347
342
348
static void pwm_timer_register (void (* handle )(void ))
@@ -574,7 +580,9 @@ esp_err_t pwm_stop(uint32_t stop_level_mask)
574
580
{
575
581
int16_t i = 0 ;
576
582
583
+ ENTER_CRITICAL ();
577
584
pwm_timer_enable (0 );
585
+ EXIT_CRITICAL ();
578
586
uint32_t level_set = REG_READ (PERIPHS_GPIO_BASEADDR + GPIO_OUT_ADDRESS );
579
587
580
588
for (i = 0 ; i < pwm_obj -> channel_num ; i ++ ) {
0 commit comments