About STM32

Базовые таймеры STM32

Плавно начинаем осваивать периферию микроконтроллера. Сегодня на очереди таймеры в stm32.

     Таймер – штуковина, которая просто-напросто отмеряет временные промежутки. Однако авторы и разработчики микроконтроллеров добавили несколько плюшек, например, аппаратная генерация ШИМ сигнала (что это такое я немного расскажу в следующих статьях), замер длительности импульса, вызов прерывания по некоторому событию (о прерываниях тоже подробнее будет изложено в следующих статьях) и так далее.

      В микроконтроллерах от STM таймеры бывают 2-х видов:

  • Таймеры общего назначения
  • Базовые таймеры

     Таймеры общего назначения в stm32 – это такие классные штуки, которые могут кучу всего да еще и в разных режимах, поэтому ознакомление с таймерами в stm32 начнем с базовах таймеров.

Базовае таймеры в stm32 

     Эти таймеры только и делают, что отмеряют временные промежутки (кстати, именно таком таймере будет реализована адекватная реализация функции «пауза»). Базовые таймеры stm32 настраиваются всего 8 регистрами, для сравнения: таймеры общего назначения stm32 настраиваются 18 регистрами.

TIM_CR1 – control register 1
TIM_CR2 – control register 2
TIM_DIER – DMA/interrupt enable register
TIM_SR – status register
TIM_EGR – event generation register
TIM_CNT - counter
TIM_PSC - prescaler
TIM_ARR – auto reload register

      Примером будет служить базовый таймер 7 и для его запуска необходимо сделать несколько обязательных действий. И как всегда первое из них – это подача тактирования.

RCC->APB1ENR |= RCC_APB1ENR_TIM7EN;  //Подача тактирования на базовый таймер 7

      Далее следуют еще 2 обязательных действия:

     Первое - запись значения в регистр TIM7_ARR. Регистры TIM_ARR и TIM_CNT 16-ти битные, т.е. их максимально допустимое значение составляет 65535.

TIM7->ARR = 100;

      Второе - генерация события обновления регистров. Делается она записью бита UG ( update generation ) в регистр TIM7_EGR.

TIM7->EGR |= TIM_EGR_UG;

      Итак, что же это значило?

     Первым действием мы указали до какого значения будет считать счетчик TIM_CNT, в нашем случае это 100. При достижении этого значения сгенерируется событие UIF ( update interrupt flag ) в регистре TIM_SR, если конечно его генерация разрешена в регистре настроек TIM_CR1, и произойдет прерывание по переполнению, соответственно тоже только если оно разрешено TIM_DIER.

     Вторым действием мы записали это значение в регистр. Дело в том, что запись значения в регистры TIM_ARR и TIM_PSC происходит только при определенных событиях, например, переполнение счетного регистра или возникновение события обновления. Мы сгенерировали событие установив тот самый бит UG ( update generation ) в регистре TIM7_EGR.

     Настройка остальных регистров базового таймера производится лишь для корректировки его работы, например, установка предделителя тактовой частоты 1, но она не является обязательной.

     Не пугайтесь, если что-то не ясно, сейчас я все поясню на примере реализации функции «Пауза»! Но для того, чтобы таймер заработал и начал считать его необходимо включить в регистре TIM_CR1 установкой бита CEN.

      Предделитель тактовой частоты 1 – устройство, которое подает не все счетные импульсы на вход таймера, а лишь каждый второй, четвертый,  восьмой…т.е. точность счета таймера уменьшается, а время до переполнения счетного регистра увеличивается. Большие значения предделителя удобны для реализации длительных задержек, порядка нескольких секунд.

 
Хостинг от uCoz