Базовые таймеры 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 и для его запуска необходимо сделать несколько обязательных действий. И как всегда первое из них – это подача тактирования.
Далее следуют еще 2 обязательных действия:
Первое - запись значения в регистр TIM7_ARR. Регистры TIM_ARR и TIM_CNT 16-ти битные, т.е. их максимально допустимое значение составляет 65535.
Второе - генерация события обновления регистров. Делается она записью бита UG ( update generation ) в регистр TIM7_EGR.
Итак, что же это значило?
Первым действием мы указали до какого значения будет считать счетчик 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 – устройство, которое подает не все счетные импульсы на вход таймера, а лишь каждый второй, четвертый, восьмой…т.е. точность счета таймера уменьшается, а время до переполнения счетного регистра увеличивается. Большие значения предделителя удобны для реализации длительных задержек, порядка нескольких секунд.