summaryrefslogtreecommitdiff
path: root/Libraries/LTimers
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LTimers')
-rw-r--r--Libraries/LTimers/ltimers.c135
-rw-r--r--Libraries/LTimers/ltimers.h12
-rw-r--r--Libraries/LTimers/ltimers_config.c50
-rw-r--r--Libraries/LTimers/ltimers_config.h4
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