/****************************************************************************** * FunctionName : pwm_period_timer * Description : pwm period timer function, output high level, * start each channel's high level timer * Parameters : NONE * Returns : NONE *******************************************************************************/ LOCAL void ICACHE_RAM_ATTR pwm_tim1_intr_handler(void) { uint8 local_toggle = pwm_toggle; // pwm_toggle may change outside RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK); if (pwm_current_channel >= (*pwm_channel - 1)) { // *pwm_channel may change outside pwm_single = pwm_single_toggle[local_toggle]; pwm_channel = &pwm_channel_toggle[local_toggle]; gpio_output_set(pwm_single[*pwm_channel - 1].gpio_set, pwm_single[*pwm_channel - 1].gpio_clear, pwm_gpio, 0); pwm_current_channel = 0; if (*pwm_channel != 1) { RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time); } else { pwm_timer_down = 1; } } else { gpio_output_set(pwm_single[pwm_current_channel].gpio_set, pwm_single[pwm_current_channel].gpio_clear, pwm_gpio, 0); pwm_current_channel++; RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time); } }
/****************************************************************************** * FunctionName : pwm_period_timer * Description : pwm period timer function, output high level, * start each channel's high level timer * Parameters : NONE * Returns : NONE *******************************************************************************/ LOCAL void pwm_tim1_intr_handler(void) { RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK); if (pwm_current_channel == (*pwm_channel - 1)) { pwm_single = pwm_single_toggle[pwm_toggle]; pwm_channel = &pwm_channel_toggle[pwm_toggle]; gpio_output_set(pwm_single[*pwm_channel - 1].gpio_set, pwm_single[*pwm_channel - 1].gpio_clear, pwm_gpio, 0); pwm_current_channel = 0; if (*pwm_channel != 1) { RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time); } else { pwm_timer_down = 1; } } else { gpio_output_set(pwm_single[pwm_current_channel].gpio_set, pwm_single[pwm_current_channel].gpio_clear, pwm_gpio, 0); pwm_current_channel++; RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time); } }
/****************************************************************************** * FunctionName : pwm_init * Description : pwm gpio, params and timer initialization * Parameters : uint16 freq : pwm freq param * uint8 *duty : each channel's duty * Returns : NONE *******************************************************************************/ void ICACHE_FLASH_ATTR pwm_init(uint16 freq, uint8 *duty) { uint8 i; ETS_FRC_TIMER1_INTR_ATTACH(pwm_tim1_intr_handler, NULL); TM1_EDGE_INT_ENABLE(); ETS_FRC1_INTR_ENABLE(); RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK); RTC_REG_WRITE(FRC1_CTRL_ADDRESS, //FRC2_AUTO_RELOAD| DIVDED_BY_16 | FRC1_ENABLE_TIMER | TM_EDGE_INT); RTC_REG_WRITE(FRC1_LOAD_ADDRESS, 0); PIN_FUNC_SELECT(PWM_0_OUT_IO_MUX, PWM_0_OUT_IO_FUNC); PIN_FUNC_SELECT(PWM_1_OUT_IO_MUX, PWM_1_OUT_IO_FUNC); PIN_FUNC_SELECT(PWM_2_OUT_IO_MUX, PWM_2_OUT_IO_FUNC); for (i = 0; i < PWM_CHANNEL; i++) { pwm_gpio |= (1 << pwm_out_io_num[i]); } pwm_set_freq_duty(freq, duty); pwm_start(); }
static void timerhandle( void * v ) { RTC_CLR_REG_MASK(FRC1_INT_ADDRESS, FRC1_INT_CLR_MASK); uint16_t r = hs_adc_read(); sounddata[soundhead] = r>>6; soundhead = (soundhead+1)&(HPABUFFSIZE-1); }