Запуск Timer16 в однократном или непрерывном режиме: различия между версиями
Андрей (обсуждение | вклад) Нет описания правки |
Андрей (обсуждение | вклад) Нет описания правки |
||
Строка 1: | Строка 1: | ||
В примере будет запускаться Timer16_1 в однократном или непрерывном режиме с использованием конфигуратора. | В примере будет запускаться Timer16_1 в однократном или непрерывном режиме с использованием конфигуратора. | ||
== Работа с конфигуратором (В разработке) == | |||
Для начала настроем в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроем делители шины. Так как Timer16 тактируется от шины APB_P_CLK, то зададим делители AHB_DIV и APB_P_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так: | Для начала настроем в конфигураторе тактирование mik32, например, от внешнего кварца 32МГц. Затем настроем делители шины. Так как Timer16 тактируется от шины APB_P_CLK, то зададим делители AHB_DIV и APB_P_DIV. В данном примере оставим делители по умолчанию. В итоге вкладка с тактированием должна выглядеть так: | ||
Строка 12: | Строка 13: | ||
Активный фронт задает фронт, по которому будет происходить увеличение счетчика. Эта настройка используется при внешнем источнике синхронизации. В нашем примере тактирование от внутреннего источника, поэтому эта настройка нам не нужна. | Активный фронт задает фронт, по которому будет происходить увеличение счетчика. Эта настройка используется при внешнем источнике синхронизации. В нашем примере тактирование от внутреннего источника, поэтому эта настройка нам не нужна. | ||
Следующая настройка - период. Это верхний предел, до которого считает таймер. В нашем примере таймер будет считать до максимального значения 65535. | |||
Режим обновления регистров задает когда будут обновляться регистры ARR - значение автоматической перезагрузки (верхний предел счета таймера) и CMP - значение сравнения. Выберем, например, обновление после каждого доступа к записи. | |||
Далее идут настройки триггера, которые в этом примере не нужны. Оставляем их значения по умолчанию. | |||
После этого останется настроить цифровой фильтр от помех, если он нужен. | |||
В итоге настройки таймера в конфигураторе должны выглядеть примерно так: | |||
(Объяснение работы с конфигуратором. В разработке) | (Объяснение работы с конфигуратором. В разработке) | ||
Нажимаем кнопку генерации. В итоге у нас появится проект для PlatformIo. Далее работа идет в visual studio code. | |||
== Использование библиотеки HAL_Timer16 == | |||
В сгенерированном проекте в файле main.c должна быть функция Timer16_1_Init, в которой будут заданы настройки для Timer16_1. Выглядит она так:<syntaxhighlight lang="c" line="1"> | |||
static void Timer16_1_Init(void) | static void Timer16_1_Init(void) | ||
{ | { |
Версия от 09:05, 10 февраля 2023
В примере будет запускаться 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. Выглядит она так:
static void Timer16_1_Init(void) { htimer16_1.Instance = TIMER16_1; /* Настройка тактирования */ htimer16_1.Clock.Source = TIMER16_SOURCE_INTERNAL_SYSTEM; htimer16_1.CountMode = TIMER16_COUNTMODE_INTERNAL; /* При тактировании от Input1 не имеет значения */ htimer16_1.Clock.Prescaler = TIMER16_PRESCALER_1; htimer16_1.ActiveEdge = TIMER16_ACTIVEEDGE_RISING; /* Выбирается при тактированиии от Input1 */ /* Настройка верхнего предела счета */ htimer16_1.Period = 0xFFFF; /* Настрйока режима обновления регистра ARR и CMP */ htimer16_1.Preload = TIMER16_PRELOAD_AFTERWRITE; /* Настройка тригера */ htimer16_1.Trigger.Source = TIMER16_TRIGGER_TIM1_GPIO1_9; htimer16_1.Trigger.ActiveEdge = TIMER16_TRIGGER_ACTIVEEDGE_SOFTWARE; /* При использовании триггера значение доложно быть отлично от software */ htimer16_1.Trigger.TimeOut = TIMER16_TIMEOUT_DISABLE; /* Разрешить повторное срабатывание триггера */ /* Настройки фильтра */ htimer16_1.Filter.ExternalClock = TIMER16_FILTER_NONE; htimer16_1.Filter.Trigger = TIMER16_FILTER_NONE; /* Настройка режима энкодера */ htimer16_1.EncoderMode = TIMER16_ENCODER_DISABLE; HAL_Timer16_Init(&htimer16_1); }