Шаблон проекта с моей расширенной библиотекой MyLibs

This commit is contained in:
2025-12-25 10:36:35 +03:00
commit c6e1dc049f
69 changed files with 40782 additions and 0 deletions

View File

@@ -0,0 +1,1155 @@
/**
******************************************************************************
* @file plib035_adc.h
*
* @brief Файл содержит прототипы и компактные inline реализации функций для
* ADC, а также сопутствующие макроопределения и перечисления
*
* @author НИИЭТ, Богдан Колбов <kolbov@niiet.ru>
*
******************************************************************************
* @attention
*
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ
* ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ
* НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ
* ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА
* ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ
* ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ
* ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ
* ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
* ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*
* <h2><center>&copy; 2018 ОАО "НИИЭТ"</center></h2>
******************************************************************************
*/
/* 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****/