Ознакомимся с такой очень полезной и простой периферией, как простой таймер (Basic timer), в микроконтроллерах STM32F4 простыми являются таймеры TIM6 и TIM7. Вообще, редкий микроконтроллер не имеет хоть какого-нибудь таймера для точного отсчёта времени. В STM32 все таймеры похожи по основным регистрам, просто в более сложных таймерах появляются новые флаги для настройки и новые регистры для контроля их работы в разных режимах.
Так вот, что же умеет и чем является даже самый простой и примитивный таймер?
читать дальшеВо-первых, он 16-разрядный, т.е. может считать до 65535.
Во-вторых, настраиваемый предделитель входной частоты. Тоже 16 бит.
В-третьих, у него есть регистр перезагрузки - при достижении какого числа он сбрасывается в ноль и начинает считать заново.
В-четвёртых, он может выдавать сигналы для DMA и для контроллера прерываний (NVIC). Сигнал у него только один — перезагрузка таймера (update в иностранной терминологии).
В-пятых, он может быть мастером для синхронизации других таймеров. Но это уже сложности, и фиг с ними.
Ну и как бонус: режим одного импульса. То есть таймер посчитает до максимума, перезагрузится и остановится, сняв флаг разрешения работы.
Вот такое вот счастье.
Ввиду малого количества возможностей и режимов работы, регистров настройки тоже немного. Вот они:
TIMx_CR1 — регистр управления (включение, выбор режима работы: непрерывный, один импульс);
TIMx_CR2 — регистр управления;
TIMx_DIER — регистры разрешения передачи сигналов в DMA и в NVIC. Флаг разрешения прерываний;
TIMx_SR — статусный регистр (было ли переполнение);
TIMx_EGR — генерация событий, в частности для синхронизации других таймеров;
TIMx_CNT — текущее значение счётчика;
TIMx_PSC — предделитель;
TIMx_ARR — до скольки таймер считает. Это число в счётчике ещё будет встречаться, а вот больше него уже нет.
Описание их всех побитово есть в Reference Manual.
Я расскажу лишь о двух самых нужных флагах.
CEN (бит 0) из регистра TIMx_CR1. Включение счёта. Если регистр TIMx_ARR не равен нулю, то таймер при установке данного флага начинает считать.
UIE (бит 0) из регистра TIMx_DIER. Разрешение прерывания по перезагрузке (переполнению).
Порядок запуска таймера таков:
1. Подать тактирование на выбранный таймер. Через RCC. Все таймеры сидят на шине APB1, и, соответственно, включаются с помощью регистра RCC_APB1EN. Расположение битов в RM.
2. Назначить предделитель, записав необходимое число в регистр TIMx_PSC. Частота счёта будет определяться как Ftclk / (TIMx_PSC + 1). Например, если мы тактируем таймер с частотой 8 МГц, а TIMx_PSC равен 7, то частота счёта (с какой скоростью будет увеличиваться значение счётчика) будет равна 8 / (7 + 1) = 1 МГц.
3. Назначить максимальное значение счётчика, при коем он будет перезагружаться, записав его в TIMx_ARR. При наличии там нуля, таймер работать не будет.
4. Установить флаг разрешения счёта (CEN в TIMx_CR1).
После этого таймер будет прекрасно работать и считать. При этом в любой момент времени можно посмотреть текущее состояние счётчика в регистре TIMx_CNT и узнать, была ли перезагрузка, проверяя флаг UIF (из регистра TIMx_SR) и сбрасывая его.
На асме:
На си аналогично.
Пример настройки ШИМ (уже для обычного таймера TIM2) показан далее.
Интересное:
main.s
stm32f4xx.inc
Проект. << Предыдущее Следующее >>