Страница 1 из 1

Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 18:17:51
RUNA
Доброго времени суток.
Переменная 1 = 250.
Переменная 2 = 36000.
1-Загружаю в ARR переменную 2, жду прерывание, останавливаю таймер.
2-Загружаю в ARR переменную 1, жду прерывание, останавливаю таймер.
3-Пауза на 3мСек.
4-Загружаю в ARR переменную 2, жду прерывание, останавливаю таймер.(Здесь проблема)
5-Загружаю в ARR переменную 1, жду прерывание, останавливаю таймер.
6-Пауза на 3мСек.
И далее все повторяется.
Проблема в том что на шаге 4 прерывание всегда срабатывает раньше чем должно быть .

void TIM11_Init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_TIM11EN;
TIM11->CR1 = 0;
TIM11->PSC = 9;
TIM11->ARR = 0;
TIM11->DIER |= TIM_DIER_UIE;
NVIC_EnableIRQ(TIM1_TRG_COM_TIM11_IRQn);
NVIC_SetPriority(TIM1_TRG_COM_TIM11_IRQn, 0);
}

void StartTIM11(uint16_t tim)
{
TIM11->ARR = tim;
TIM11->CR1 |= TIM_CR1_CEN; // Включить счётчик
}
void StopTIM11(void)
{
TIM11->CR1 &=~ TIM_CR1_CEN;
}

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 18:41:30
Rapra
А насколько раньше?

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 18:56:12
RUNA
Из 8.4мС которые должны быть на 1.4 мСек меньше.

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 19:07:08
u37
перед п4 не забудьте сбросить прерывание от п2.
И вообще, играть в игру +/-1 это гнустнейшее что может быть. PSC 10 - оно вам так_прям_надо

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 19:14:57
veso74
Кто запускает функции StartTIM11(uint16_t tim) и StopTIM11()?
Дайте прогр. код для TIM11 IRQHandler?
Где именно реализуете паузу в 3 ms?

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 19:21:47
Rapra
Нужно перед запуском таймера программно занулить счетчик, присвоив ему CNT = 0, потому что вот не факт, что при остановке счетчика там всё еще остается 0.
В регистре ARR, так же как и в PSC, действует правило "значение минус 1", потому что счет начинается с 0.

Можно поступить иначе. ARR настроить на 36000-1 + 3 мс, а для интервалов 36000 и 250 использовать регистры сравнения CCRx

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 19:45:06
RUNA
CNT обнулял, не помогло.
void TIM1_TRG_COM_TIM11_IRQHandler(void)//
{
if (TIM11->SR & TIM_SR_UIF)
{
TIM11->SR &=~ TIM_SR_UIF;
TIM11->CNT =0 ;
StopTIM11();
UpravlenieTIM11();
}
}

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 19:47:20
RUNA
Rapra писал(а): Ср окт 21, 2026 19:21:47 Можно поступить иначе. ARR настроить на 36000-1 + 3 мс, а для интервалов 36000 и 250 использовать регистры сравнения CCRx
А вот это попробую.

Re: Проблема с TIM11 STM32F401RCT6

Добавлено: Ср окт 21, 2026 20:24:54
Zapolyarny
RUNA писал(а): Ср окт 21, 2026 19:45:06 TIM11->CNT =0 ;
StopTIM11();
мне кажется, немного не та очерёдность.