В данном уроке мы рассмотрим работу таймера (TIM1) от внешнего тактирования, для этого в графе Clock Sourse выберем тип тактирования ETR2:
После данного действия у нас появится ножка настроенная на вход (PA12), для приема сигнала тактирования из вне:
Настройка раздела clock:
Clock Filter — фильтр входного сигнала, с помощью него можно отсеивать шум, дребезг. То есть по истечении времени, которое мы выставим сигнал останется не измененным, микроконтроллер принимает решение, что это истинный сигнал, а не помеха или шум. Частота и количество сэмплов (выборок) задается цифрами от 0 до 15, которые соответствуют следующим параметрам:
0 фильтр не используется.
1 fSAMPLING=fCK_INT, N=2.
2 fSAMPLING=fCK_INT, N=4.
3 fSAMPLING=fCK_INT, N=8.
4 fSAMPLING=fDTS/2, N=6.
5 fSAMPLING=fDTS/2, N=8.
6 fSAMPLING=fDTS/4, N=6.
7 fSAMPLING=fDTS/4, N=8.
8 fSAMPLING=fDTS/8, N=6.
9 fSAMPLING=fDTS/8, N=8.
10 fSAMPLING=fDTS/16, N=5.
11 fSAMPLING=fDTS/16, N=6.
12 fSAMPLING=fDTS/16, N=8.
13 fSAMPLING=fDTS/32, N=5.
14 fSAMPLING=fDTS/32, N=6.
15 fSAMPLING=fDTS/32, N=8.
Для тех, кто хочет детально разобраться в данных коэффициентов могут обратиться к официальной документации: AN4776.
Clock Polarity — выбор фронта тактирования, если non inverted — тактирование по переднему фронту, если inverted — тактирование по заднему фронту.
Clock Prescaler — делитель входного сигнала, мы поставим 0, то есть сигнал будет напрямую, без деления поступать на вход таймера. Делитель нам нужен если, частота сигнала выше допустимой. Для нормальной работы таймера, входная частота таймера должна быть как минимум в три раза меньше частоты тактирования самого таймера. То есть, при частоте тактирования таймера в 72Мгц, максимальная входная частота не должна быть выше 24мГц. Если у нас входная частота равна 50мГц, при выборе коэффициента пред делителя =4, мы на входе таймера получаем 12,5мГц, что уже допустимо для нормальной работы таймера.
В конце не забываем включить прерывание:
Для проверки работы нашего таймера, мы для начала оставим код с Урока №20:
/* USER CODE BEGIN 0 */ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim->Instance == TIM1) { HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); } } /* USER CODE END 0 */
Здесь мы по прежнему при срабатывании прерывания меняем значение светодиода на противоположное.
/* USER CODE BEGIN 3 */ HAL_GPIO_WritePin(GPIOA, out_Pin,GPIO_PIN_RESET); HAL_Delay(50); HAL_GPIO_WritePin(GPIOA, out_Pin,GPIO_PIN_SET); HAL_Delay(50); } /* USER CODE END 3 */
В данном коде, мы «дрыгаем » ножкой out_Pin (PA6), которая настроена на выход:
Теперь нам надо с ножки PA6 (out) подать импульсы на вход таймера (PA12). После этого наш светодиод начнет моргать. Импульсы (фронт) на вход подаются каждые 100мс (10 Гц), считаем до 10 — получаем, что наш светодиод будет менять свое положение раз в 1с (1Гц).