CODE
основной код
.................
tim_init();
TIM2->CNT=15;//предустановка счетчика в пределах низкой фазы
pulses_cnt=2;// количество импульсов
TIM_Cmd(TIM2,ENABLE); // запускаем счёт
}
//**************************************************************************
void TIM2_IRQHandler()
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC3) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_CC3);
GPIO_ResetBits(GPIOE, GPIO_Pin_9);// сброс по COMPARE
pulses_cnt--;
if(pulses_cnt==0)TIM_Cmd(TIM2, DISABLE);
}
if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIO_SetBits(GPIOE, GPIO_Pin_9); // фронт по UPDATE
}
}
//****************************************************************************
void tim_init(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_OCStructInit(&oc_init);
oc_init.TIM_OCMode = TIM_OCMode_PWM1; // работаем в режиме ШИМ ( PWM )
oc_init.TIM_OutputState = TIM_OutputState_Enable;
oc_init.TIM_Pulse = 10; //
oc_init.TIM_OCPolarity = TIM_OCPolarity_High; // положительная полярность
TIM_OC3Init(TIM2,&oc_init);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Disable);
TIM_TimeBaseStructInit(&base_timer);
base_timer.TIM_Prescaler = 84 - 1; // делитель частоты
base_timer.TIM_Period = 50-1; // период
base_timer.TIM_CounterMode = TIM_CounterMode_Up; // счёт вверх
TIM_TimeBaseInit(TIM2, &base_timer);
TIM_ITConfig(TIM2, TIM_IT_CC3 | TIM_IT_Update, ENABLE);
TIM_ARRPreloadConfig(TIM2,DISABLE);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
NVIC_EnableIRQ(TIM2_IRQn);
}
В итоге получаю следующую картинку.
Красный - мой вывод PWM, с двумя требуемыми импульсами, но перед ними влезает какой-то мелкий пик природу появления которого я не могу понять. Желтым цветом вывожу прерывания таймера - нарастающий фронт соответсвует событию таймера UPDATE, спадающий - COMPARE. Видно, что при первом прерывании update PWM как и требуется поднимается в 1, но почему-то тут же падает в 0 через странные 1.6 мкс и взводится опять через 35 мкс. После вывод PWM начинает работать как и планировалось. Теоретически можно отрубить первый мусорный импульс, но это костыль. Хотелось бы понять почему я в трех соснах заблудился.