Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

После остановки шим, на выходе 1

Вс мар 26, 2017 12:42:46

Всем привет!
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;
//======================

Re: После остановки шим, на выходе 1

Вс мар 26, 2017 16:53:23

Дело в том, что разряд CEN всего лишь управляет подачей частоты синхронизации на счётчик CNT. Но он не влияет на состояние других регистров.
Для решения проблемы я могу посоветовать отключать альтернативную функцию выхода, либо генерировать Break.
Ответить