Прерывание по переполнению

Основной блок таймера состоит из:

  • Регистра счета TIMx_CNT
  • Регистра предделителя TIMx_PSC
  • Регистра автозагрузки TIMx_ARR

Регистр автозагрузки является предзагруженным. Т.е. при операциях с ним происходит чтение/запись копии. Запись этого значения в теневой регистр происходит либо мгновенно, либо по событию обновления. Тактирование счетчика осуществляется ч/з предделитель. Регистр предделителя 16-битный и позволяет заносить в него любое значение от 0 до 65535. Это свойство позволяет гибко настраивать частоту для таймера. Фактическое же значение предделителя получается значение регистра TIMx_PSC + 1.

Вот пример работы таймера при настройка по умолчанию(предделитель равен 1):

При изменение частоты предделителя, происходит задержка в то количество тактов которое равно новому значению пределителя (в примере происходит смена делителя со значения 0 в значение 1):

Для начала создадим новый проект:

nis@jane ~/stm32/f4examples/05-timers $ cp -a 00-base/ 01-ints-if-overflow

nis@jane ~/stm32/f4examples/05-timers $ cd 01-ints-if-overflow/

Начнем с определения прерываний и обработчиков в файле startup.c.

Также необходимо добавить инициализацию портов и прерываний в файле work.c.

Соберем проект и загрузим его в МК:

nis@jane ~/stm32/f4examples/05-timers/01-ints-if-overflow $ make write

Далее можно наблюдать видео работы кода:

Итак, в этом проекте мы использовали одно из многих свойств таймера - обновление и генерация событий при этом обновлении.