Работать мы будем с таймеров TIM1 (частота тактирования шины 72МГц ).
Для включение таймера необходимо активировать его в закладке Timers:
А так же активируем первый канал:
Данный выход подключается к ножке PA8:
Теперь переходим к закладке Counter Settings(рассмотрим пока те значения которые нам нужны) :
Prescaler — предделитель системной частоты таймера. То есть, записав в него значение, мы уменьшим тактовую частоту на данное число.
При настройках всех величин необходимо помнить, что счет начинается не с 1, а с 0. Таким образом, если мы хотим поделить на 72, нам необходимо записать число в предделитель равное 71.
Counter Period — Число до которого будет считать счетчик. Если мы хотим, что бы счетчик считал до числа 500, нам необходимо записать 499.
Теперь нам необходимо настроить наш канал на работу:
Режим Mode имеет следующие значения:
Toggle on match — в момент сравнения на пине будет происходить смена уровня.
Frozen — в момент сравнения состояние вывода не изменяется.
Active Level on match — в момент сравнения на выходе подается высокий уровень и больше не изменяется.
Inactive Level on match — в момент сравнения на выходе подается низкий уровень и больше не изменяется.
Forced Active — на выход сразу подается высокий уровень и больше не изменяется.
Forced Inactive — на выход сразу подается низкий уровень и больше не изменяется.
В Pulse записывается значение сравнения.
После генерации проекта нам необходимо добавить следующий код:
/* USER CODE BEGIN 2 */ HAL_TIM_OC_Start_IT(&htim1, TIM_CHANNEL_1); /* USER CODE END 2 */
В данном уроке мы рассмотрим настройку таймеров, их особенности и настроем прерывание от таймера TIM1.
Для включение таймера необходимо активировать его в закладке Timers:
Далее выбираем в закладке Clock Source выбираем Internal Clock. Тем самым мы подключим к счетчику внутреннее тактирование, при этом надо помнить, что в данном микроконтроллера таймер TIM1 тактируется от линии APB2 timer clock, остальные таймера тактируются от шины APB1 timer clock.
В данном случаи я поставил частоту тактирования шины 72МГц .
Далее переходим к закладке Counter Settings:
Prescaler — предделитель системной частоты таймера. То есть, записав в него значение, мы уменьшим тактовую частоту на данное число.
При настройках всех величин необходимо помнить, что счет начинается не с 1, а с 0. Таким образом, если мы хотим поделить на 72, нам необходимо записать число в предделитель равное 71.
Counter Mode:
UP — счетчик будет считать снизу вверх, до значения переполнения.
DOWN — счетчик будет считать вниз, от значения до нуля. Ноль в данном случаи и есть значение переполнения.
Center Aligned — используется для ШИМ, более детально рассмотрим в других уроках.
Counter Period — Число до которого будет считать счетчик. Если мы хотим, что бы счетчик считал до числа 500, нам необходимо записать 499.
Internal Clock Division — делитель системной частоты таймера для формирования вспомогательного тактового сигнала, который используется в цифровых фильтра и для времени запаздывания в работе ШИМ. Более детально рассмотрим в других уроках.
Repetition Counter — Значение прерываний счетчика, при котором должно произойти события. То есть, если стоит 0, то при первом прерывании счетчика будет сразу вызываться прерывание, если стоит например 2, то прерывание будет вызываться после (2+1) переполнения.
Auto-reload preload — Если данное значение не активно, то при изменении числа counter period, оно сразу меняется. Если данное значение активно, то изменения вступят только после переполнения счетчика.
И так, что у нас получилось: мы поделили входящую частоту на 720, 72000000/720 = 100кГц. Далее установили значение до которого будет считать таймер — 5000.
И того, прерывание будет происходит каждые 50мс. Далее мы установили, что прерывание будет срабатывать через 25 переполнений, и того у нас выходит, что светодиод мы будем включаться и выключаться раз в 50*25 = 1250мс.
Далее мы включаем прерывание:
Настраиваем ножку PA5 на выход:
Теперь, мы можем генерировать наш проект, и после генерации записать следующий код:
/* USER CODE BEGIN 2 */ HAL_TIM_Base_Start_IT(&htim1); // включаем прерывание /* USER CODE END 2 */ /* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { // функция которая обрабатывает наше прерывание if(htim->Instance == TIM1) { //проверяем, что прерывание произошло именно от таймера TIM1 HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); // мигаем светодиодом, который расположен на отладочной плате. } } /* USER CODE END 0 */
Как видно с этого кода, мы для проверки работы нашего таймера мигаем светодиодом, который подключен к ножке PА5 на отладочной плате.