Добавлено:
- рефакторинг названий: - маленькие буквы - инит периферии - ТакойСтильФункций - API для использования - сделаны шапки с инструкциями к функциями - доработан ацп секвенсора - доработан систем тики. можно настроить его на разные частоты и подключить коллбеки на разный период - в gpio добавлены функции для кнопок и диодов - генерация бинарника
This commit is contained in:
487
Core/App/adc.c
487
Core/App/adc.c
@@ -1,22 +1,115 @@
|
||||
/*==============================================================================
|
||||
* Инициализация АЦП с использованием бибилотеки PLIB035
|
||||
*------------------------------------------------------------------------------
|
||||
* ЦНИИ СЭТ, Разваляев Алексей <wot890089@mail.ru>
|
||||
*==============================================================================
|
||||
* ЦНИИ СЭТ
|
||||
*==============================================================================
|
||||
*/
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file adc.c
|
||||
* @author Разваляев Алексей
|
||||
* @brief Драйвер ADC на основе PLIB035.
|
||||
* Этот файл содержит:
|
||||
* + Инициализацию ADC и аналогового модуля (AM)
|
||||
* + Управление секвенсорами (SEQ0, SEQ1):
|
||||
* - Инициализацию и конфигурацию секвенсоров
|
||||
* - Запуск и остановку преобразований с буфером
|
||||
* - Обработку прерываний секвенсоров
|
||||
* - Установку callback-функций для событий:
|
||||
* - завершение секвенсора
|
||||
* - половина буфера
|
||||
* - полный буфер
|
||||
* - ошибка
|
||||
* + Управление цифровыми компараторами (DC0-DC3):
|
||||
* - Инициализацию и конфигурацию компараторов
|
||||
* - Запуск и остановку компараторов
|
||||
* - Обработку прерываний компараторов
|
||||
* - Установку callback-функций для событий:
|
||||
* - срабатывание компаратора
|
||||
* - ошибка
|
||||
* + Функции для работы с каналами ADC
|
||||
* + Программный запуск преобразований
|
||||
*
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Использование этого драйвера предполагает наличие корректных настроек:
|
||||
* - Определены конфигурационные структуры adc_seqx_config и adc_dcx_config
|
||||
* в periph_config.h
|
||||
* - Настроено тактирование ADC через RCU
|
||||
* - Для использования прерываний - включены соответствующие NVIC IRQ
|
||||
*
|
||||
******************************************************************************
|
||||
* @verbatim
|
||||
==============================================================================
|
||||
##### Как использовать этот драйвер #####
|
||||
==============================================================================
|
||||
|
||||
1. Общие функции ADC:
|
||||
|
||||
a) Инициализация:
|
||||
(+) adc_init_first() — обязательный вызов перед использованием ADC
|
||||
|
||||
b) Работа с каналами:
|
||||
(+) ADC_Get_ChannelValue(&hadc, channel) — получение текущего значения канала
|
||||
|
||||
|
||||
2. Секвенсоры (SEQ):
|
||||
|
||||
a) Настройка периферии (periph_config.h):
|
||||
(+) Определить структуры ADC_SEQ_ExtInit_TypeDef для нужных секвенсоров:
|
||||
adc_seq0_config, adc_seq1_config
|
||||
(+) Настроить последовательность каналов, режимы работы
|
||||
(+) Настроить прерывания (IT) и ITCount
|
||||
(+) Определить callback-функции (можно NULL)
|
||||
|
||||
b) Инициализация:
|
||||
(+) adc_init_first() — первичная настройка тактирования, сброс ADC, инициализация хендла hadc
|
||||
(+) adc_seq_init(&hadc, ADC_SEQ_Num_0, &adc_seq0_config) — инициализация конкретного секвенсора
|
||||
|
||||
c) Callback-функции (опционально):
|
||||
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_SeqCplt, Callback) — завершение секвенсора
|
||||
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_BuffHalf, Callback) — половина буфера
|
||||
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_BuffFull, Callback) — полный буфер
|
||||
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_Error, Callback) — ошибки
|
||||
|
||||
d) Запуск и остановка:
|
||||
(+) ADC_SEQ_Start(&hadc, ADC_SEQ_Num_0, data_buffer, buffer_size) — запуск с буфером
|
||||
(+) ADC_SEQ_Stop(&hadc, ADC_SEQ_Num_0) — остановка секвенсора
|
||||
|
||||
e) Работа с данными:
|
||||
(+) ADC_Get_ChannelValue(&hadc, channel) — чтение текущего значения канала из хендла
|
||||
(+) ADC_SEQ_SoftwareStart() — программный запуск преобразования
|
||||
|
||||
f) Обработка прерываний:
|
||||
(+) adc_seq_irq_handler(&hadc, ADC_SEQ_Num_0) — обработчик прерываний секвенсора
|
||||
- В обработчике автоматически читаются данные из FIFO, обновляются каналы и буфер
|
||||
- В обработчиках автоматически вызываются соответствующие callback-функции
|
||||
и сбрасываются флаги
|
||||
|
||||
g) Особенности работы:
|
||||
(+) Данные автоматически читаются из FIFO в прерывании
|
||||
(+) Поддерживается кольцевой буфер (BufferCircular)
|
||||
(+) Автоматический вызов callback при заполнении половины/всего буфера
|
||||
|
||||
3. Цифровые компараторы (DC):
|
||||
|
||||
|
||||
@endverbatim
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
//-- Includes ------------------------------------------------------------------
|
||||
#include "periph_config.h"
|
||||
|
||||
ADC_HandleTypeDef hadc;
|
||||
ADC_HandleTypeDef hadc; /*!< Хендл ADC */
|
||||
|
||||
//-- Private function prototypes -----------------------------------------------
|
||||
static void __adc_seq_fifo_read(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num);
|
||||
static int __adc_seq_calc_fifo_load(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num);
|
||||
//-- Defines -------------------------------------------------------------------
|
||||
|
||||
//-- Peripheral init functions -------------------------------------------------
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////////////SEQUENCORS/////////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
//-- ADC Init functions --------------------------------------------------------
|
||||
/**
|
||||
* @brief Первичная инициализация ADC
|
||||
* @details Настройка ADC и хендла: тактирования, прерывания
|
||||
* и секвенсоры с компараторами
|
||||
*/
|
||||
void adc_init_first(void)
|
||||
{
|
||||
#if (USE_ADC_SEQ0==1) || (USE_ADC_SEQ1==1) || (USE_ADC_DC0==1) || (USE_ADC_DC1==1) || (USE_ADC_DC2==1) || (USE_ADC_DC3==1)
|
||||
@@ -41,11 +134,12 @@ void adc_init_first(void)
|
||||
#endif
|
||||
#if (USE_ADC_SEQ1==1)
|
||||
adc_seq_init(&hadc, ADC_SEQ_Num_1, &adc_seq1_config);
|
||||
if(hadc.SEQ_Config[ADC_SEQ_Num_1]->IT == ENABLE)
|
||||
if(hadc.SEQ[ADC_SEQ_Num_1].Config->IT == ENABLE)
|
||||
{
|
||||
NVIC_EnableIRQ(ADC_SEQ1_IRQn);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (USE_ADC_DC0==1)
|
||||
#endif
|
||||
#if (USE_ADC_DC1==1)
|
||||
@@ -64,6 +158,8 @@ void adc_init_first(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
//-- ADC Sequencers API functions ----------------------------------------------
|
||||
|
||||
/**
|
||||
* @brief Инициализация секвенсора АЦП
|
||||
* @param hadc указатель на хендл АЦП
|
||||
@@ -87,6 +183,16 @@ OperationStatus adc_seq_init(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Nu
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config;
|
||||
if(conf->SEQ_Init.RestartTimer) // не значю почему но этот таймер работает в 2 раза медленее чем AdcClk
|
||||
{
|
||||
conf->SEQ_Init.RestartTimer = (conf->SEQ_Init.RestartTimer+1)/2-1; // поэтому дополнительно делим всё на два чтобы работало
|
||||
}
|
||||
|
||||
if(__adc_seq_calc_fifo_load(hadc, SEQ_Num) < 0)
|
||||
return ERROR;
|
||||
|
||||
|
||||
ADC_SEQ_Init(SEQ_Num, &hseq->Config->SEQ_Init);
|
||||
|
||||
return OK;
|
||||
@@ -95,20 +201,20 @@ OperationStatus adc_seq_init(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Nu
|
||||
/**
|
||||
* @brief Установка коллбека секвенсора АЦП
|
||||
* @param hadc указатель на хендл АЦП
|
||||
* @param cb_type Тип коллбека
|
||||
* @param CallbackType Тип коллбека
|
||||
* @param Callback Функция коллбека
|
||||
* @retval void
|
||||
*/
|
||||
OperationStatus adc_seq_set_callback(ADC_HandleTypeDef* hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_CallbackTypeDef cb_type, void (*Callback)(void))
|
||||
OperationStatus ADC_SEQ_Set_Callback(ADC_HandleTypeDef* hadc, ADC_SEQ_Num_TypeDef SEQ_Num, ADC_CallbackTypeDef CallbackType, void (*Callback)(void))
|
||||
{
|
||||
if (!hadc || !hadc->Instance || !hadc->SEQ[SEQ_Num].Config)
|
||||
return ERROR;
|
||||
|
||||
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
|
||||
switch(cb_type)
|
||||
switch(CallbackType)
|
||||
{
|
||||
case ADC_Callback_Seq:
|
||||
case ADC_Callback_SeqCplt:
|
||||
hseq->Config->SEQCpltCallback = Callback;
|
||||
break;
|
||||
case ADC_Callback_Error:
|
||||
@@ -135,7 +241,7 @@ OperationStatus adc_seq_set_callback(ADC_HandleTypeDef* hadc, ADC_SEQ_Num_TypeDe
|
||||
* @param buffer_size размер буфера для каждого канала (0 если буфер не используется)
|
||||
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
|
||||
*/
|
||||
OperationStatus adc_seq_start(ADC_HandleTypeDef *hadc,
|
||||
OperationStatus ADC_SEQ_Start(ADC_HandleTypeDef *hadc,
|
||||
ADC_SEQ_Num_TypeDef SEQ_Num,
|
||||
uint16_t (*data_buffer)[],
|
||||
uint32_t buffer_size)
|
||||
@@ -151,18 +257,24 @@ OperationStatus adc_seq_start(ADC_HandleTypeDef *hadc,
|
||||
hseq->buffer_size = buffer_size;
|
||||
hseq->buffer_count = 0; // Сбрасываем счетчик
|
||||
|
||||
|
||||
// DMA > IT
|
||||
if(conf->SEQ_Init.DMAEn == ENABLE)
|
||||
{
|
||||
conf->IT = DISABLE;
|
||||
}
|
||||
|
||||
// Настраиваем прерывания если нужно
|
||||
if (conf->IT == ENABLE)
|
||||
{
|
||||
ADC_SEQ_ITConfig(SEQ_Num, conf->ITCount, DISABLE);
|
||||
uint32_t it_real_cnt = (uint32_t)(conf->ITCount+1)*(conf->SEQ_Init.ReqMax+1);
|
||||
ADC_SEQ_ITConfig(SEQ_Num, it_real_cnt-1, DISABLE);
|
||||
ADC_SEQ_ITCmd(SEQ_Num, ENABLE);
|
||||
}
|
||||
|
||||
// Включаем секвенсор
|
||||
ADC_SEQ_Cmd(SEQ_Num, ENABLE);
|
||||
|
||||
// Помечаем как запущенный
|
||||
hseq->running = 1;
|
||||
|
||||
return OK;
|
||||
}
|
||||
@@ -174,22 +286,19 @@ OperationStatus adc_seq_start(ADC_HandleTypeDef *hadc,
|
||||
* @param SEQ_Num номер секвенсора
|
||||
* @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
|
||||
*/
|
||||
OperationStatus adc_seq_stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
OperationStatus ADC_SEQ_Stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
{
|
||||
if (!hadc || !hadc->Instance || !hadc->SEQ[SEQ_Num].Config)
|
||||
return ERROR;
|
||||
|
||||
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
// ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
|
||||
// Выключаем секвенсор
|
||||
ADC_SEQ_Cmd(SEQ_Num, DISABLE);
|
||||
|
||||
// Выключаем прерывания
|
||||
ADC_SEQ_ITCmd(SEQ_Num, DISABLE);
|
||||
|
||||
// Сбрасываем флаг запуска
|
||||
hseq->running = 1;
|
||||
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -199,40 +308,34 @@ OperationStatus adc_seq_stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Nu
|
||||
* @param channel номер канала
|
||||
* @retval значение ADC (0 если данные невалидны)
|
||||
*/
|
||||
uint16_t adc_get_channel_value(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel)
|
||||
uint16_t ADC_Get_ChannelValue(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel)
|
||||
{
|
||||
if (!hadc || channel >= ADC_CH_Total)
|
||||
if (!hadc || (int)channel >= ADC_CH_Total)
|
||||
return 0;
|
||||
|
||||
if (hadc->ChannelValid[channel])
|
||||
{
|
||||
return hadc->ChannelData[channel];
|
||||
}
|
||||
|
||||
return 0;
|
||||
return hadc->ChannelData[channel];
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Программный запуск преобразования
|
||||
*/
|
||||
void adc_sw_start(void)
|
||||
void ADC_SEQ_SoftwareStart(void)
|
||||
{
|
||||
ADC_SEQ_SwStartCmd();
|
||||
}
|
||||
|
||||
|
||||
|
||||
int itcnt;
|
||||
/**
|
||||
* @brief Обработчик прерываний секвенсора
|
||||
* @param hadc указатель на хендл АЦП
|
||||
* @param SEQ_Num номер секвенсора
|
||||
* @retval void
|
||||
*/
|
||||
void adc_seq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
void adc_seq_irq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
{
|
||||
if (!hadc || !hadc->Instance || !hadc->SEQ[SEQ_Num].Config)
|
||||
return;
|
||||
|
||||
// GPIO_SetBits(GPIOA, GPIO_Pin_7);
|
||||
itcnt++;
|
||||
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config;
|
||||
|
||||
@@ -242,73 +345,7 @@ void adc_seq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
// Очищаем флаг
|
||||
ADC_SEQ_ITStatusClear(SEQ_Num);
|
||||
|
||||
// Последний запрос в секвенсоре
|
||||
ADC_SEQ_ReqNum_TypeDef last_request = conf->SEQ_Init.ReqMax;
|
||||
|
||||
// Читаем все доступные данные из FIFO
|
||||
uint8_t channels_processed = 0;
|
||||
while (ADC_SEQ_GetFIFOLoad(ADC_SEQ_Num_0))
|
||||
{
|
||||
uint32_t data = ADC_SEQ_GetFIFOData(SEQ_Num);
|
||||
ADC_SEQ_ReqNum_TypeDef req_num = ADC_SEQ_GetReqCurrent(SEQ_Num);
|
||||
|
||||
if (req_num < ADC_SEQ_Req_Total)
|
||||
{
|
||||
ADC_CH_Num_TypeDef channel = conf->SEQ_Init.Req[req_num];
|
||||
|
||||
if (channel < ADC_CH_Total)
|
||||
{
|
||||
// 1. Обновляем текущее значение
|
||||
hadc->ChannelData[channel] = (uint16_t)data;
|
||||
hadc->ChannelValid[channel] = 1;
|
||||
|
||||
// 2. Записываем в буфер если он есть
|
||||
if (hseq->data_buffer &&
|
||||
hseq->buffer_size > 0)
|
||||
{
|
||||
// Вычисляем offset для [ch][buffer_size]
|
||||
uint32_t offset = channel * hseq->buffer_size +
|
||||
hseq->buffer_count;
|
||||
hseq->data_buffer[offset] = (uint16_t)data;
|
||||
}
|
||||
|
||||
channels_processed++;
|
||||
|
||||
// Если это последний канал в секвенсоре - увеличиваем счетчик буфера
|
||||
if (req_num == last_request)
|
||||
{
|
||||
hseq->buffer_count++;
|
||||
|
||||
if(hseq->buffer_count == hseq->buffer_size/2)
|
||||
{
|
||||
if (conf->BuffHalfCallback)
|
||||
{
|
||||
conf->BuffHalfCallback();
|
||||
}
|
||||
}
|
||||
if(hseq->buffer_count >= hseq->buffer_size)
|
||||
{
|
||||
// Кольцевой буфер
|
||||
if(conf->buffer_circular)
|
||||
hseq->buffer_count = 0;
|
||||
else
|
||||
adc_seq_stop(hadc, SEQ_Num);
|
||||
|
||||
if (conf->BuffFullCallback)
|
||||
{
|
||||
conf->BuffFullCallback();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Вызываем коллбек пользователя
|
||||
if (conf->SEQCpltCallback)
|
||||
{
|
||||
conf->SEQCpltCallback();
|
||||
}
|
||||
__adc_seq_fifo_read(hadc, SEQ_Num);
|
||||
}
|
||||
|
||||
// Обработка ошибок
|
||||
@@ -321,117 +358,127 @@ void adc_seq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
conf->ErrorCallback();
|
||||
}
|
||||
}
|
||||
|
||||
// GPIO_ClearBits(GPIOA, GPIO_Pin_7);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Внутренняя функция для расчета загрузки FIFO буфера
|
||||
* @param hadc указатель на хендл АЦП
|
||||
* @param SEQ_Num номер секвенсора
|
||||
* @retval Кол-во данных FIFO буфера, или -1 если переполнение FIFO
|
||||
* @details Рассчитывает сколько данных накопится в fifo буфере за одно прерывание
|
||||
*/
|
||||
static int __adc_seq_calc_fifo_load(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
{
|
||||
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config;
|
||||
|
||||
int numb_of_data = 0;
|
||||
uint32_t numb_of_req = ((uint32_t)conf->SEQ_Init.ReqMax+1);
|
||||
uint32_t it_cnt = ((uint32_t)conf->ITCount+1);
|
||||
|
||||
|
||||
if(conf->SEQ_Init.RestartAverageEn)
|
||||
{
|
||||
numb_of_data = numb_of_req;
|
||||
}
|
||||
else
|
||||
{
|
||||
numb_of_data = it_cnt*numb_of_req;
|
||||
if(numb_of_data > 32) // Максимальный размер FIFO - 32 элемента, поэтому если слишком многшо данных за время работы перед прерыванием - то ошибка
|
||||
return -1;
|
||||
}
|
||||
|
||||
return numb_of_data;
|
||||
}
|
||||
/**
|
||||
* @brief Внутренняя функция для чтения данных из FIFO
|
||||
* @param hadc указатель на хендл АЦП
|
||||
* @param SEQ_Num номер секвенсора
|
||||
* @retval void
|
||||
* @details Автоматически достает данные из FIFO и складывает их в заданный буфер
|
||||
и в структуру hadc
|
||||
*/
|
||||
static void __adc_seq_fifo_read(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
|
||||
{
|
||||
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
|
||||
_ADC_SEQ_TypeDef *SEQx = &hadc->Instance->SEQ[SEQ_Num];
|
||||
ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config;
|
||||
|
||||
// Последний запрос в секвенсоре
|
||||
uint32_t last_request = SEQx->SRQCTL_bit.RQMAX;
|
||||
uint32_t numb_of_request = last_request+1;
|
||||
|
||||
// Читаем все доступные данные из FIFO
|
||||
uint32_t fifo_size = ADC_SEQ_GetFIFOLoad(SEQ_Num);
|
||||
uint32_t req_num = ((int)ADC_SEQ_GetReqCurrent(SEQ_Num)-fifo_size)%(numb_of_request); // первая дата в fifo будет (следующий запрос - количество данных в буфере)
|
||||
while (ADC_SEQ_GetFIFOLoad(SEQ_Num))
|
||||
{
|
||||
uint32_t data = ADC_SEQ_GetFIFOData(SEQ_Num);
|
||||
|
||||
if(ADC_SEQ_GetFIFOLoad(SEQ_Num) == 0)
|
||||
{
|
||||
__NOP();
|
||||
}
|
||||
if ((int)req_num < ADC_SEQ_Req_Total)
|
||||
{
|
||||
ADC_CH_Num_TypeDef channel = conf->SEQ_Init.Req[req_num];
|
||||
|
||||
if ((int)channel < ADC_CH_Total)
|
||||
{
|
||||
// 1. Обновляем текущее значение
|
||||
hadc->ChannelData[channel] = (uint16_t)data;
|
||||
|
||||
// 2. Записываем в буфер если он есть
|
||||
if (hseq->data_buffer &&
|
||||
hseq->buffer_size > 0)
|
||||
{
|
||||
// Вычисляем offset для [ch][buffer_size]
|
||||
uint32_t offset = req_num * hseq->buffer_size +
|
||||
hseq->buffer_count;
|
||||
hseq->data_buffer[offset] = (uint16_t)data;
|
||||
}
|
||||
}
|
||||
|
||||
// Если это последний канал в секвенсоре - увеличиваем счетчик буфера
|
||||
if (req_num == last_request)
|
||||
{
|
||||
hseq->buffer_count++;
|
||||
|
||||
if(hseq->buffer_count == hseq->buffer_size/2)
|
||||
{
|
||||
if (conf->BuffHalfCallback)
|
||||
{
|
||||
conf->BuffHalfCallback();
|
||||
}
|
||||
}
|
||||
if(hseq->buffer_count >= hseq->buffer_size)
|
||||
{
|
||||
// Кольцевой буфер
|
||||
if(conf->BufferCircular)
|
||||
hseq->buffer_count = 0;
|
||||
else
|
||||
ADC_SEQ_Stop(hadc, SEQ_Num);
|
||||
|
||||
if (conf->BuffFullCallback)
|
||||
{
|
||||
conf->BuffFullCallback();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Переход на Следующий канал
|
||||
req_num = (req_num+1)%numb_of_request;
|
||||
}
|
||||
|
||||
// Вызываем коллбек пользователя
|
||||
if (conf->SEQCpltCallback)
|
||||
{
|
||||
conf->SEQCpltCallback();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
////////////////////////////DIGITAL COMPARATORS/////////////////////////////////
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
///**
|
||||
// * @brief Инициализация цифрового компаратора АЦП
|
||||
// * @param hadc указатель на хендл АЦП
|
||||
// * @param DC_Num номер компаратора
|
||||
// * @param NewConfig указатель на конфигурацию
|
||||
// * @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
|
||||
// */
|
||||
//OperationStatus adc_dc_init(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num, ADC_DC_ExtInit_TypeDef *NewConfig)
|
||||
//{
|
||||
// if(!hadc || !hadc->Instance)
|
||||
// return ERROR;
|
||||
//
|
||||
// if(NewConfig != NULL)
|
||||
// {
|
||||
// hadc->DC_Config[DC_Num] = NewConfig;
|
||||
// }
|
||||
//
|
||||
// if(hadc->DC_Config[DC_Num] == NULL)
|
||||
// {
|
||||
// return ERROR;
|
||||
// }
|
||||
//
|
||||
// // Инициализация компаратора
|
||||
// ADC_DC_Init(DC_Num, &hadc->DC_Config[DC_Num]->DC_Init);
|
||||
//
|
||||
// return OK;
|
||||
//}
|
||||
|
||||
|
||||
///**
|
||||
// * @brief Установка коллбека цифрового компаратора АЦП
|
||||
// * @param hadc указатель на хендл АЦП
|
||||
// * @param DC_Num номер компаратора
|
||||
// * @param cb_type тип коллбека
|
||||
// * @param Callback функция коллбека
|
||||
// * @retval OperationStatus
|
||||
// */
|
||||
//OperationStatus adc_dc_set_callback(ADC_HandleTypeDef* hadc, ADC_DC_Num_TypeDef DC_Num, ADC_CallbackTypeDef cb_type, void (*Callback)(void))
|
||||
//{
|
||||
// if (!hadc || !hadc->Instance || !hadc->DC_Config[DC_Num])
|
||||
// return ERROR;
|
||||
//
|
||||
// switch(cb_type)
|
||||
// {
|
||||
// case ADC_Callback_DC:
|
||||
// hadc->DC_Config[DC_Num]->DC_TrigCallback = Callback;
|
||||
// break;
|
||||
// case ADC_Callback_Error:
|
||||
// hadc->DC_Config[DC_Num]->ErrorCallback = Callback;
|
||||
// break;
|
||||
// default:
|
||||
// return ERROR;
|
||||
// }
|
||||
// return OK;
|
||||
//}
|
||||
|
||||
|
||||
///**
|
||||
// * @brief Запуск цифрового компаратора АЦП
|
||||
// * @param hadc указатель на хендл АЦП
|
||||
// * @param DC_Num номер компаратора
|
||||
// * @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
|
||||
// */
|
||||
//OperationStatus adc_dc_start(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num)
|
||||
//{
|
||||
// if (!hadc || !hadc->Instance || !hadc->DC_Config[DC_Num])
|
||||
// return ERROR;
|
||||
//
|
||||
// ADC_DC_ExtInit_TypeDef *conf = hadc->DC_Config[DC_Num];
|
||||
//
|
||||
// // Включаем выход компаратора
|
||||
// ADC_DC_OutputCmd(DC_Num, ENABLE);
|
||||
//
|
||||
// // Настраиваем прерывания если нужно
|
||||
// if(conf->IT == ENABLE)
|
||||
// {
|
||||
// ADC_DC_ITCmd(DC_Num, ENABLE);
|
||||
// }
|
||||
//
|
||||
// return OK;
|
||||
//}
|
||||
|
||||
///**
|
||||
// * @brief Остановка цифрового компаратора АЦП
|
||||
// * @param hadc указатель на хендл АЦП
|
||||
// * @param DC_Num номер компаратора
|
||||
// * @retval OperationStatus OK - если всё хорошо, ERROR - если ошибка
|
||||
// */
|
||||
//OperationStatus adc_dc_stop(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num)
|
||||
//{
|
||||
// if (!hadc || !hadc->Instance || !hadc->DC_Config[DC_Num])
|
||||
// return ERROR;
|
||||
//
|
||||
// // Выключаем выход компаратора
|
||||
// ADC_DC_OutputCmd(DC_Num, DISABLE);
|
||||
//
|
||||
// // Выключаем прерывания
|
||||
// ADC_DC_ITCmd(DC_Num, DISABLE);
|
||||
//
|
||||
// return OK;
|
||||
//}
|
||||
|
||||
//void adc_dc_handler(ADC_HandleTypeDef *hadc, ADC_DC_Num_TypeDef DC_Num)
|
||||
//{
|
||||
//}
|
||||
//-- ADC Digital Comparators API functions -------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user