Пример #1
0
/*
 * 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);
}
Пример #2
0
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  );
}
Пример #3
0
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;
	}
}