/** * Enable and initialize the timer * @param timer_num timer number to initialize * @param frequency frequency of the timer */ void HAL_timer_start(const uint8_t timer_num, uint32_t frequency) { const tTimerConfig timer = TimerConfig[timer_num]; timer_config_t config; config.divider = timer.divider; config.counter_dir = TIMER_COUNT_UP; config.counter_en = TIMER_PAUSE; config.alarm_en = TIMER_ALARM_EN; config.intr_type = TIMER_INTR_LEVEL; config.auto_reload = true; // Select and initialize the timer timer_init(timer.group, timer.idx, &config); // Timer counter initial value and auto reload on alarm timer_set_counter_value(timer.group, timer.idx, 0x00000000ULL); // Configure the alam value and the interrupt on alarm timer_set_alarm_value(timer.group, timer.idx, (HAL_TIMER_RATE) / timer.divider / frequency - 1); timer_enable_intr(timer.group, timer.idx); // TODO need to deal with timer_group1_isr timer_isr_register(timer.group, timer.idx, timer_group0_isr, (void*)timer.idx, NULL, NULL); timer_start(timer.group, timer.idx); }
void espos_test_run_in_isr(espos_test_isr_routine routine) { int timer_group = TIMER_GROUP_0; int timer_idx = TIMER_0; timer_config_t config; config.alarm_en = 1; config.auto_reload = 0; config.counter_dir = TIMER_COUNT_UP; config.divider = TIMER_DIVIDER; config.intr_type = TIMER_INTR_SEL; config.counter_en = TIMER_PAUSE; /*Configure timer*/ timer_init(timer_group, timer_idx, &config); /*Stop timer counter*/ timer_pause(timer_group, timer_idx); /*Load counter value */ timer_set_counter_value(timer_group, timer_idx, 0x00000000ULL); /*Set alarm value*/ timer_set_alarm_value(timer_group, timer_idx, 1); timer_set_auto_reload(timer_group, timer_idx, TIMER_AUTORELOAD_DIS); /*Enable timer interrupt*/ timer_enable_intr(timer_group, timer_idx); /*Set ISR handler*/ timer_isr_register(timer_group, timer_idx, timer_isr, (void *) routine, ESP_INTR_FLAG_IRAM, NULL); /*Start timer counter*/ timer_start(timer_group, timer_idx); }
static void my_timer_init(int timer_group, int timer_idx, int ival) { timer_config_t config; config.alarm_en = 1; config.auto_reload = 1; config.counter_dir = TIMER_COUNT_UP; config.divider = TIMER_DIVIDER; config.intr_type = TIMER_INTR_LEVEL; config.counter_en = TIMER_PAUSE; /*Configure timer*/ timer_init(timer_group, timer_idx, &config); /*Stop timer counter*/ timer_pause(timer_group, timer_idx); /*Load counter value */ timer_set_counter_value(timer_group, timer_idx, 0x00000000ULL); /*Set alarm value*/ timer_set_alarm_value(timer_group, timer_idx, ival); /*Enable timer interrupt*/ timer_enable_intr(timer_group, timer_idx); }
static void example_timer_init(int timer_group, int timer_idx, uint32_t period) { timer_config_t config; uint64_t alarm_val = (period * (TIMER_BASE_CLK / 1000000UL)) / 2; config.alarm_en = 1; config.auto_reload = 1; config.counter_dir = TIMER_COUNT_UP; config.divider = 2; //Range is 2 to 65536 config.intr_type = TIMER_INTR_LEVEL; config.counter_en = TIMER_PAUSE; /*Configure timer*/ timer_init(timer_group, timer_idx, &config); /*Stop timer counter*/ timer_pause(timer_group, timer_idx); /*Load counter value */ timer_set_counter_value(timer_group, timer_idx, 0x00000000ULL); /*Set alarm value*/ timer_set_alarm_value(timer_group, timer_idx, alarm_val); /*Enable timer interrupt*/ timer_enable_intr(timer_group, timer_idx); }