Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Флаги прерываний таймера stm32f103
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
GMVM
Здравствуйте!Пишу программу в которой используются 3 канала таймера. В прерывании анализирую флаги которые устанавливаются в SR.1 и 3 каналы установлены на захват, канал 2 на выходное сравнение. В процессе работы программы, канал 2 и 3 должны отключаться. Возникла проблема: я могу отключить их от прерываний, могу отключить выход 2 таймера, но флаги прерываний все равно устанавливаются. И тогда если я захожу в прерывание по 1-му каналу, то обрабатываются и остальные. Можно как-то отключать установку флагов или придется искать другой путь?

вот код настройки таймера и упрощенное прерывание
CODE
/*Конфигурация таймера 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; // включаем счетчик, разрешаем авто-перезагрузку


CODE
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++;
}
}
VladislavS
А чего там искать? Обычная практика маскировать
Код
  unsigned int status=AT91C_BASE_US1->US_CSR;
  status&=AT91C_BASE_US1->US_IMR;

А дальше работай со status точно так же как раньше.
GMVM
А, т.е это фактически нужно будет в прерывании заводить еще одно условие, в котором проверять отключены ли каналы от прерывания, и если отключены, то сбрасывать флаги этих прерываний? А вообще отменить установку флагов никак?
VladislavS
Зачем условие? Посмотри мой пример. Он от другой железки, но смысл не меняется. Накладываешь маску логическим AND и всё. Твоя задача только найти где взять эту маску. Либо она есть аппаратная в твоём чипе (кури даташит), либо переменную заведёшь под маску.
GMVM
Все сообразил, спасибо) Жаль конечно что не отключить флаги, было бы проще)
GMVM
Что-то у меня не заладилось с таймером.Теперь такая проблема: настраиваю канал1 таймера 1 на выход с переключателем(toggle). Вроде все по даташиту
CODE
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 в единицу.
по даташиту
CODE
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
Разобрался)) Не был установлен бит MOE.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.