Запуск Timer16 в однократном или непрерывном режиме
В примере будет запускаться Timer16_1 в однократном или непрерывном режиме с использованием конфигуратора.
Работа с конфигуратором (В разработке)
Для начала настроем в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроем делители шины. Так как Timer16 тактируется от шины APB_P_CLK, то зададим делители AHB_DIV и APB_P_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так:
(Картинка тактирования из конфигуратора. В работе)
Затем перейдем к настройке самого таймера. Для этого откроем вкладку Timer16_1 и включим таймер, выбрав один из режимов. Выберем режим счетчика.
После этого нужно выбрать источник тактирования, который будет использоваться для подсчета. Выберем, например, тактирование от системной частоты. Для тактирования от внутреннего источника оставим источник синхронизации по умолчанию.
Далее следует выбрать нужный вам делитель частоты.
Активный фронт задает фронт, по которому будет происходить увеличение счетчика. Эта настройка используется при внешнем источнике синхронизации. В нашем примере тактирование от внутреннего источника, поэтому эта настройка нам не нужна.
Следующая настройка - период. Это верхний предел, до которого считает таймер. В нашем примере таймер будет считать до максимального значения 65535.
Режим обновления регистров задает когда будут обновляться регистры ARR - значение автоматической перезагрузки (верхний предел счета таймера) и CMP - значение сравнения. Выберем, например, обновление после каждого доступа к записи.
Далее идут настройки триггера, которые в этом примере не нужны. Оставляем их значения по умолчанию.
После этого останется настроить цифровой фильтр от помех, если он нужен. При включении фильтра должен использоваться внутренний источник синхронизации.
В итоге настройки таймера в конфигураторе должны выглядеть примерно так:
(Объяснение работы с конфигуратором. В разработке)
Нажимаем кнопку генерации. В итоге у нас появится проект для PlatformIo. Далее работа идет в visual studio code.
Использование библиотеки HAL_Timer16
В сгенерированном проекте в файле main.c должна быть функция Timer16_1_Init, в которой будут заданы настройки для Timer16_1. Выглядит она так:
Кроме этого в функции SystemClock_Config приведены настройки для тактирования. Убедитесь что в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_TIMER16_1_M. Сама функция должна выглядеть примерно так:
Для демонстрации вывода текста в PeriphClkInit.PMClockAPB_P присутствует PM_CLOCK_UART_0_M. У вас его может не быть так как UART нужно включить отдельно. Для этого нужно подключить библиотеки uart_lib и xprintf:
Для инициализации UART в функции main после функции тактирования SystemClock_Config следует написать:
UART_Init(UART_0, 3333, UART_CONTROL1_TE_M | UART_CONTROL1_M_8BIT_M, 0, 0);
Скорость UART задается делителем во втором аргументе функции. При такой записи скорость будет 9600 бод.
В начале main.c можно видеть объявление структуры с набором настроек для выбранного таймера, которую использует функция инициализации Timer16_1_Init.
Для запуска таймера в непрерывном режиме нужно вызвать функцию HAL_Timer16_StartContinuousMode и передать в нее адрес на структуру htimer16_1. Функция main должна выглядеть примерно так:
Если у вас включен UART, то с помощью функции xprintf и HAL_Timer16_GetCounterValue можно посмотреть текущее значение счетчика. Пример вывода изображен на рисунке 3.
Теперь зададим значение сравнения, при достижение которого будет происходить какое либо действие. Для этого нам понадобится функция HAL_Timer16_SetCMP.
Кроме этого понадобятся функции HAL_Timer16_CheckCMP для проверки флага сравнения CMPM или HAL_Timer16_WaitCMP для ожидания установки этого флага. После чего флаг CMPM нужно очистить с помощью функции HAL_Timer16_ClearCMPFlag.
На этот раз используем однократный режим счета таймера с помощью функции HAL_Timer16_StartContinuousMode.
В итоге функция main может выглядеть так:
Результат вывода представлен на рисунке 4.