 
#include "stm8s.h"


@far @interrupt void tim1_CC1_Interrupt (void)
{
	TIM1_ClearITPendingBit(TIM1_IT_CC1);
	GPIO_WriteReverse(GPIOE,GPIO_PIN_5);

	//TIM1_ClearFlag(TIM1_FLAG_CC1);
}


main()
{

	CLK_HSECmd(ENABLE);
	CLK_ClockSwitchCmd(ENABLE);
	CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_ENABLE); //Включение HSE=16MHz
	
	GPIO_Init(GPIOE, GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);
	GPIO_WriteHigh(GPIOE, GPIO_PIN_5); //пин PE5 для тестов процедур задержек
	
	GPIO_Init(GPIOC, GPIO_PIN_1, GPIO_MODE_OUT_PP_HIGH_FAST); // пин PC1 для TIM1_CH1
	GPIO_Init(GPIOB, GPIO_PIN_0, GPIO_MODE_OUT_PP_HIGH_FAST); // пин PB0 для TIM1_CH1N
	
	TIM1_DeInit();
/*	
	TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,19,0);
	TIM1_OC1Init(TIM1_OCMODE_PWM1,TIM1_OUTPUTSTATE_ENABLE,TIM1_OUTPUTNSTATE_ENABLE,6,
                  TIM1_OCPOLARITY_LOW,
                  TIM1_OCNPOLARITY_LOW,
                  TIM1_OCIDLESTATE_RESET,
                  TIM1_OCIDLESTATE_RESET);
	
	//TIM1->EGR |= TIM1_EGR_UG;
	TIM1_CtrlPWMOutputs(ENABLE);
*/
	TIM1->CNTRH = TIM1_CNTRH_RESET_VALUE;
	TIM1->CNTRL = TIM1_CNTRL_RESET_VALUE;
    TIM1->ARRH = 0x00;       //  Reload counter = 20
    TIM1->ARRL = 0x13;
    TIM1->PSCRH = 0;         //  Prescalar = 0 (i.e. 1)
    TIM1->PSCRL = 0;
    TIM1->CR1 &= 0x8f;       //  Счет вверх, выравнивание по краю.
    TIM1->RCR = 0;           //  Счетчик повторений = 0 (No repetition).

    TIM1->CCMR1 |= TIM1_CCMR_OCM; //0x70; //  Счет вверх, режим PWM2.
	TIM1->CCMR1 |= TIM1_CCMR_OCxPE; // 0x08
	//TIM1->CCMR1 |= TIM1_CCMR_OCxFE; // 0x04
	
	TIM1->CCER1 |= 0x03; // Бит 0: "CC1E" = 1 Канал сравнения1 включен. 
						// Бит 1: "CC1P" = 1 Активный уровень "OC1" низкий.
    
	TIM1->CCR1H = 0x00;// Старший байт значения сравнения
    TIM1->CCR1L = 0x0e;// Значение 0x07 для лог."0", значение 0x0e для лог."1"
	
    TIM1->BKR |= TIM1_BKR_MOE;       //  Enable the main output.
	
	TIM1_ITConfig(TIM1_IT_CC1,ENABLE); //TIM1->IER |= 0x02;
	TIM1_ClearFlag(TIM1_FLAG_CC1); //TIM1_FLAG_UPDATE

	TIM1->CR1 |= TIM1_CR1_CEN; //запуск таймера
	enableInterrupts();

    while (1){};
}