Таймеры общего назначения. Переполнение

В МК stm32f103c8 имеется 3 таймера общего назначения (TIM1, TIM2, TIM3) и один продвинутый (TIM1). Согласно схеме тактирования продвинутый таймер TIM1 работает на шине APB2, частота которой равна частоте системной шины SYSCLK. Базовые таймеры TIM2, TIM3 и TIM4 работают от шины APB1, частоту которой нам пришлось поделить на два, т.е. на 32 МГц. Это нужно учитывать, при работе с данными таймерами.

Разрядность таймеров — 16 бит, они они могут считать от 0 до 65535. Рассчитаем максимальное время, которое можно ими отмерить:

Не очень много, но в отличии от системного таймера SysTick на входе предусмотрен специальный блок, называемый предделителем. Он позволяет понизить частоту конкретного таймера, т.е. изменить его временное разрешение. Делается это через регистр PSC, в котором значимыми являются только первые 16 бит, т.е. он может хранить в себе всё тоже значение от 0 до 65535. Здесь стоит учитывать, что нумерация ведётся с нуля и следовательно от желаемого числа нужно отнять единицу. Для простоты поделим частоту APB1 на 32000 - 1 и посчитаем максимальное время.

Уже намного лучше, чем тот же SysTick. Говоря о счёте, стоит заметить, что таймер может считать как снизу вверх, так и сверху вниз, а может и вовсе считать ёлочкой — сначала снизу вверх, а затем сверху вниз.

Сводная таблица имеется в документации.

ТаймерРазрядностьПредлелительСчётDMAКаналыКомпл. выход
TIM116 бит1 ... 65536Вверх, вниз, вверх-внизДа4Да
TIM2, TIM2, TIM316 бит1 ... 65536Вверх, вниз, вверх-внизДа4Нет

Таблица 4, datasheet

У таймеров общего назначения довольно много регистров, аж 18 штук. Рассматривать все их мы не будем, остановимся лишь на тех, что пригодятся нам для написания задержки, т.е. вызова прерывания по переполнению счётчика.

Основные настройки таймера находятся в регистрах CR1 и CR2. Нам пригодится только один из них — CR1, бит CEN. Записав в него 0 таймер будет остановлен, записав туда 1 таймер будет включён. Трогать данный бит до полной настройки таймера не стоит.

Значение счётчика хранится в CNT. По умолчанию счётчик будет считать от 0 до значения записанного в регистре ARR. Чтобы включить прерывание по переполнению необходимо воспользоваться регистром DIER, который отвечает за прерывания и запросы к модулю DMA. Событие переполнения на английском называется update. Что бы его разрешить, необходимо записать 1 в бит UIE.

Последний регистр, который нас интересует, это регистр статуса SR. Так как обработчик прерывания всего один, а прерываний может быть несколько, по разным событиям, то как и в случае с модулем EXTI нужно вручную сбрасывать флаг произошедшего события.

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

Настройка со стандартной библиотекой периферии.

Код на можно найти на github: CMSIS.


Назад | Оглавление | Дальше