Всем привет!
stm32f10x
Есть два таймера. По некоему событию, запускаются оба таймера. Первый таймер(Т14) тикает до 5 секунд и уходит в прерывание по переполнению. Второй таймер(Т15) генерит шим для светодиода. То есть пока тикает первый таймер, второй моргает светодиодом. В обработчике прерывания первого таймера я останавливаю и первый и второй таймер. Проблема состоит в том, что иногда, не всегда, после остановки шим, светодиод остаётся гореть постоянно.
Код:
void TIM14_IRQHandler(void){ //ring off
if(TIM14->SR & TIM_SR_UIF){
TIM14->SR &= ~TIM_SR_UIF;
}
TIM14->CR1 &= ~TIM_CR1_CEN;
TIM15->CR1 &= ~TIM_CR1_CEN;
stop_ring = 1;
ring = 0;
}
//========Control ring(TIMER14)===========
RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM14EN;
TIM14->PSC |= 23999; //Prescaler 24000 - 1/ Clock timer 1 kHz
TIM14->ARR = 5000; //Count up to 5000/ 5 sec/interrupt
TIM14->EGR |= TIM_EGR_UG; //Вызываем Update Event что бы таймер не уходил в прерывание сразу после старта
__nop();
__nop();
TIM14->SR &= ~(TIM_SR_UIF);
TIM14->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ(TIM14_IRQn);
//======================
//=========Lamp blink ring(TIMER15)=======
RCC->APB2ENR |= RCC_APB2ENR_TIM15EN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_AFIOEN;
AFIO->MAPR2 |= AFIO_MAPR2_TIM15_REMAP;
GPIOB->CRH &= ~GPIO_CRH_CNF15_0;
GPIOB->CRH |= GPIO_CRH_MODE15_0 | GPIO_CRH_CNF15_1; //15 pin port B - altoutPP 10 mHz
TIM15->PSC = 24000;
TIM15->ARR = 300;
TIM15->CCER |= TIM_CCER_CC2E; // Настраиваем таймер на использование 2 канала (т.е. контакта PB15 remap)
TIM15->CCMR1 |= TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2;
TIM15->BDTR |= TIM_BDTR_AOE;
TIM15->CCR2 = 100;
//======================