Перейти к содержанию
    

Флаги прерываний таймера stm32f103

Здравствуйте!Пишу программу в которой используются 3 канала таймера. В прерывании анализирую флаги которые устанавливаются в SR.1 и 3 каналы установлены на захват, канал 2 на выходное сравнение. В процессе работы программы, канал 2 и 3 должны отключаться. Возникла проблема: я могу отключить их от прерываний, могу отключить выход 2 таймера, но флаги прерываний все равно устанавливаются. И тогда если я захожу в прерывание по 1-му каналу, то обрабатываются и остальные. Можно как-то отключать установку флагов или придется искать другой путь?

 

вот код настройки таймера и упрощенное прерывание

 /*Конфигурация таймера TIM1*/

 TIM1->PSC = 0x0;  // установка делителя счетчика
 TIM1->ARR = 0xFFFF; //установка макс. значения регистра счетчика

 TIM1->CCMR1 &= ~TIM_CCMR1_CC1S;	// отчищаем флаги
 TIM1->CCMR1 |= TIM_CCMR1_CC1S_0;  //
 TIM1->CCMR1 &= ~TIM_CCMR1_IC1F;
 TIM1->CCMR1 |= (TIM_CCMR1_IC1F_2|TIM_CCMR1_IC1F_3);
 TIM1->CCER |= TIM_CCER_CC1P;
 TIM1->CCER &= ~TIM_CCMR1_IC1PSC;
 TIM1->CCER |= TIM_CCER_CC1E;
 TIM1->DIER |= TIM_DIER_CC1IE|TIM_DIER_UIE;
 	//канал 2
 TIM1->CCR2 = 0xFFE;					//записываем значение в регистр сравнения
 TIM1->CCMR1|=(TIM_CCMR1_OC2M_0|TIM_CCMR1_OC2M_1);	// устанавливаем выход таймера в режим переключателя
 TIM1->CCER|= TIM_CCER_CC2E;
 TIM1->DIER |= TIM_DIER_CC2IE;  

 //канал 3	   
 TIM1->CCMR2 &= ~TIM_CCMR2_CC3S;	// отчищаем флаги
 TIM1->CCMR2 |= TIM_CCMR2_CC3S_0;  //
 TIM1->CCMR2 &= ~TIM_CCMR2_IC3F;
 TIM1->CCMR2 |= (TIM_CCMR2_IC3F_2|TIM_CCMR2_IC3F_3);
 TIM1->CCER |= TIM_CCER_CC3P;
 TIM1->CCER &= ~TIM_CCMR2_IC3PSC;
 TIM1->CCER |= TIM_CCER_CC3E;
 TIM1->DIER |= TIM_DIER_CC3IE|TIM_DIER_UIE;   


 TIM1->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE;	// включаем счетчик, разрешаем авто-перезагрузку 

 

void TIM1_CC_IRQHandler(void)
{
if(TIM1->SR&TIM_SR_CC1IF)
{
 TIM1->SR &=~TIM_SR_CC1IF;
 cc1++;
}
if(TIM1->SR&TIM_SR_CC2IF)
{
 TIM1->SR &=~TIM_SR_CC2IF;
 cc2++;
}
if(TIM1->SR&TIM_SR_CC3IF)
{
 TIM1->SR &=~TIM_SR_CC3IF;
 cc3++;
}
}

Изменено пользователем IgorKossak
сократил длинные строки

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чего там искать? Обычная практика маскировать

  unsigned int status=AT91C_BASE_US1->US_CSR;
  status&=AT91C_BASE_US1->US_IMR;

А дальше работай со status точно так же как раньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А, т.е это фактически нужно будет в прерывании заводить еще одно условие, в котором проверять отключены ли каналы от прерывания, и если отключены, то сбрасывать флаги этих прерываний? А вообще отменить установку флагов никак?

Изменено пользователем GMVM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Зачем условие? Посмотри мой пример. Он от другой железки, но смысл не меняется. Накладываешь маску логическим AND и всё. Твоя задача только найти где взять эту маску. Либо она есть аппаратная в твоём чипе (кури даташит), либо переменную заведёшь под маску.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то у меня не заладилось с таймером.Теперь такая проблема: настраиваю канал1 таймера 1 на выход с переключателем(toggle). Вроде все по даташиту

 TIM1->PSC = 7200-1;  // установка делителя счетчика
 TIM1->ARR = 0xFFF; 		      //установка макс. значения регистра счетчика
 TIM1->CR1 |= TIM_CR1_CEN | TIM_CR1_ARPE;	 // включаем счетчик, разрешаем авто-перезагрузку
 TIM1->CCR1 = 0xFFE;				         //записываем значение в регистр сравнения
 TIM1->CCMR1|=(TIM_CCMR1_OC1M_0|TIM_CCMR1_OC1M_1);		// устанавливаем выход таймера в режим переключателя
 TIM1->CCER|= TIM_CCER_CC1E;

, но на выходе ничего не происходит.

Сигнал начинает идти только когда ставлю бит TIM_CCER_CC1E в ноль, а TIM_CCER_CC1P в единицу.

по даташиту

Bit 1 CC1P: Capture/Compare 1 output polarity
CC1 channel configured as output:
0: OC1 active high
1: OC1 active low
CC1 channel configured as input:
This bit selects whether IC1 or IC1 is used for trigger or capture operations.
0: non-inverted: capture is done on a rising edge of IC1. When used as external trigger, IC1 
is non-inverted.
1: inverted: capture is done on a falling edge of IC1. When used as external trigger, IC1 is 
inverted.
Note:This bit is not writable as soon as LOCK level 2 or 3 has been programmed (LOCK bits 
in TIMx_BDTR register).
Bit 0 CC1E: Capture/Compare 1 output enable
CC1 channel configured as output:
0: Off - OC1 is not active. OC1 level is then function of MOE, OSSI, OSSR, OIS1, OIS1N 
and CC1NE bits.
1: On - OC1 signal is output on the corresponding output pin depending on MOE, OSSI, 
OSSR, OIS1, OIS1N and CC1NE bits.
CC1 channel configured as input:
This bit determines if a capture of the counter value can actually be done into the input 
capture/compare register 1 (TIMx_CCR1) or not.
0: Capture disabled.
1: Capture enabled

т.е по идее я выключаю выходной сигнал а он наоборот появляется, причем таймер 5 с настройками выше работает как надо. Кто работал с этими таймерами подскажите в чем ошибка.

Изменено пользователем GMVM

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...