/** ****************************************************************************** * @file tmr.h * @author Разваляев Алексей * @brief Драйвер UART на основе PLIB035. * Данный файл содержит определения типов, структур и прототипы функций * для работы с TMR, включая: * + Структуры и typedef для таймеров * + Макросы для конфигурации периодов и частот * + Прототипы функций для инициализации и API драйвера * ****************************************************************************** */ #ifndef __TMR_H #define __TMR_H //-- Includes ------------------------------------------------------------------ #include "plib035.h" #include "retarget_conf.h" //-- Defines ------------------------------------------------------------------- // Дефайны для режима таймера Период в мкс, Частота, ПсевдоПрескалер, Период в тиках /** @brief Период в мкс */ #define PERIOD_US(_per_) (_per_), 0, 0, 0 /** @brief Период в Гц */ #define FREQ_HZ(_freq_) 0, (_freq_), 0, 0 /** @brief Период в прескалере и тиках */ #define LOAD(_load_, _presc_) 0, 0, (_presc_), (_load_) //-- Types --------------------------------------------------------------------- /** * @brief Типы callback-функций TMR */ typedef enum { TMR_Callback_Update, /*!< Переполнение (опустошение) таймера */ } TMR_CallbackTypeDef; /** * @brief Расширенная конфигурация таймера */ typedef struct { float ClkFreq; /*!< Частота тактирования таймера в МГц */ uint32_t PeriodUs; /*!< Период таймера в мкс */ uint32_t FreqHz; /*!< Частота таймера в Гц */ uint32_t Prescaler; /*!< Псевдопрескалер */ uint32_t Load; /*!< Период таймера в тиках */ FunctionalState IT; /*!< Разрешение прерывания */ FunctionalState ADCSOC; /*!< Разрешение генерации запуска АЦП */ FunctionalState DMAReq; /*!< Разрешение генерации DMA-запросов */ TMR_ExtInput_TypeDef ExtInput; /*!< Настройка внешнего тактирования таймера */ void (*UpdCallback)(void); /*!< Callback-функция по прерыванию таймера */ } TMR_ExtInit_TypeDef; /** * @brief Хендл таймера */ typedef struct { TMR_TypeDef *Instance; /*!< Указатель на регистры таймера */ TMR_ExtInit_TypeDef *Config; /*!< Конфигурация таймера */ } TMR_HandleTypeDef; //-- External handles ---------------------------------------------------------- extern TMR_HandleTypeDef htmr0; extern TMR_HandleTypeDef htmr1; extern TMR_HandleTypeDef htmr2; extern TMR_HandleTypeDef htmr3; //-- Exported functions prototypes --------------------------------------------- /* Init functions */ /* Первичная инициализация таймеров */ void tmr_init_first(void); /* Общий обработчик прерывания таймера */ void tmr_irq_handler(TMR_HandleTypeDef* htmr); /* Инициализация TMRx */ OperationStatus tmr_init(TMR_HandleTypeDef *htmr, TMR_ExtInit_TypeDef *NewConfig); /* Инициализация таймера (её нет в PLIB, поэтому она здесь) */ void TMR_Init(TMR_TypeDef* TMRx, TMR_ExtInit_TypeDef* InitStruct); /* Установка callback-функции таймера */ OperationStatus TMR_Set_Callback(TMR_HandleTypeDef* htmr, TMR_CallbackTypeDef CallbackType, void (*Callback)(void)); /* API functions*/ /* Запуск таймера */ OperationStatus TMR_Start(TMR_HandleTypeDef *htmr, FunctionalState IT); /* Остановка таймера */ OperationStatus TMR_Stop(TMR_HandleTypeDef *htmr, FunctionalState IT); /*Получить счетчик таймера (с псевдопрескалером) */ uint32_t TMR_Get_Cnt(TMR_HandleTypeDef *htmr); /* Получить период таймера (с псевдопрескалером) */ uint32_t TMR_Get_Period(TMR_HandleTypeDef *htmr); /* Задержка в тиках таймера (блокирующая). */ OperationStatus TMR_Delay(TMR_HandleTypeDef *htmr, uint32_t delay); /* Проверка завершения неблокирующей задержки. */ OperationStatus TMR_Delay_Start(TMR_HandleTypeDef *htmr, uint32_t *var); /* Проверка завершения неблокирующей задержки. */ int TMR_Delay_Done(TMR_HandleTypeDef *htmr, uint32_t delay, uint32_t *var); #endif /*__TMR_H*/