diff options
Diffstat (limited to 'Libraries/LTimers')
-rw-r--r-- | Libraries/LTimers/ltimers.c | 135 | ||||
-rw-r--r-- | Libraries/LTimers/ltimers.h | 12 | ||||
-rw-r--r-- | Libraries/LTimers/ltimers_config.c | 50 | ||||
-rw-r--r-- | Libraries/LTimers/ltimers_config.h | 4 |
4 files changed, 80 insertions, 121 deletions
diff --git a/Libraries/LTimers/ltimers.c b/Libraries/LTimers/ltimers.c index ccdbf00..61c9e6f 100644 --- a/Libraries/LTimers/ltimers.c +++ b/Libraries/LTimers/ltimers.c @@ -1,68 +1,68 @@ -/* ltimers.c - - - . , - 1 ( - , 1 - , , . ). - - ProcessLTimers(), - . ltimers.h. - , , -, . - 1 ( - ) - - ProcessLTimers();. #include "ltimers.h" - , - . , - : - -StartLTimer ( LTIMER_LED_BLINK ); // -GetLTimer ( LTIMER_LED_BLINK ); // - - : +/* Описание модуля ltimers.c + + Этот модуль используется для создания неограниченного количества +программных таймеров для программы. Модуль использует аппаратный таймер, +который генерирует прерывание каждую 1мс (можно использовать любой другой +промежуток времени, просто 1 мс это очень удобно и хватает для многих +программных пауз, задержек, таймеров и тд. в программе). +В прерывании вызывается ф-я ProcessLTimers(), которая инкрементирует значения +всех таймеров. Таймеры создаются в файле ltimers.h. + Модуль универсален, прост и может использоваться на любой платформе, +компиляторе, любом МК. + Для подключения модуля настройте аппаратный таймер на прерывание в 1мс (или +любой другой нужный промежуток времени) и добавьте в обработчик прерывания +этого таймера ф-ю ProcessLTimers();. Затем добавьте #include "ltimers.h" в тот +файл программы, где будут использоваться ф-ии модуля. Собственно, +в всего нужны две функции для работы с таймерами: + +StartLTimer ( LTIMER_LED_BLINK ); // запустить таймер +GetLTimer ( LTIMER_LED_BLINK ); // получить текущее значение таймера + + Пример использования: ... -// ltimers.h , -// , MAX_LTIMERS +// Предварительно ltimers.h создаем перечисление, в котором создаем имена для +// программных таймеров, а также в конце перечисления всегда MAX_LTIMERS #include "ltimers.h" ... int main () { ... - // 1 - InitLTimersHardWare(); + // Настройка аппаратного таймера на прерывание раз в 1 мс + InitLTimersHardWare(); - // ( ) + // Стартовая инициализация (просто обнуление) всех программных таймеров InitLTimers (); - - // + + // Запускаем таймер StartLTimer ( LTIMER_LED_BLINK ); - // + // Основной цикл программы while (1) { - // + // Проверяем значение таймера if ( GetLTimer ( LTIMER_LED_BLINK ) >= 500 ) { LED_ON; - } + } } -} +} -*** +***Примечание - 1. -. , -8- , , , . + 1. Необходимо учитывать разрядность МК и атомарность при проверке значений +таймера. То есть, если произойдет прерывание в момент проверки полубайтов на +8-ми разрядном МК, то, возможно, могут быть трудноуловимые глюки. - 2. , - ProcessLTimers() - . - StartLTimer - , , - . -, . . -. + 2. Обратите внимание, что в ф-ии ProcessLTimers() значения таймеров +инкрементируются постоянно и не перестают изменяться. Ф-я StartLTimer только +сбрасывает значение таймера в ноль, а потом программа уже ловит тот момент, +когда это значение превысило или сравнялось с нужным. И когда мы провели +сравнение, то таймер все равно продолжает маслать. Но это не важно. Пусть себе +маслает. - 3. uint32_t - . + 3. Псевдоним для типа uint32_t можно заменить на необходимый в зависимости +от среды разработки и компилятора. */ #include "ltimers.h" @@ -72,9 +72,9 @@ uint32_t LTimers [MAX_LTIMERS] = { 0 }; // ---------------------------------------------------------------------------- -// . -// - -// . +// Стартовая инициализация всех программных таймеров программиста. +// Ф-я вызывается при старте МК и просто устанавливает все значения таймеров +// в ноль. // ---------------------------------------------------------------------------- void InitLTimers (void) { @@ -83,10 +83,10 @@ void InitLTimers (void) // ---------------------------------------------------------------------------- -// - -// -// - LTimerNum_t ltimers.h -// - , 1 +// Ф-я получения значения программного счетчика +// Используется программистом для проверки значения запущенного таймера +// Ф-я принимает имя таймера из перечисления LTimerNum_t в файле ltimers.h +// Ф-я возвращает значение таймера, которое увеличивается каждую 1мс // ---------------------------------------------------------------------------- uint32_t GetLTimer ( LTimersNames_t LTimer ) { @@ -95,9 +95,9 @@ uint32_t GetLTimer ( LTimersNames_t LTimer ) // ---------------------------------------------------------------------------- -// - -// 1 -// - LTimerNum_t ltimers.h +// Ф-я запуска программного таймера для использования программистом для +// любых программных задержек разрешением 1мс +// Ф-я принимает имя таймера из перечисления LTimerNum_t в файле ltimers.h // ---------------------------------------------------------------------------- void StartLTimer ( LTimersNames_t LTimer ) { @@ -106,12 +106,12 @@ void StartLTimer ( LTimersNames_t LTimer ) // ---------------------------------------------------------------------------- -// -, . -// ltimers.h -// LTimerNum_t. MAX_LTIMERS -// . -// - TIM6_IRQHandler 1 . -// 1 +// Ф-я, инкрементирующая значения программных таймеров. Количество этих +// программных таймеров нее ограничено и задается программистом в ltimers.h +// в тайпдефе LTimerNum_t. Просто дописываем в перечислении перед MAX_LTIMERS +// имя нового таймера. +// Вызывается эта ф-я в обреботчике TIM6_IRQHandler каждую 1 мс. +// 1 мс это удобный квант времени для разных программных задержек // ---------------------------------------------------------------------------- void ProcessLTimers (void) { @@ -120,18 +120,3 @@ void ProcessLTimers (void) LTimers[i]++; } } - - - - - - - - - - - - - - - diff --git a/Libraries/LTimers/ltimers.h b/Libraries/LTimers/ltimers.h index a0370b2..4514841 100644 --- a/Libraries/LTimers/ltimers.h +++ b/Libraries/LTimers/ltimers.h @@ -3,10 +3,10 @@ #include <stdint.h> -// LTIMER_<TIMERNAME> ---------------------------------------- // +// Имена таймеров LTIMER_<TIMERNAME> ---------------------------------------- // typedef enum { - - LTIMER_SENSE_PAD = 0, + + LTIMER_SENSE_PAD = 0, LTIMER_PRGBAR_SPEED, LTIMER_HL_CHANGE_BRIGHT_SPEED, LTIMER_HL_BUT_LED, @@ -16,9 +16,9 @@ typedef enum { LTIMER_MENU_ADJ_TIME_OUT, LTIMER_LIGHT_SENSOR, LTIMER_SENSOR_BUT_DEBOUNCE, - - MAX_LTIMERS - + + MAX_LTIMERS + } LTimersNames_t; void InitLTimers ( void ); diff --git a/Libraries/LTimers/ltimers_config.c b/Libraries/LTimers/ltimers_config.c index 069a6ca..a30b36f 100644 --- a/Libraries/LTimers/ltimers_config.c +++ b/Libraries/LTimers/ltimers_config.c @@ -4,42 +4,16 @@ // ---------------------------------------------------------------------------- -// 1 +// Инициализация аппаратного таймера для генерирования прерываний каждую 1мс // ---------------------------------------------------------------------------- void LTimersConfig ( void ) { -// NVIC_InitTypeDef NVIC_InitStructure; -// TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; -// -// /* TIM6 clock enable */ -// RCC_APB1PeriphClockCmd ( RCC_APB1Periph_TIM6 , ENABLE ); -// -// /* Enable the TIM6 global Interrupt */ -// NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; -// NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; -// NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; -// NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; -// NVIC_Init ( &NVIC_InitStructure ); -// -// /* Configure TIM6 to generate interrupt each 1ms */ -// TIM_TimeBaseStructure.TIM_Period = 1000; -// TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000000)-1; -// TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; -// TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; -// TIM_TimeBaseInit ( TIM6, &TIM_TimeBaseStructure ); -// -// /* TIM6 IT enable */ -// TIM_ITConfig ( TIM6, TIM_IT_Update , ENABLE ); -// -// /* TIM6 enable counter */ -// TIM_Cmd ( TIM6, ENABLE ); - NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; - + /* LTIMER_TIMx clock enable */ LTIMER_RCC_APBxPeriphClockCmd ( LTIMER_TIM_RCC, ENABLE ); - + /* Enable the LTIMER_TIMx gloabal Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = LTIMER_TIM_IRQx; NVIC_InitStructure.NVIC_IRQChannelPriority = 1; @@ -49,34 +23,34 @@ void LTimersConfig ( void ) /* ----------------------------------------------------------------------- In this example TIM7 counter clock (TIM7CLK) is set to APB1 clock (PCLK1), since APB1 prescaler is set to 1 and TIM7 prescaler is set to 0. - - In this example TIM7 input clock (TIM7CLK) is set to APB1 clock (PCLK1), - since APB1 prescaler is set to 1. + + In this example TIM7 input clock (TIM7CLK) is set to APB1 clock (PCLK1), + since APB1 prescaler is set to 1. TIM7CLK = PCLK1 = HCLK = SystemCoreClock - + With Prescaler set to 479 and Period to 24999, the TIM7 counter is updated each 250 ms (i.e. and interrupt is generated each 250 ms) TIM7 counter clock = TIM7CLK /((Prescaler + 1)*(Period + 1)) = 48 MHz / ((25000)*(480)) - = 4 Hz + = 4 Hz ==> TIM7 counter period = 250 ms Note: SystemCoreClock variable holds HCLK frequency and is defined in system_stm32f0xx.c file. Each time the core clock (HCLK) changes, user had to call SystemCoreClockUpdate() function to update SystemCoreClock variable value. Otherwise, any configuration - based on this variable will be incorrect. - ----------------------------------------------------------------------- */ + based on this variable will be incorrect. + ----------------------------------------------------------------------- */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = 1000; //24999; TIM_TimeBaseStructure.TIM_Prescaler = (SystemCoreClock/1000000)-1; //479; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit ( LTIMER_TIMx, &TIM_TimeBaseStructure ); - + /* LTIMER_TIMx Interrupts enable */ TIM_ITConfig ( LTIMER_TIMx, TIM_IT_Update, ENABLE ); - + /* LTIMER_TIMx enable counter */ TIM_Cmd ( LTIMER_TIMx, ENABLE ); } diff --git a/Libraries/LTimers/ltimers_config.h b/Libraries/LTimers/ltimers_config.h index 7e8efe2..50a75db 100644 --- a/Libraries/LTimers/ltimers_config.h +++ b/Libraries/LTimers/ltimers_config.h @@ -1,8 +1,8 @@ #ifndef LTIMERS_CONFIG_INCLUDED #define LTIMERS_CONFIG_INCLUDED -// -// , APB1 APB2 +// Примечание +// Обратить внимание на то, что таймеры тактируются от разных шин APB1 или APB2 #define LTIMER_IRQHandler TIM17_IRQHandler #define LTIMER_TIMx TIM17 |