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

STM32F722 не выходит из прерывания TIM3

Здравствуйте, подскажите, пожалуйста. Процессор крутится в прерывании постоянно, видимо флаг не сбрасывается?!

Хотя в документации написано, что флаг снимается после чтения флага из регистра состояния. 

/********************************************************************************
 TIM3 init function 
*******************************************************************************/
void MX_TIM3_Init(void)
{ TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};
  TIM_OC_InitTypeDef sConfigOC = {0};

  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 0x63;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
	
 if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
	
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
	
 if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)		
  {
    Error_Handler();
  }
	
 if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
  {
    Error_Handler();
  }
	
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_OC1;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
	
 if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
	
  sConfigOC.OCMode = TIM_OCMODE_PWM1;
  sConfigOC.Pulse = 6;
  sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
	
 if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
	
  HAL_TIM_MspPostInit(&htim3);
	HAL_TIM_PWM_Start_IT(&htim3, TIM_CHANNEL_1);
	
	HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(TIM3_IRQn);

} //void MX_TIM3_Init(void)



void TIM3_IRQHandler(void)
{	
 if ((TIM3->SR & TIM_FLAG_CC1) != RESET)				 /* Capture compare 1 event */
  {
    if ((TIM3->DIER & TIM_IT_CC1) != RESET)
      {			
			TIM3->SR = ~TIM_FLAG_CC1; 					 // Clear IRQ Flag
      }
  }		
		
} //void TIM3_IRQHandler(void)

 

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


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

50 минут назад, Vladimir_T сказал:

Хотя в документации написано, что флаг снимается после чтения флага из регистра состояния. 

Прямо так и написано?

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


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

Видно я не верно понимаю. А написано - CC1IF / rc_w0.

Тогда как правильно будет?

Этот бит я ведь сбрасываю в регистре состояния на выходе из прерывания.

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


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

1. Проверьте название функции обработчика прерывания.

2. Проверьте другие установленные биты в DIER, но не сброшенные в обработчике.

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


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

Название функции обработчика - 

TIM3_IRQHandler(void)

Отладчик в нее заходит. В регистре DIER только флаг  TIM_IT_CC1 установлен.

Счет обычный с перезапуском, режим PWM, параметры корректны. На выходе таймера, через PB4  сформирован нормальный, ожидаемый сигнал. 

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


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

У таймеров флаги статусов прерывания сбрасываются записью нуля. 

 

Есть одна тонкость, на высокоскоростных контроллерах команда очистки флага не должна быть в конце прерывания. Иначе, можно очистить флаг, выйти из прерывания, а он ещё физически не очистился и залетаем в прерывание снова.

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


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

4 hours ago, VladislavS said:

У таймеров флаги статусов прерывания сбрасываются записью нуля. 

Так и делаю.

TIM3->SR = ~TIM_FLAG_CC1; 					 // Clear IRQ Flag

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


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

Если у вас всегда только по одному флагу, то можно всё сильно упростить

void TIM3_IRQHandler()
{
  TIM3->SR =0;
  // Полезное действие
}

ЗЫ: Компилятор у вас случайно не в режиме С++? А то надо extern "C" void TIM3_IRQHandler().

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


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

4 hours ago, VladislavS said:

Если у вас всегда только по одному флагу, то можно всё сильно упростить


void TIM3_IRQHandler()
{
  TIM3->SR =0;
  // Полезное действие
}

 

Не помогло...

Флаг и в отладчике вручную не снимается - сразу перевзводится... 

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


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

При остановке в отладчике таймер продолжает работать. Пока вы SR считаете заново, флаг уже запросто штатным образом установится. С какой частотой он у вас должен срабатывать?

 

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


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

4 hours ago, VladislavS said:

При остановке в отладчике таймер продолжает работать. Пока вы SR считаете заново, флаг уже запросто штатным образом установится. С какой частотой он у вас должен срабатывать?

 

 1 МГц.

Привел параметры конфигурации, может что-то не так с ними..

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


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

Ну и что вы там отладчиком хотите на 1 МГц увидеть? Выводите на какую-нибудь ногу сигнал и смотрите осциллоглядом.

А вообще, 1М прерываний в секунду это жесткач...

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


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

В отладочном модуле (периферия DBG), установите бит "заморозки" тактирования модуля TIM3, чтобы при остановке отладчиком таймер не считал. И еще: прерывания с частотой 1 МГц, это, конечно, сильно. Не знаю, есть ли буфер записи системного уровня в STM32F7, но по-хорошему, перед выходом из прерывания нужно сделать фиктивное чтение из TIM3->SR или поставить барьер памяти DMB (если буфер записи есть в самом ядре CPU, чего мы, обычные смертные, видимо никогда не узнаем, т.к. эту инфу ST не предоставляет).

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


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

4 hours ago, VladislavS said:

Ну и что вы там отладчиком хотите на 1 МГц увидеть? Выводите на какую-нибудь ногу сигнал и смотрите осциллоглядом.

А вообще, 1М прерываний в секунду это жесткач...

На выходе таймера, через PB4  сформирован нормальный, ожидаемый сигнал. 

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


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

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

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

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

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

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

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

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

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

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