/* * idx indicate Timer0L, Timer0H, Timer1L,Timer1H * Timer affect circular in buffer. */ void stop_timer(uint8_t idx) { uint8_t ep = (idx + 1) | 0x80; circular_buffer_pools_t * cb_in = circular_buffer_pointer(ep); uint16_t timer_reload = circular_buffer_timer_reload(cb_in); switch(idx) { case 0: SI32_TIMER_A_stop_low_timer (SI32_TIMER_0); SI32_TIMER_A_clear_low_overflow_interrupt (SI32_TIMER_0); SI32_TIMER_A_set_low_count (SI32_TIMER_0, timer_reload); break; case 1: SI32_TIMER_A_stop_high_timer (SI32_TIMER_0); SI32_TIMER_A_clear_high_overflow_interrupt (SI32_TIMER_0); SI32_TIMER_A_set_high_count (SI32_TIMER_0, timer_reload); break; case 2: SI32_TIMER_A_stop_low_timer (SI32_TIMER_1); SI32_TIMER_A_clear_low_overflow_interrupt (SI32_TIMER_1); SI32_TIMER_A_set_low_count (SI32_TIMER_1, timer_reload); break; case 3: SI32_TIMER_A_stop_high_timer (SI32_TIMER_1); SI32_TIMER_A_clear_high_overflow_interrupt (SI32_TIMER_1); SI32_TIMER_A_set_high_count (SI32_TIMER_1, timer_reload); break; } circular_buffer_put_read_ready(cb_in,1); }
void wave_4k_init(void) { SI32_TIMER_A_Type* SI32_TIMER = SI32_TIMER_1; uint16_t reload_value = get_wave_reload_value(WAVE_4K); SI32_CLKCTRL_A_enable_apb_to_modules_0(SI32_CLKCTRL_0, SI32_CLKCTRL_A_APBCLKG0_TIMER1); SI32_TIMER_A_select_low_auto_reload_mode(SI32_TIMER); SI32_TIMER_A_enable_low_overflow_interrupt(SI32_TIMER); SI32_TIMER_A_disable_low_extra_interrupt(SI32_TIMER); SI32_TIMER_A_select_low_clock_source_apb_clock(SI32_TIMER); SI32_TIMER_A_set_low_count(SI32_TIMER,reload_value); SI32_TIMER_A_set_low_reload(SI32_TIMER,reload_value); SI32_TIMER_A_clear_low_overflow_interrupt(SI32_TIMER); NVIC_ClearPendingIRQ( TIMER1L_IRQn ); NVIC_EnableIRQ( TIMER1L_IRQn ); }
void TIMER1L_IRQHandler(void) { SI32_TIMER_A_clear_low_overflow_interrupt(SI32_TIMER_1); NVIC_ClearPendingIRQ( TIMER1L_IRQn ); exciter_cnt++; switch(exciter_state) { case EXCITER_IDLE: break; case EXCITER_BURST: if(burst_cnt < CARRIER_BURST_LEN) { wave_125k_start(); burst_cnt++; } else { wave_125k_stop(); burst_cnt = 0; preamble_cnt = 0; exciter_state = EXCITER_PREAMBLE; } break; case EXCITER_PREAMBLE: if(preamble_cnt < PREAMBLE_LEN-1) { if(preamble_cnt&0x01) { wave_125k_stop(); } else { wave_125k_start(); } preamble_cnt++; } else { if(preamble_cnt&0x01) { wave_125k_stop(); } else { wave_125k_start(); } preamble_cnt = 0; pattern_cnt = 0; pattern_temp = pattern_data; exciter_state = EXCITER_PATTERN; } break; case EXCITER_PATTERN: if(pattern_cnt < PATTERN_LEN-1) { if(pattern_temp&0x8000) { wave_125k_start(); } else { wave_125k_stop(); } pattern_temp <<= 1; pattern_cnt++; } else { if(pattern_temp&0x8000) { wave_125k_start(); } else { wave_125k_stop(); } pattern_cnt = 0; exciter_data_cnt = 0; exciter_send_index = 0; exciter_data_len = (exciter_man_data.data_len)<<3; p_exciter_send_buff = exciter_man_data.data; exciter_state = EXCITER_DATA; } break; case EXCITER_DATA: if(exciter_data_cnt < exciter_data_len) { if(!(exciter_data_cnt & 0x07)) exciter_send_temp = *p_exciter_send_buff++; if(exciter_send_temp&EXCITER_MASK) { wave_125k_start(); } else { wave_125k_stop(); } exciter_data_cnt++; exciter_send_temp <<= 1; } else { wave_125k_stop(); wave_4k_stop(); exciter_state = EXCITER_IDLE; exciter_over_event = 1; } break; } }