From 1702ce6ce430a66bb7af51644b91b7c196e719d9 Mon Sep 17 00:00:00 2001 From: Alexander Date: Wed, 29 Jun 2022 11:03:02 +0300 Subject: =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D1=8E=20=D0=BD=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D0=B9=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D0=B8=D0=B9.=20=D0=9F=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D0=B0=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D1=81=D0=B8=D0=B8=20NixieClock=5Fv2.=20=D0=A0=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82,=20=D1=87=D0=B0=D1=81?= =?UTF-8?q?=D1=8B=20=D1=82=D0=B8=D0=BA=D0=B0=D1=8E=D1=82.=20=D0=95=D1=81?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D0=B1=D0=BB=D0=B5=D0=BC=D0=B0?= =?UTF-8?q?,=20=D1=87=D1=82=D0=BE=20=D1=81=D0=BA=D0=B0=D1=87=D0=B5=D1=82?= =?UTF-8?q?=20=D0=B2=D1=82=D0=BE=D1=80=D0=B0=D1=8F=20=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D1=80=D0=BD=D0=B0=D1=8F=20=D0=BA=D0=BD=D0=BE=D0=BF?= =?UTF-8?q?=D0=BA=D0=B0=20(=D0=BE=D0=BD=D0=B0=20=D0=B2=20=D0=B4=D1=80?= =?UTF-8?q?=D1=83=D0=B3=D0=BE=D0=BC=20=D0=BA=D0=B0=D0=BD=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?).=20=D0=9F=D0=BE=D1=8D=D1=82=D0=BE=D0=BC=D1=83=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B5=D0=B5=20=D1=81=D0=BE=D0=B1=D0=B8=D1=80=D0=B0?= =?UTF-8?q?=D1=8E=D1=81=D1=8C=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B0=D0=BD=D1=82=D0=B8=D0=B4=D1=80=D0=B5=D0=B1=D0=B5=D0=B7?= =?UTF-8?q?=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Libraries/LTimers/ltimers.c | 137 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 Libraries/LTimers/ltimers.c (limited to 'Libraries/LTimers/ltimers.c') diff --git a/Libraries/LTimers/ltimers.c b/Libraries/LTimers/ltimers.c new file mode 100644 index 0000000..ccdbf00 --- /dev/null +++ b/Libraries/LTimers/ltimers.c @@ -0,0 +1,137 @@ +/* Описание модуля ltimers.c + + Этот модуль используется для создания неограниченного количества +программных таймеров для программы. Модуль использует аппаратный таймер, +который генерирует прерывание каждую 1мс (можно использовать любой другой +промежуток времени, просто 1 мс это очень удобно и хватает для многих +программных пауз, задержек, таймеров и тд. в программе). +В прерывании вызывается ф-я ProcessLTimers(), которая инкрементирует значения +всех таймеров. Таймеры создаются в файле ltimers.h. + Модуль универсален, прост и может использоваться на любой платформе, +компиляторе, любом МК. + Для подключения модуля настройте аппаратный таймер на прерывание в 1мс (или +любой другой нужный промежуток времени) и добавьте в обработчик прерывания +этого таймера ф-ю ProcessLTimers();. Затем добавьте #include "ltimers.h" в тот +файл программы, где будут использоваться ф-ии модуля. Собственно, +в всего нужны две функции для работы с таймерами: + +StartLTimer ( LTIMER_LED_BLINK ); // запустить таймер +GetLTimer ( LTIMER_LED_BLINK ); // получить текущее значение таймера + + Пример использования: +... +// Предварительно ltimers.h создаем перечисление, в котором создаем имена для +// программных таймеров, а также в конце перечисления всегда MAX_LTIMERS +#include "ltimers.h" +... + +int main () +{ + ... + // Настройка аппаратного таймера на прерывание раз в 1 мс + InitLTimersHardWare(); + + // Стартовая инициализация (просто обнуление) всех программных таймеров + InitLTimers (); + + // Запускаем таймер + StartLTimer ( LTIMER_LED_BLINK ); + + // Основной цикл программы + while (1) + { + // Проверяем значение таймера + if ( GetLTimer ( LTIMER_LED_BLINK ) >= 500 ) + { + LED_ON; + } + } +} + +***Примечание + + 1. Необходимо учитывать разрядность МК и атомарность при проверке значений +таймера. То есть, если произойдет прерывание в момент проверки полубайтов на +8-ми разрядном МК, то, возможно, могут быть трудноуловимые глюки. + + 2. Обратите внимание, что в ф-ии ProcessLTimers() значения таймеров +инкрементируются постоянно и не перестают изменяться. Ф-я StartLTimer только +сбрасывает значение таймера в ноль, а потом программа уже ловит тот момент, +когда это значение превысило или сравнялось с нужным. И когда мы провели +сравнение, то таймер все равно продолжает маслать. Но это не важно. Пусть себе +маслает. + + 3. Псевдоним для типа uint32_t можно заменить на необходимый в зависимости +от среды разработки и компилятора. +*/ + +#include "ltimers.h" +#include "ltimers_config.h" + +uint32_t LTimers [MAX_LTIMERS] = { 0 }; + + +// ---------------------------------------------------------------------------- +// Стартовая инициализация всех программных таймеров программиста. +// Ф-я вызывается при старте МК и просто устанавливает все значения таймеров +// в ноль. +// ---------------------------------------------------------------------------- +void InitLTimers (void) +{ + LTimersConfig (); +} + + +// ---------------------------------------------------------------------------- +// Ф-я получения значения программного счетчика +// Используется программистом для проверки значения запущенного таймера +// Ф-я принимает имя таймера из перечисления LTimerNum_t в файле ltimers.h +// Ф-я возвращает значение таймера, которое увеличивается каждую 1мс +// ---------------------------------------------------------------------------- +uint32_t GetLTimer ( LTimersNames_t LTimer ) +{ + return LTimers[ LTimer ]; +} + + +// ---------------------------------------------------------------------------- +// Ф-я запуска программного таймера для использования программистом для +// любых программных задержек разрешением 1мс +// Ф-я принимает имя таймера из перечисления LTimerNum_t в файле ltimers.h +// ---------------------------------------------------------------------------- +void StartLTimer ( LTimersNames_t LTimer ) +{ + LTimers[ LTimer ] = 0; +} + + +// ---------------------------------------------------------------------------- +// Ф-я, инкрементирующая значения программных таймеров. Количество этих +// программных таймеров нее ограничено и задается программистом в ltimers.h +// в тайпдефе LTimerNum_t. Просто дописываем в перечислении перед MAX_LTIMERS +// имя нового таймера. +// Вызывается эта ф-я в обреботчике TIM6_IRQHandler каждую 1 мс. +// 1 мс это удобный квант времени для разных программных задержек +// ---------------------------------------------------------------------------- +void ProcessLTimers (void) +{ + for ( uint32_t i = 0; i < MAX_LTIMERS; i++ ) + { + LTimers[i]++; + } +} + + + + + + + + + + + + + + + -- cgit v1.2.3