/** ****************************************************************************** * @file plib035_adc.h * * @brief Файл содержит прототипы и компактные inline реализации функций для * ADC, а также сопутствующие макроопределения и перечисления * * @author НИИЭТ, Богдан Колбов * ****************************************************************************** * @attention * * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. * *

© 2018 ОАО "НИИЭТ"

****************************************************************************** */ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __PLIB035_ADC_H #define __PLIB035_ADC_H #ifdef __cplusplus extern "C" { #endif /* Includes ------------------------------------------------------------------*/ #include "plib035.h" /** @addtogroup Peripheral * @{ */ /** @defgroup ADC * @brief Драйвер для работы с ADC * @{ */ /** @defgroup ADC_Exported_Defines Константы * @{ */ #define ADC_SEQ_Total 2UL #define ADC_SEQ_Req_Total 4UL #define ADC_DC_Total 4UL #define ADC_CH_Total 4UL /** * @} */ /** @defgroup ADC_Exported_Types Типы * @{ */ /** * @brief Номер секвенсора */ typedef enum { ADC_SEQ_Num_0, /*!< Севенсор 0 */ ADC_SEQ_Num_1 /*!< Севенсор 1 */ } ADC_SEQ_Num_TypeDef; #define IS_ADC_SEQ_NUM(VALUE) (((VALUE) == ADC_SEQ_Num_0) || \ ((VALUE) == ADC_SEQ_Num_1)) /** * @brief Номер запроса в очереди секвенсора */ typedef enum { ADC_SEQ_ReqNum_0, /*!< Запрос 0 */ ADC_SEQ_ReqNum_1, /*!< Запрос 1 */ ADC_SEQ_ReqNum_2, /*!< Запрос 2 */ ADC_SEQ_ReqNum_3 /*!< Запрос 3 */ } ADC_SEQ_ReqNum_TypeDef; #define IS_ADC_SEQ_REQ_NUM(VALUE) (((VALUE) == ADC_SEQ_ReqNum_0) || \ ((VALUE) == ADC_SEQ_ReqNum_1) || \ ((VALUE) == ADC_SEQ_ReqNum_2) || \ ((VALUE) == ADC_SEQ_ReqNum_3)) /** * @brief События запуска секвенсоров */ typedef enum { ADC_SEQ_StartEvent_SwReq = ADC_EMUX_EM0_SwReq, /*!< Запуск по программному запросу */ ADC_SEQ_StartEvent_GPIOA = ADC_EMUX_EM0_GPIOA, /*!< Сигнал от GPIOA */ ADC_SEQ_StartEvent_GPIOB = ADC_EMUX_EM0_GPIOB, /*!< Сигнал от GPIOB */ ADC_SEQ_StartEvent_TMR0 = ADC_EMUX_EM0_TMR0, /*!< Сигнал от таймера 0 */ ADC_SEQ_StartEvent_TMR1 = ADC_EMUX_EM0_TMR1, /*!< Сигнал от таймера 1 */ ADC_SEQ_StartEvent_TMR2 = ADC_EMUX_EM0_TMR2, /*!< Сигнал от таймера 2 */ ADC_SEQ_StartEvent_TMR3 = ADC_EMUX_EM0_TMR3, /*!< Сигнал от таймера 3 */ ADC_SEQ_StartEvent_PWM012A = ADC_EMUX_EM0_PWM012A, /*!< Сигналы A от блоков ШИМ 0, 1, 2 */ ADC_SEQ_StartEvent_PWM012B = ADC_EMUX_EM0_PWM012B, /*!< Сигналы B от блоков ШИМ 0, 1, 2 */ ADC_SEQ_StartEvent_Cycle = ADC_EMUX_EM0_Cycle, /*!< Циклическая работа сразу после запуска секвенсора */ } ADC_SEQ_StartEvent_TypeDef; #define IS_ADC_SEQ_START_EVENT(VALUE) (((VALUE) == ADC_SEQ_StartEvent_SwReq) || \ ((VALUE) == ADC_SEQ_StartEvent_GPIOA) || \ ((VALUE) == ADC_SEQ_StartEvent_GPIOB) || \ ((VALUE) == ADC_SEQ_StartEvent_TMR0) || \ ((VALUE) == ADC_SEQ_StartEvent_TMR1) || \ ((VALUE) == ADC_SEQ_StartEvent_TMR2) || \ ((VALUE) == ADC_SEQ_StartEvent_TMR3) || \ ((VALUE) == ADC_SEQ_StartEvent_PWM012A) || \ ((VALUE) == ADC_SEQ_StartEvent_PWM012B) || \ ((VALUE) == ADC_SEQ_StartEvent_Cycle)) /** * @brief Количество измерений для усреднения */ typedef enum { ADC_SEQ_Average_2 = ADC_SEQ_SRQCTL_QAVGVAL_Average2, /*!< Усреднение по 2 измерениям */ ADC_SEQ_Average_4 = ADC_SEQ_SRQCTL_QAVGVAL_Average4, /*!< Усреднение по 4 измерениям */ ADC_SEQ_Average_8 = ADC_SEQ_SRQCTL_QAVGVAL_Average8, /*!< Усреднение по 8 измерениям */ ADC_SEQ_Average_16 = ADC_SEQ_SRQCTL_QAVGVAL_Average16, /*!< Усреднение по 16 измерениям */ ADC_SEQ_Average_32 = ADC_SEQ_SRQCTL_QAVGVAL_Average32, /*!< Усреднение по 32 измерениям */ ADC_SEQ_Average_64 = ADC_SEQ_SRQCTL_QAVGVAL_Average64, /*!< Усреднение по 64 измерениям */ } ADC_SEQ_Average_TypeDef; #define IS_ADC_SEQ_AVERAGE(VALUE) (((VALUE) == ADC_SEQ_Average_2) || \ ((VALUE) == ADC_SEQ_Average_4) || \ ((VALUE) == ADC_SEQ_Average_8) || \ ((VALUE) == ADC_SEQ_Average_16) || \ ((VALUE) == ADC_SEQ_Average_32) || \ ((VALUE) == ADC_SEQ_Average_64)) /** * @brief Количество результатов измерений записанных в буфер секвенсора, по достижению которого вызывается DMA */ typedef enum { ADC_SEQ_DMAFIFOLevel_1 = ADC_SEQ_SDMACTL_WMARK_Level1, /*!< Запрос DMA после заполнения 1 ячейки в буффере */ ADC_SEQ_DMAFIFOLevel_2 = ADC_SEQ_SDMACTL_WMARK_Level2, /*!< Запрос DMA после заполнения 2 ячеек в буффере */ ADC_SEQ_DMAFIFOLevel_4 = ADC_SEQ_SDMACTL_WMARK_Level4, /*!< Запрос DMA после заполнения 4 ячеек в буффере */ ADC_SEQ_DMAFIFOLevel_8 = ADC_SEQ_SDMACTL_WMARK_Level8, /*!< Запрос DMA после заполнения 8 ячеек в буффере */ ADC_SEQ_DMAFIFOLevel_16 = ADC_SEQ_SDMACTL_WMARK_Level16, /*!< Запрос DMA после заполнения 16 ячеек в буффере */ ADC_SEQ_DMAFIFOLevel_32 = ADC_SEQ_SDMACTL_WMARK_Level32, /*!< Запрос DMA после заполнения 32 ячеек в буффере */ } ADC_SEQ_DMAFIFOLevel_TypeDef; #define IS_ADC_SEQ_DMA_FIFO_LEVEL(VALUE) (((VALUE) == ADC_SEQ_DMAFIFOLevel_1) || \ ((VALUE) == ADC_SEQ_DMAFIFOLevel_2) || \ ((VALUE) == ADC_SEQ_DMAFIFOLevel_4) || \ ((VALUE) == ADC_SEQ_DMAFIFOLevel_8) || \ ((VALUE) == ADC_SEQ_DMAFIFOLevel_16) || \ ((VALUE) == ADC_SEQ_DMAFIFOLevel_32)) /** * @brief Номер цифрового компаратора */ typedef enum { ADC_DC_Num_0, /*!< Модуль цифрового компаратора 0 */ ADC_DC_Num_1, /*!< Модуль цифрового компаратора 1 */ ADC_DC_Num_2, /*!< Модуль цифрового компаратора 2 */ ADC_DC_Num_3, /*!< Модуль цифрового компаратора 3 */ } ADC_DC_Num_TypeDef; #define IS_ADC_DC_NUM(VALUE) (((VALUE) == ADC_DC_Num_0) || \ ((VALUE) == ADC_DC_Num_1) || \ ((VALUE) == ADC_DC_Num_2) || \ ((VALUE) == ADC_DC_Num_3)) /** * @brief Режим срабатывания цифрового компаратора */ typedef enum { ADC_DC_Mode_Multiple = ADC_DC_DCTL_CIM_Multiple, /*!< Многократный */ ADC_DC_Mode_Single = ADC_DC_DCTL_CIM_Single, /*!< Однократный */ ADC_DC_Mode_MultipleHyst = ADC_DC_DCTL_CIM_MultipleHyst, /*!< Многократный с гистерезисом */ ADC_DC_Mode_SingleHyst = ADC_DC_DCTL_CIM_SingleHyst, /*!< Однократный с гистерезисом */ } ADC_DC_Mode_TypeDef; #define IS_ADC_DC_MODE(VALUE) (((VALUE) == ADC_DC_Mode_Single) || \ ((VALUE) == ADC_DC_Mode_Multiple) || \ ((VALUE) == ADC_DC_Mode_SingleHyst) || \ ((VALUE) == ADC_DC_Mode_MultipleHyst)) /** * @brief Условие срабатывания компаратора */ typedef enum { ADC_DC_Condition_Low = ADC_DC_DCTL_CIC_Low, /*!< Результат меньше либо равен нижней границе */ ADC_DC_Condition_Window = ADC_DC_DCTL_CIC_Window, /*!< Результат внутри диапазона, задаваемого границами, либо равен одной из них */ ADC_DC_Condition_High = ADC_DC_DCTL_CIC_High, /*!< Результат больше либо равен верхней границе */ } ADC_DC_Condition_TypeDef; #define IS_ADC_DC_CONDITION(VALUE) (((VALUE) == ADC_DC_Condition_Low) || \ ((VALUE) == ADC_DC_Condition_Window) || \ ((VALUE) == ADC_DC_Condition_High)) /** * @brief Источник данных для компаратора */ typedef enum { ADC_DC_Source_EOC, /*!< Ококнчание измерения АЦП */ ADC_DC_Source_FIFO, /*!< Запись результатат в FIFO */ } ADC_DC_Source_TypeDef; #define IS_ADC_DC_SOURCE(VALUE) (((VALUE) == ADC_DC_Source_EOC) || \ ((VALUE) == ADC_DC_Source_FIFO)) /** * @brief Номер канала */ typedef enum { ADC_CH_Num_0, /*!< Канал 0 */ ADC_CH_Num_1, /*!< Канал 1 */ ADC_CH_Num_2, /*!< Канал 2 */ ADC_CH_Num_3, /*!< Канал 3 */ } ADC_CH_Num_TypeDef; #define IS_ADC_CH_NUM(VALUE) (((VALUE) == ADC_CH_Num_0) || \ ((VALUE) == ADC_CH_Num_1) || \ ((VALUE) == ADC_CH_Num_2) || \ ((VALUE) == ADC_CH_Num_3)) /** * @brief Выбор приоритета канала */ typedef enum { ADC_CH_Priority_Normal, /*!< Обычный уровень приоритета */ ADC_CH_Priority_High, /*!< Высокий уровень приоритета */ } ADC_CH_Priority_TypeDef; #define IS_ADC_CH_PRIORITY(VALUE) (((VALUE) == ADC_CH_Priority_Normal) || \ ((VALUE) == ADC_CH_Priority_High)) /** * @brief Структура инициализации цифровых компараторов */ typedef struct { FunctionalState DCOutput; /*!< Разрешает работу выходному триггеру компаратора */ uint32_t ThresholdLow; /*!< Нижний порог срабатывания компаратора. Параметр может принимать любое значение из диапазона 0 - 4095. */ uint32_t ThresholdHigh; /*!< Верхний порог срабатывания компаратора. Параметр может принимать любое значение из диапазона 0 - 4095. */ ADC_DC_Source_TypeDef Source; /*!< Выбирает источник получения измерения */ ADC_CH_Num_TypeDef Channel; /*!< Выбирает канал, результат измерения которого будет передан на компаратор */ ADC_DC_Mode_TypeDef Mode; /*!< Выбирает режим срабатывания компаратора */ ADC_DC_Condition_TypeDef Condition; /*!< Выбирает условие срабатывания компаратора */ } ADC_DC_Init_TypeDef; #define IS_ADC_DC_THRESHOLD(VALUE) ((VALUE) < 0x1000) /** * @brief Структура инициализации секвенсоров */ typedef struct { ADC_SEQ_StartEvent_TypeDef StartEvent; /*!< Определяет cобытие запуска секвенсора */ FunctionalState SWStartEn; /*!< Разрешает секвенсору запускаться по программному запросу */ ADC_CH_Num_TypeDef Req[ADC_SEQ_Req_Total]; /*!< Выбор каналов для запросов секвенсора */ ADC_SEQ_ReqNum_TypeDef ReqMax; /*!< Настройка глубины очереди запросов */ ADC_SEQ_Average_TypeDef ReqAverage; /*!< Настройка усреднения сканированием очереди запросов */ FunctionalState ReqAverageEn; /*!< Разрешение усреднения сканированием очереди запросов */ uint32_t RestartCount; /*!< Задание количества перезапусков модулей АЦП секвенсором после его запуска по событию. 0x00 - без перезапусков, 0x01 - 1 перезапуск, 0xFF - 255 перезапусков. */ FunctionalState RestartAverageEn; /*!< Разрешение усреднения по перезапускам */ uint32_t RestartTimer; /*!< Задание задержки запуска модуля АЦП. Параметр может принимать любое значение из диапазона 0x00000000 - 0x00FFFFFF. */ FunctionalState DCEn[ADC_DC_Total]; /*!< Разрешение работы цифровых компараторов секвенсором */ ADC_SEQ_DMAFIFOLevel_TypeDef DMAFIFOLevel; /*!< Настройка уровня заполненности буфера для генерации запросов DMA */ FunctionalState DMAEn; /*!< Разрешение генерации запросов DMA */ } ADC_SEQ_Init_TypeDef; #define IS_ADC_SEQ_RESTART_VAL(VALUE) ((VALUE) < 0x100) #define IS_ADC_SEQ_RESTART_TIMER_VAL(VALUE) ((VALUE) < 0x1000000) #define IS_ADC_SEQ_IT_COUNT_VAL(VALUE) ((VALUE) < 0x100) /** * @} */ /** @defgroup ADC_Exported_Functions Функции * @{ */ void ADC_DeInit(void); /** * @brief Включение аналогового модуля АЦП * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_AM_Cmd(FunctionalState State) { assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->ACTL_bit.ADCEN, State); } /** * @brief Чтение статуса готовности аналогового модуля АЦП. Флаг становится активным после того, * как модуль АЦП провел внутренние процедуры иницализации. * @retval Status Статус готовности */ __STATIC_INLINE FlagStatus ADC_AM_ReadyStatus(void) { return (FlagStatus)READ_REG(ADC->ACTL_bit.ADCRDY); } /** * @brief Чтение статуса занятости аналогового модуля АЦП. Флаг становится активным при * проведении измерения. * @retval Status Статус занятости */ __STATIC_INLINE FlagStatus ADC_AM_BusyStatus(void) { return (FlagStatus)READ_REG(ADC->BSTAT_bit.ADCBUSY); } /** * @brief Настройка приоритета канала АЦП * @param Channel_Num Выбор канала * @param Priority Выбор приоритета * @retval void */ __STATIC_INLINE void ADC_CH_PriorityConfig(ADC_CH_Num_TypeDef Channel_Num, ADC_CH_Priority_TypeDef Priority) { assert_param(IS_ADC_CH_NUM(Channel_Num)); assert_param(IS_ADC_CH_PRIORITY(Priority)); WRITE_REG(ADC->CHCTL[Channel_Num].CHCTL_bit.PRIORITY, Priority); } /** * @brief Получение текущего значения коэффициента коррекции ошибки усиления * @param Channel_Num Выбор канала * @retval Val Значение. Диапазон значений -256…255, величина в дополнительном коде: 100h соответствует -256, 000h - 0, 0FFh - 255. */ __STATIC_INLINE uint32_t ADC_CH_GetGainTrim(ADC_CH_Num_TypeDef Channel_Num) { assert_param(IS_ADC_CH_NUM(Channel_Num)); return READ_REG(ADC->CHCTL[Channel_Num].CHCTL_bit.GAINTRIM); } /** * @brief Установка значения коэффициента коррекции ошибки усиления * @param Channel_Num Выбор канала * @param Val Значение. Диапазон значений -256…255, величина в дополнительном коде: 100h соответствует -256, 000h - 0, 0FFh - 255. * @retval void */ __STATIC_INLINE void ADC_CH_SetGainTrim(ADC_CH_Num_TypeDef Channel_Num, uint32_t Val) { assert_param(IS_ADC_CH_NUM(Channel_Num)); WRITE_REG(ADC->CHCTL[Channel_Num].CHCTL_bit.GAINTRIM, Val); } /** * @brief Получение текущего значения коэффициента коррекции ошибки смещения нуля * @param Channel_Num Выбор канала * @retval Val Значение. Диапазон значений -256…255, величина в дополнительном коде: 100h соответствует -256, 000h - 0, 0FFh - 255. */ __STATIC_INLINE uint32_t ADC_CH_GetOffsetTrim(ADC_CH_Num_TypeDef Channel_Num) { assert_param(IS_ADC_CH_NUM(Channel_Num)); return READ_REG(ADC->CHCTL[Channel_Num].CHCTL_bit.OFFTRIM); } /** * @brief Установка значения коэффициента коррекции ошибки смещения нуля * @param Channel_Num Выбор канала * @param Val Значение. Диапазон значений -256…255, величина в дополнительном коде: 100h соответствует -256, 000h - 0, 0FFh - 255. * @retval void */ __STATIC_INLINE void ADC_CH_SetOffsetTrim(ADC_CH_Num_TypeDef Channel_Num, uint32_t Val) { assert_param(IS_ADC_CH_NUM(Channel_Num)); WRITE_REG(ADC->CHCTL[Channel_Num].CHCTL_bit.OFFTRIM, Val); } /** @defgroup ADC_Exported_Functions_Init_SEQ Секвенсоры * @{ */ void ADC_SEQ_Init(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_Init_TypeDef* InitStruct); void ADC_SEQ_StructInit(ADC_SEQ_Init_TypeDef* InitStruct); /** * @brief Включение модуля секвенсора АЦП * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_Cmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); MODIFY_REG(ADC->SEQEN, 1 << (uint32_t)SEQ_Num, State << (uint32_t)SEQ_Num); } /** * @brief Включение программного запуска секвенсора АЦП * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_SwStartEnCmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); MODIFY_REG(ADC->SEQSYNC, 1 << (uint32_t)SEQ_Num, State << (uint32_t)SEQ_Num); } /** * @brief Генерация импульса программного запуска * @retval void */ __STATIC_INLINE void ADC_SEQ_SwStartCmd(void) { WRITE_REG(ADC->SEQSYNC_bit.GSYNC, 1); } /** * @brief Чтение статуса занятости секвенсора. Флаг становится активным при * проведении запусков/перезапусков. * @param SEQ_Num Выбор секвенсора * @retval Status Статус занятости */ __STATIC_INLINE FlagStatus ADC_SEQ_BusyStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->BSTAT, 1 << (uint32_t)SEQ_Num); } /** * @brief Чтение статуса заполнения буфера секвенсора * @param SEQ_Num Выбор секвенсора * @retval Status Статус заполнения буфера */ __STATIC_INLINE FlagStatus ADC_SEQ_FIFOFullStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_OV0_Pos)); } /** * @brief Сброс статуса заполнения буфера секвенсора * @param SEQ_Num Выбор секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_FIFOFullStatusClear(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); WRITE_REG(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_OV0_Pos)); } /** * @brief Чтение статуса пустоты буфера секвенсора * @param SEQ_Num Выбор секвенсора * @retval Status Статус пустоты буфера */ __STATIC_INLINE FlagStatus ADC_SEQ_FIFOEmptyStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_UN0_Pos)); } /** * @brief Сброс статуса пустоты буфера секвенсора * @param SEQ_Num Выбор секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_FIFOEmptyStatusClear(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); WRITE_REG(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_UN0_Pos)); } /** * @brief Настройка события запуска секвенсора * @param SEQ_Num Выбор секвенсора * @param StartEvent Выбор события * @retval void */ __STATIC_INLINE void ADC_SEQ_StartEventConfig(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_StartEvent_TypeDef StartEvent) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); MODIFY_REG(ADC->EMUX, 0xF << ((uint32_t)SEQ_Num * 4), StartEvent << ((uint32_t)SEQ_Num * 4)); } /** * @brief Выбор каналов для запроса секвенсора * @param SEQ_Num Выбор секвенсора * @param ReqNum Выбор запроса * @param Channel_Num Выбор канала * @retval void */ __STATIC_INLINE void ADC_SEQ_ReqConfig(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_ReqNum_TypeDef ReqNum, ADC_CH_Num_TypeDef Channel_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_REQ_NUM(ReqNum)); assert_param(IS_ADC_CH_NUM(Channel_Num)); MODIFY_REG(ADC->SEQ[SEQ_Num].SRQSEL, 0x3 << ((uint32_t)ReqNum * 4), Channel_Num << ((uint32_t)ReqNum * 4)); } /** * @brief Настройка глубины очереди запросов * @param SEQ_Num Выбор секвенсора * @param ReqNumMax Номер последнего запроса * @retval void */ __STATIC_INLINE void ADC_SEQ_ReqMaxConfig(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_ReqNum_TypeDef ReqNumMax) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_REQ_NUM(ReqNumMax)); WRITE_REG(ADC->SEQ[SEQ_Num].SRQCTL_bit.RQMAX, ReqNumMax); } /** * @brief Настройка усреднения сканированием очереди запросов * @param SEQ_Num Выбор секвенсора * @param Average Выбор режима усреднения * @retval void */ __STATIC_INLINE void ADC_SEQ_ReqAverageConfig(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_Average_TypeDef Average) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_AVERAGE(Average)); WRITE_REG(ADC->SEQ[SEQ_Num].SRQCTL_bit.QAVGVAL, Average); } /** * @brief Включение усреднения сканированием очереди запросов * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_ReqAverageCmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->SEQ[SEQ_Num].SRQCTL_bit.QAVGEN, State); } /** * @brief Получение текущего номера запроса в очереди * @param SEQ_Num Выбор секвенсора * @retval Val Номер запроса */ __STATIC_INLINE ADC_SEQ_ReqNum_TypeDef ADC_SEQ_GetReqCurrent(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (ADC_SEQ_ReqNum_TypeDef)READ_REG(ADC->SEQ[SEQ_Num].SRQSTAT_bit.RQPTR); } /** * @brief Чтение статуса занятости запроса секвенсора. Флаг становится активным при * выставленном запросе. * @param SEQ_Num Выбор секвенсора * @retval Status Статус занятости */ __STATIC_INLINE FlagStatus ADC_SEQ_ReqBusyStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_REG(ADC->SEQ[SEQ_Num].SRQSTAT_bit.RQBUSY); } /** * @brief Настройка генерации запросов DMA * @param SEQ_Num Выбор секвенсора * @param DMAFIFOLevel Выбор уровня заполнения буфера для генерации запросов DMA * @retval void */ __STATIC_INLINE void ADC_SEQ_DMAConfig(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_SEQ_DMAFIFOLevel_TypeDef DMAFIFOLevel) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_DMA_FIFO_LEVEL(DMAFIFOLevel)); WRITE_REG(ADC->SEQ[SEQ_Num].SDMACTL_bit.WMARK, DMAFIFOLevel); } /** * @brief Включение генерации запросов DMA * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_DMACmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->SEQ[SEQ_Num].SDMACTL_bit.DMAEN, State); } /** * @brief Чтение статуса ошибки генерации запросов DMA * @param SEQ_Num Выбор секвенсора * @retval Status Статус ошибки */ __STATIC_INLINE FlagStatus ADC_SEQ_DMAErrorStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_DOV0_Pos)); } /** * @brief Сброс статуса ошибки генерации запросов DMA * @param SEQ_Num Выбор секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_DMAErrorStatusClear(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); WRITE_REG(ADC->FSTAT, 1 << ((uint32_t)SEQ_Num + ADC_FSTAT_DOV0_Pos)); } /** * @brief Настройка количества перезапусков очереди запросов * @param SEQ_Num Выбор секвенсора * @param RestartVal Количество. 0x00 - без перезапусков, * 0x01 - 1 перезапуск, 0xFF - 255 перезапусков. * @retval void */ __STATIC_INLINE void ADC_SEQ_RestartConfig(ADC_SEQ_Num_TypeDef SEQ_Num, uint32_t RestartVal) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_RESTART_VAL(RestartVal)); WRITE_REG(ADC->SEQ[SEQ_Num].SCCTL_bit.RCNT, RestartVal); } /** * @brief Включение режима усреднения по перезапускам. * При этом количество перезапусков должно равнятся 2^p - 1 (p=1..8). * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_RestartAverageCmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->SEQ[SEQ_Num].SCCTL_bit.RAVGEN, State); } /** * @brief Получение текущего количества совершенных перезапусков * @param SEQ_Num Выбор секвенсора * @retval Val Номер запроса */ __STATIC_INLINE uint32_t ADC_SEQ_GetRestartCurrent(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return READ_REG(ADC->SEQ[SEQ_Num].SCVAL_bit.RCNT); } /** * @brief Разрешение поступления данных на выбранный цифровой компаратор * @param SEQ_Num Выбор секвенсора * @param DC_Num Выбор компаратора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_DCEnableCmd(ADC_SEQ_Num_TypeDef SEQ_Num, ADC_DC_Num_TypeDef DC_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); MODIFY_REG(ADC->SEQ[SEQ_Num].SDC, 1 << ((uint32_t)DC_Num), State << ((uint32_t)DC_Num)); } /** * @brief Установка значения задержки перезапуска секвенсора в тактак ACLK * @param SEQ_Num Выбор секвенсора * @param TimerVal Значение. 0 - означает отсутствие задержки и немедленный перезапуск (если активен). * @retval void */ __STATIC_INLINE void ADC_SEQ_SetRestartTimer(ADC_SEQ_Num_TypeDef SEQ_Num, uint32_t TimerVal) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_RESTART_TIMER_VAL(TimerVal)); WRITE_REG(ADC->SEQ[SEQ_Num].SRTMR_bit.VAL, TimerVal); } /** * @brief Получение текущего значения задержки перезапуска секвенсора в тактак ACLK * @param SEQ_Num Выбор секвенсора * @retval Val Значение. 0 - означает отсутствие задержки и немедленный перезапуск (если активен). */ __STATIC_INLINE uint32_t ADC_SEQ_GetRestartTimer(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return READ_REG(ADC->SEQ[SEQ_Num].SRTMR_bit.VAL); } /** * @brief Разрешение обновления значения задержки по событиям перезапуска (по умолчанию, только по запускам) * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_RestartTimerUpdateCmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->SEQ[SEQ_Num].SRTMR_bit.NOWAIT, State); } /** * @brief Получение текущего значения количества результатов в буфере секвенсора * @param SEQ_Num Выбор секвенсора * @retval Val Значение */ __STATIC_INLINE uint32_t ADC_SEQ_GetFIFOLoad(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return READ_REG(ADC->SEQ[SEQ_Num].SFLOAD_bit.VAL); } /** * @brief Получение результата измерения из буфера секвенсора * @param SEQ_Num Выбор секвенсора * @retval Val Значение */ __STATIC_INLINE uint32_t ADC_SEQ_GetFIFOData(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return READ_REG(ADC->SEQ[SEQ_Num].SFIFO_bit.DATA); } /** * @} */ /** @defgroup ADC_Exported_Functions_Init_DC Цифровые компараторы * @{ */ void ADC_DC_Init(ADC_DC_Num_TypeDef DC_Num, ADC_DC_Init_TypeDef* InitStruct); void ADC_DC_StructInit(ADC_DC_Init_TypeDef* InitStruct); /** * @brief Разрешение работы цифрового компаратора * @param DC_Num Выбор компаратора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_DC_OutputCmd(ADC_DC_Num_TypeDef DC_Num, FunctionalState State) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->DC[DC_Num].DCTL_bit.CTE, State); } /** * @brief Настройка источника данных цифрового компаратора * @param DC_Num Выбор компаратора * @param Source Выбор источника * @retval void */ __STATIC_INLINE void ADC_DC_SourceConfig(ADC_DC_Num_TypeDef DC_Num, ADC_DC_Source_TypeDef Source) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_DC_SOURCE(Source)); WRITE_REG(ADC->DC[DC_Num].DCTL_bit.SRC, Source); } /** * @brief Выбор канала АЦП для получения данных цифрового компаратора * @param DC_Num Выбор компаратора * @param Source Выбор источника * @retval void */ __STATIC_INLINE void ADC_DC_ChannelConfig(ADC_DC_Num_TypeDef DC_Num, ADC_CH_Num_TypeDef Channel_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_CH_NUM(Channel_Num)); WRITE_REG(ADC->DC[DC_Num].DCTL_bit.CHNL, Channel_Num); } /** * @brief Настройка режима и условия срабатывания компаратора * @param DC_Num Выбор компаратора * @param Mode Выбор режима * @param Condition Выбор условия * @retval void */ __STATIC_INLINE void ADC_DC_Config(ADC_DC_Num_TypeDef DC_Num, ADC_DC_Mode_TypeDef Mode, ADC_DC_Condition_TypeDef Condition) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_DC_MODE(Mode)); assert_param(IS_ADC_DC_CONDITION(Condition)); MODIFY_REG(ADC->DC[DC_Num].DCTL, ADC_DC_DCTL_CTC_Msk | ADC_DC_DCTL_CTM_Msk, ((Mode << ADC_DC_DCTL_CTM_Pos) | (Condition << ADC_DC_DCTL_CTC_Pos))); } /** * @brief Установка значения нижней границы цифрового компаратора * @param DC_Num Выбор компаратора * @param Val Значение. Диапазон 0-0xFFF. * @retval void */ __STATIC_INLINE void ADC_DC_SetThresholdLow(ADC_DC_Num_TypeDef DC_Num, uint32_t Val) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_DC_THRESHOLD(Val)); WRITE_REG(ADC->DC[DC_Num].DCMP_bit.CMPL, Val); } /** * @brief Получение значения нижней границы цифрового компаратора * @param DC_Num Выбор компаратора * @retval Val Значение. Диапазон 0-0xFFF. */ __STATIC_INLINE uint32_t ADC_DC_GetThresholdLow(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return READ_REG(ADC->DC[DC_Num].DCMP_bit.CMPL); } /** * @brief Установка значения верхней границы цифрового компаратора * @param DC_Num Выбор компаратора * @param Val Значение. Диапазон 0-0xFFF. * @retval void */ __STATIC_INLINE void ADC_DC_SetThresholdHigh(ADC_DC_Num_TypeDef DC_Num, uint32_t Val) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_DC_THRESHOLD(Val)); WRITE_REG(ADC->DC[DC_Num].DCMP_bit.CMPH, Val); } /** * @brief Получение значения верхней границы цифрового компаратора * @param DC_Num Выбор компаратора * @retval Val Значение. Диапазон 0-0xFFF. */ __STATIC_INLINE uint32_t ADC_DC_GetThresholdHigh(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return READ_REG(ADC->DC[DC_Num].DCMP_bit.CMPH); } /** * @brief Чтение статуса события сравнения компаратора * @param DC_Num Выбор компаратора * @retval Status Статус */ __STATIC_INLINE FlagStatus ADC_DC_CmpEventStatus(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return (FlagStatus)READ_BIT(ADC->DCTRIG, 1 << ((uint32_t)DC_Num + ADC_DCTRIG_DCEV0_Pos)); } /** * @brief Сброс статуса события сравнения компаратора * @param DC_Num Выбор компаратора * @retval void */ __STATIC_INLINE void ADC_DC_CmpEventStatusClear(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); WRITE_REG(ADC->DCTRIG, 1 << ((uint32_t)DC_Num + ADC_DCTRIG_DCEV0_Pos)); } /** * @brief Чтение статуса выходного триггера компаратора * @param DC_Num Выбор компаратора * @retval Status Статус */ __STATIC_INLINE FlagStatus ADC_DC_TrigStatus(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return (FlagStatus)READ_BIT(ADC->DCTRIG, 1 << ((uint32_t)DC_Num + ADC_DCTRIG_TOS0_Pos)); } /** * @brief Сброс выходного триггера компаратора * @param DC_Num Выбор компаратора * @retval void */ __STATIC_INLINE void ADC_DC_TrigStatusClear(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); WRITE_REG(ADC->DCTRIG, 1 << ((uint32_t)DC_Num + ADC_DCTRIG_TOS0_Pos)); } /** * @brief Получение последнего значения, использованного для сравнения * @param DC_Num Выбор компаратора * @retval Val Значение. Диапазон 0-0xFFF. */ __STATIC_INLINE uint32_t ADC_DC_GetLastData(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return READ_REG(ADC->DC[DC_Num].DDATA); } /** * @} */ /** @defgroup ADC_Exported_Functions_Int Конфигурация прерываний * @{ */ /** @defgroup ADC_Exported_Functions_Int_DC Цифровые компараторы * @{ */ /** * @brief Включение генерации прерывания компаратора * @param DC_Num Выбор компаратора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_DC_ITCmd(ADC_DC_Num_TypeDef DC_Num, FunctionalState State) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); WRITE_REG(ADC->DC[DC_Num].DCTL_bit.CIE, State); } /** * @brief Настройка условий и режима работы для генерации прерывания компаратора * @param DC_Num Выбор компаратора * @param Mode Выбор режима * @param Condition Выбор состояния * @retval void */ __STATIC_INLINE void ADC_DC_ITConfig(ADC_DC_Num_TypeDef DC_Num, ADC_DC_Mode_TypeDef Mode, ADC_DC_Condition_TypeDef Condition) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_ADC_DC_MODE(Mode)); assert_param(IS_ADC_DC_CONDITION(Condition)); MODIFY_REG(ADC->DC[DC_Num].DCTL, ADC_DC_DCTL_CIC_Msk | ADC_DC_DCTL_CIM_Msk, ((Mode << ADC_DC_DCTL_CIM_Pos) | (Condition << ADC_DC_DCTL_CIC_Pos))); } /** * @brief Маскирование прерывания компаратора * @param DC_Num Выбор компаратора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_DC_ITMaskCmd(ADC_DC_Num_TypeDef DC_Num, FunctionalState State) { assert_param(IS_ADC_DC_NUM(DC_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); MODIFY_REG(ADC->IM, 1 << ((uint32_t)DC_Num + ADC_IM_DCIM0_Pos), State << ((uint32_t)DC_Num + ADC_IM_DCIM0_Pos)); } /** * @brief Запрос немаскированного состояния прерывания компаратора * @param DC_Num Выбор компаратора * @retval Status Состояние */ __STATIC_INLINE FlagStatus ADC_DC_ITRawStatus(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return (FlagStatus)READ_BIT(ADC->RIS, 1 << ((uint32_t)DC_Num + ADC_RIS_DCRIS0_Pos)); } /** * @brief Запрос маскированного состояния прерывания компаратора * @param DC_Num Выбор компаратора * @retval Status Состояние */ __STATIC_INLINE FlagStatus ADC_DC_ITMaskedStatus(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); return (FlagStatus)READ_BIT(ADC->MIS, 1 << ((uint32_t)DC_Num + ADC_MIS_DCMIS0_Pos)); } /** * @brief Сброс флага прерывания компаратора * @param DC_Num Выбор компаратора * @retval void */ __STATIC_INLINE void ADC_DC_ITStatusClear(ADC_DC_Num_TypeDef DC_Num) { assert_param(IS_ADC_DC_NUM(DC_Num)); WRITE_REG(ADC->IC, 1 << ((uint32_t)DC_Num + ADC_IC_DCIC0_Pos)); } /** * @} */ /** @defgroup ADC_Exported_Functions_Int_SEQ Секвенсоры * @{ */ /** * @brief Маскирование прерывания секвенсора * @param SEQ_Num Выбор секвенсора * @param State Выбор состояния * @retval void */ __STATIC_INLINE void ADC_SEQ_ITCmd(ADC_SEQ_Num_TypeDef SEQ_Num, FunctionalState State) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_FUNCTIONAL_STATE(State)); MODIFY_REG(ADC->IM, 1 << ((uint32_t)SEQ_Num + ADC_IM_SEQIM0_Pos), State << ((uint32_t)SEQ_Num + ADC_IM_SEQIM0_Pos)); } /** * @brief Настройка генерации прерывания секвенсора * @param SEQ_Num Выбор секвенсора * @param ITCount Количество запросов модуля АЦП для генерации прерывания. * 0 - по каждому запросу, 0xFF - каждые 256 запросов. * @param ITCountNoRst Активация режима, где счетчик прерывания не будет сбрасываться по запуску секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_ITConfig(ADC_SEQ_Num_TypeDef SEQ_Num, uint32_t ITCount, FunctionalState ITCountNoRst) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); assert_param(IS_ADC_SEQ_IT_COUNT_VAL(ITCount)); assert_param(IS_FUNCTIONAL_STATE(ITCountNoRst)); WRITE_REG(ADC->SEQ[SEQ_Num].SCCTL_bit.ICNT, ITCount); MODIFY_REG(ADC->CICNT, 1 << ((uint32_t)SEQ_Num + ADC_CICNT_ICNT0_Pos), ITCountNoRst << ((uint32_t)SEQ_Num + ADC_CICNT_ICNT0_Pos)); } /** * @brief Получение текущего состояния счетчика запросов, используемого для генерации прерываний * @param SEQ_Num Выбор секвенсора * @retval Val Значение. Диапазон 0-0xFF. */ __STATIC_INLINE uint32_t ADC_SEQ_GetITCountCurrent(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return READ_REG(ADC->SEQ[SEQ_Num].SCVAL_bit.ICNT); } /** * @brief Сброс счетчика запросов, используемого для генерации прерываний * @param SEQ_Num Выбор секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_ITCountRst(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); WRITE_REG(ADC->SEQ[SEQ_Num].SCVAL_bit.ICLR, 1); } /** * @brief Запрос немаскированного состояния прерывания секвенсора * @param SEQ_Num Выбор секвенсора * @retval Status Состояние */ __STATIC_INLINE FlagStatus ADC_SEQ_ITRawStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->RIS, 1 << ((uint32_t)SEQ_Num + ADC_RIS_SEQRIS0_Pos)); } /** * @brief Запрос маскированного состояния прерывания секвенсора * @param SEQ_Num Выбор секвенсора * @retval Status Состояние */ __STATIC_INLINE FlagStatus ADC_SEQ_ITMaskedStatus(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); return (FlagStatus)READ_BIT(ADC->MIS, 1 << ((uint32_t)SEQ_Num + ADC_MIS_SEQMIS0_Pos)); } /** * @brief Сброс флага прерывания секвенсора * @param SEQ_Num Выбор секвенсора * @retval void */ __STATIC_INLINE void ADC_SEQ_ITStatusClear(ADC_SEQ_Num_TypeDef SEQ_Num) { assert_param(IS_ADC_SEQ_NUM(SEQ_Num)); WRITE_REG(ADC->IC, 1 << ((uint32_t)SEQ_Num + ADC_IC_SEQIC0_Pos)); } /** * @} */ /** * @} */ /** * @} */ #ifdef __cplusplus } #endif #endif /* __PLIB035_ADC_H */ /** * @} */ /** * @} */ /******************* (C) COPYRIGHT 2018 NIIET *****END OF FILE****/