Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

[РЕШЕНО]Не обновляются теневые регистры PSC м ARR

Ср сен 25, 2019 14:50:04

Добрый день, форумчане.
Не получается сделать сброс при первом запуске таймера TIM1 на микроконтроллере stm32f030f4p6, т.е. при первом запуске не выдерживается задержка.
Код:
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;

NVIC_SetPriority(TIM1_BRK_UP_TRG_COM_IRQn, 1);
NVIC_EnableIRQ(TIM1_BRK_UP_TRG_COM_IRQn);

TIM1->PSC = 48 - 1;
TIM1->ARR = 20 - 1;
TIM1->EGR |= TIM_EGR_UG;
TIM1->SR &= ~TIM_SR_UIF;
TIM1->DIER |= TIM_DIER_UIE;
TIM1->CR1 |= TIM_CR1_CEN;


После установки бита UG получаю событие UIF, т.е. должны были бы обновиться регистры, но на самом деле первая задержка генерируется не 20мкс, а 89мкс. После этого идет уже 20мкс. В прерывании пока дергаю выход, чтобы можно было отследить анализатором.

Где может быть косяк?
Спасибо.
Вложения
image.png
(28.62 KiB) Скачиваний: 263
Последний раз редактировалось gruffi Ср сен 25, 2019 15:22:54, всего редактировалось 1 раз.

Re: Не обновляются теневые регистры PSC м ARR

Ср сен 25, 2019 15:13:16

TIM_EGR_UG нужен только в том случае, если вы используете TIM_CR1_ARPE. Без этого бита содержимое ARR изменяется сразу же, как только вы туда что-то записали.
Но если таймер уже тикает, а записали число меньше, чем уже натикало, то дотикает до самого конца, и лишь потом будет уже до вашего значения считать.

А у вас на тестовой ноге внешняя верхняя подтяжка? И какое значение по умолчанию при инициализации выставляется?
Просто выглядит так, как будто бы как раз эти ~89мс — длительность инициализации остальной периферии. По окончанию вы искусственно генерируете ваш UG, в результате нога переходит в 1, а дальше уже работает сам таймер.

Re: Не обновляются теневые регистры PSC м ARR

Ср сен 25, 2019 15:22:05

Спасибо большое. Попали в точку :). Подтяжка к питанию и при включении выход сброшен. Установил выход и теперь задержка в норме.
Ответить