реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Флаги прерываний таймера stm32f103, Как отключить их установку?
GMVM
сообщение May 15 2011, 12:59
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 4-07-10
Пользователь №: 58 276



Здравствуйте!Пишу программу в которой используются 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++;
}
}


Сообщение отредактировал IgorKossak - May 15 2011, 13:09
Причина редактирования: сократил длинные строки
Go to the top of the page
 
+Quote Post
VladislavS
сообщение May 15 2011, 13:18
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



А чего там искать? Обычная практика маскировать
Код
  unsigned int status=AT91C_BASE_US1->US_CSR;
  status&=AT91C_BASE_US1->US_IMR;

А дальше работай со status точно так же как раньше.
Go to the top of the page
 
+Quote Post
GMVM
сообщение May 15 2011, 13:37
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 4-07-10
Пользователь №: 58 276



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

Сообщение отредактировал GMVM - May 15 2011, 13:38
Go to the top of the page
 
+Quote Post
VladislavS
сообщение May 15 2011, 13:41
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Зачем условие? Посмотри мой пример. Он от другой железки, но смысл не меняется. Накладываешь маску логическим AND и всё. Твоя задача только найти где взять эту маску. Либо она есть аппаратная в твоём чипе (кури даташит), либо переменную заведёшь под маску.
Go to the top of the page
 
+Quote Post
GMVM
сообщение May 15 2011, 13:50
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 4-07-10
Пользователь №: 58 276



Все сообразил, спасибо) Жаль конечно что не отключить флаги, было бы проще)
Go to the top of the page
 
+Quote Post
GMVM
сообщение May 15 2011, 19:06
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 4-07-10
Пользователь №: 58 276



Что-то у меня не заладилось с таймером.Теперь такая проблема: настраиваю канал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 - May 15 2011, 19:08
Go to the top of the page
 
+Quote Post
GMVM
сообщение May 16 2011, 09:19
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 30
Регистрация: 4-07-10
Пользователь №: 58 276



Разобрался)) Не был установлен бит MOE.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 08:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01404 секунд с 7
ELECTRONIX ©2004-2016