/*============================================================================== * Инициализация таймеров с использованием бибилотеки PLIB035 *------------------------------------------------------------------------------ * ЦНИИ СЭТ, Разваляев Алексей *============================================================================== * ЦНИИ СЭТ *============================================================================== */ #ifndef __ADC_H #define __ADC_H //-- Includes ------------------------------------------------------------------ #include "plib035.h" #include "retarget_conf.h" //-- Defines ------------------------------------------------------------------- // Дефайны для режима АЦП typedef enum { ADC_Callback_Seq, ADC_Callback_BuffHalf, ADC_Callback_BuffFull, ADC_Callback_DC, ADC_Callback_Error, }ADC_CallbackTypeDef; typedef struct { ADC_SEQ_Init_TypeDef SEQ_Init; /* Стандартная конфигурация из PLIB */ FunctionalState IT; /*!< Включить прерывания */ uint8_t ITCount; /*!< Количество запросов для генерации прерывания */ uint32_t buffer_circular; /*!< Циклический буфер */ void (*SEQCpltCallback)(void); /*!< Вызывается при завершении секвенсора */ void (*BuffHalfCallback)(void); /*!< Вызывается при заполнении половины буфера */ void (*BuffFullCallback)(void); /*!< Вызывается при заполнении буфера */ void (*ErrorCallback)(); /*!< Вызывается при ошибке */ }ADC_SEQ_ExtInit_TypeDef; typedef struct { ADC_DC_Init_TypeDef DC_Init; FunctionalState IT; /*!< Включить прерывания */ void (*DC_TrigCallback); /*!< Вызывается при срабатывании компаратора */ void (*ErrorCallback)(); /*!< Вызывается при ошибке */ }ADC_DC_ExtInit_TypeDef; typedef struct { ADC_SEQ_ExtInit_TypeDef *Config; /*!< Конфигурации секвенсоров */ uint8_t running; uint16_t *data_buffer; /*!< Указатель на буфер данных [ch][buffer_size]*/ uint32_t buffer_size; /*!< Размер буфера (16-bit слова) */ uint32_t buffer_count; /*!< Счетчик текущего индекса буфера */ }ADC_SEQ_HandleTypeDef; typedef struct { ADC_DC_ExtInit_TypeDef *Config; /*!< Конфигурации компараторов */ uint8_t running; }ADC_DC_HandleTypeDef; typedef struct { ADC_TypeDef *Instance; /*!< Регистры ADC */ ADC_SEQ_HandleTypeDef SEQ[ADC_SEQ_Total]; /*!< Хендл секвенсоров */ ADC_DC_ExtInit_TypeDef DC[ADC_DC_Total]; /*!< Хендл компараторов */ // Буферы данных для каждого канала (актуальные значения) uint16_t ChannelData[ADC_CH_Total]; /*!< Текущие значения каналов */ uint8_t ChannelValid[ADC_CH_Total]; /*!< Флаги валидности данных */ }ADC_HandleTypeDef; extern ADC_HandleTypeDef hadc; //-- Exported functions prototypes --------------------------------------------- void adc_init_first(void); OperationStatus adc_seq_init(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_ExtInit_TypeDef *NewConfig); OperationStatus adc_seq_set_callback(ADC_HandleTypeDef* hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_CallbackTypeDef cb_type, void (*Callback)(void)); OperationStatus adc_seq_start(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num, uint16_t (*data_buffer)[], uint32_t buffer_size); OperationStatus adc_seq_stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num); uint16_t adc_get_channel_value(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel); void adc_sw_start(void); // Обработчики прерываний void adc_seq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num); void adc_dc_handler(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num); #endif /*__ADC_H*/