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

Отчет временного интервала таймером tim16 в stm32h743

Бит URS тоже не дал результата (. Прерывание вызывается ложно в регистре sr бит TIM_SR_UIF установлен в '1'.  

 Вот код :

Скрытый текст

    TIM16->CR1 = TIM_CR1_OPM | TIM_CR1_URS;
    TIM16->DIER = TIM_DIER_UIE;
    TIM16->PSC = 11520 - 1;
    TIM16->ARR = 20;
    TIM16->CNT = 0;
    TIM16->CCR1 = 0;
    TIM16->RCR = 1 - 1;
    TIM16->SR = 0;
    TIM16->SR &= ~TIM_SR_UIF;

	//MODIFY_REG(TIM16->CCMR1,TIM_CCMR1_OC1M, 1 << TIM_CCMR1_OC1M_Pos);

	NVIC_SetPriority(TIM16_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 0, 0)); // включение прерывания таймера TIM16
	NVIC_ClearPendingIRQ(TIM16_IRQn); // гарантированый сброс флга прирывания
    NVIC_EnableIRQ(TIM16_IRQn);

    TIM16->CR1 |= TIM_CR1_CEN;

 

Не понимаю почему происходит установка бита 'TIM_SR_UIF'. 

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


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

TIM16->SR = 0;

Вот так лучше.

Quote

TIM16->CNT = 1;

Вот так еще попробуйте проинициализировать.

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


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

пробовал все равно ложное срабатывание. 

Скрытый текст

    TIM16->CR1 = TIM_CR1_OPM | TIM_CR1_URS;
    TIM16->DIER = TIM_DIER_UIE;
    TIM16->PSC = 11520 - 1;
    TIM16->ARR = 20;
    TIM16->CNT = 1;
    TIM16->CCR1 = 0;
    TIM16->RCR = 1 - 1;
    TIM16->SR = 0;

 

 

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


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

Цитата

Это что?

В регистре CR1 установка битов OPS и URS 

Скрытый текст

#define TIM_CR1_URS_Pos           (2U)
#define TIM_CR1_URS_Msk           (0x1UL << TIM_CR1_URS_Pos)                   /*!< 0x00000004 */
#define TIM_CR1_URS               TIM_CR1_URS_Msk                              /*!<Update request source */
#define TIM_CR1_OPM_Pos           (3U)
#define TIM_CR1_OPM_Msk           (0x1UL << TIM_CR1_OPM_Pos)                   /*!< 0x00000008 */
#define TIM_CR1_OPM               TIM_CR1_OPM_Msk    

 

В регистре DIER установка прерывания по перезагрузки. 

Скрытый текст

#define TIM_DIER_UIE_Pos          (0U)
#define TIM_DIER_UIE_Msk          (0x1UL << TIM_DIER_UIE_Pos)                  /*!< 0x00000001 */
#define TIM_DIER_UIE              TIM_DIER_UIE_Msk                             /*!<Update interrupt enable */

 

 

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


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

2 часа назад, Alex_Golubev сказал:

установка битов

А с соседними битами что?

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


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

нули достаются. 

Мне подсказали что нужно делать вот так:

Скрытый текст
Цитата


    TIM16->EGR = TIM_EGR_UG;
    TIM16->SR;
    TIM16->SR = 0;

 

 

Вроде помогло. Еще не до конца проверил. Но пока работает.

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

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


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

Это все потому что некоторые регистры буферизируются и их обновление идет при событии Update. TIM16->EGR = TIM_EGR_UG; как раз программно и делает этот Update.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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