Обновлены шапки и по мелочи

This commit is contained in:
2025-12-28 14:06:19 +03:00
parent f3e76e105a
commit 8b930ebe12
12 changed files with 523 additions and 251 deletions

View File

@@ -12,7 +12,7 @@
* - Установку callback-функций для событий: * - Установку callback-функций для событий:
* - завершение секвенсора * - завершение секвенсора
* - половина буфера * - половина буфера
* - полный буфер * - полный буфера
* - ошибка * - ошибка
* + Управление цифровыми компараторами (DC0-DC3): * + Управление цифровыми компараторами (DC0-DC3):
* - Инициализацию и конфигурацию компараторов * - Инициализацию и конфигурацию компараторов
@@ -39,55 +39,101 @@
##### Как использовать этот драйвер ##### ##### Как использовать этот драйвер #####
============================================================================== ==============================================================================
1. Общие функции ADC: -------------------------- Общие функции АЦП --------------------------------
a) Инициализация: 1. Инициализация АЦП:
(+) adc_init_first() обязательный вызов перед использованием ADC (+) adc_init_first() - обязательный вызов перед использованием АЦП
(+) Настраивает тактирование, GPIO и ожидает готовности аналогового модуля
b) Работа с каналами: 2. Калибровка каналов:
(+) ADC_Get_ChannelValue(&hadc, channel) — получение текущего значения канала (+) ADC_Channel_Calibr(&hadc, channel, OFFSET, GAIN) - калибровка смещения и усиления
(+) Формула калибровки: Dc = Dr * (4096+GAIN)/4096 + OFFSET
3. Чтение значений каналов:
(+) ADC_Channel_GetValue(&hadc, channel) - получение текущего значения канала
(+) Данные обновляются автоматически при работе секвенсоров
4. Инициализация GPIO:
(+) adc_gpio_init(hadc.ChannelEnable) - настраивает пины выбранных каналов
(+) Вызывается автоматически в adc_init_first()
------------------------ Секвенсоры (SEQ0, SEQ1) ----------------------------
1. Настройка в periph_config.h:
(+) Определите adc_seq0_config, adc_seq1_config
(+) Настройте ADC_ClockSource и ADC_ClockMHz для тактирования АЦП
(+) Определите adc_ch_config для включения нужных каналов
2. Инициализация секвенсоров:
(+) adc_seq_init(&hadc, ADC_SEQ_Num_0, &adc_seq0_config) - инициализация SEQ0
(+) Аналогично для SEQ1 при необходимости
3. Работа с секвенсорами:
(+) ADC_SEQ_Start(&hadc, ADC_SEQ_Num_0, buffer, buffer_size) - запуск с буфером
(+) ADC_SEQ_Stop(&hadc, ADC_SEQ_Num_0) - остановка секвенсора
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, тип, func) - установка обработчика
(+) ADC_SEQ_SoftwareStart() - программный запуск преобразования
4. Обработка прерываний секвенсоров:
(+) ADC_SEQ0_IRQHandler - вызвать adc_seq_irq_handler(&hadc, ADC_SEQ_Num_0)
(+) ADC_SEQ1_IRQHandler - вызвать adc_seq_irq_handler(&hadc, ADC_SEQ_Num_1)
------------------------ Цифровые компараторы (DC) --------------------------
2. Секвенсоры (SEQ): ==============================================================================
##### Особенности работы #####
==============================================================================
a) Настройка периферии (periph_config.h): -------------------------- Общие особенности --------------------------------
(+) Определить структуры ADC_SEQ_ExtInit_TypeDef для нужных секвенсоров:
adc_seq0_config, adc_seq1_config
(+) Настроить последовательность каналов, режимы работы
(+) Настроить прерывания (IT) и ITCount
(+) Определить callback-функции (можно NULL)
b) Инициализация: - Частота ADC:
(+) adc_init_first() — первичная настройка тактирования, сброс ADC, инициализация хендла hadc - Задается через ADC_ClockMHz в periph_config.h
(+) adc_seq_init(&hadc, ADC_SEQ_Num_0, &adc_seq0_config) — инициализация конкретного секвенсора - Автоматически настраивается делитель от источника тактирования
c) Callback-функции (опционально): - Аналоговый модуль (AM):
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_SeqCplt, Callback) — завершение секвенсора - Требует времени для старта после включения (до 1 мс)
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_BuffHalf, Callback) — половина буфера - adc_init_first() ожидает готовности AM с таймаутом 1 секунда
(+) ADC_SEQ_Set_Callback(&hadc, ADC_SEQ_Num_0, ADC_Callback_BuffFull, Callback) — полный буфер - При неудаче вызывает Error_Handler()
(+) 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) — запуск с буфером - OFFSET: смещение в диапазоне [-255, 255] квантов АЦП
(+) ADC_SEQ_Stop(&hadc, ADC_SEQ_Num_0) — остановка секвенсора - GAIN: коэффициент усиления в диапазоне [-255, 255] квантов АЦП (4096+GAIN)
- Калибровка применяется аппаратно для каждого канала отдельно
e) Работа с данными: ------------------------ Секвенсоры (SEQ0, SEQ1) ----------------------------
(+) ADC_Get_ChannelValue(&hadc, channel) — чтение текущего значения канала из хендла
(+) ADC_SEQ_SoftwareStart() — программный запуск преобразования
f) Обработка прерываний: - Буферизация данных:
(+) adc_seq_irq_handler(&hadc, ADC_SEQ_Num_0) — обработчик прерываний секвенсора - Данные в буфере хранятся в формате [канал][время]
- В обработчике автоматически читаются данные из FIFO, обновляются каналы и буфер - При buffer_size=100 для 2 каналов буфер будет 200 элементов
- В обработчиках автоматически вызываются соответствующие callback-функции - Буфер может быть кольцевым (BufferCircular=ENABLE)
и сбрасываются флаги
g) Особенности работы: - Прерывания секвенсоров:
(+) Данные автоматически читаются из FIFO в прерывании - Генерируются после заданного количества рестартов (ITCount)
(+) Поддерживается кольцевой буфер (BufferCircular) - ITCount=0 означает прерывание после каждого прохода секвенсора
(+) Автоматический вызов callback при заполнении половины/всего буфера - Данные автоматически читаются из FIFO в прерывании
3. Цифровые компараторы (DC): - Работа с усреднением:
- Аппаратное усреднение измерения:
- 2, 4, 8, 16, 32 или 64 выборок (SEQ_Init.ReqAverage)
- Включается через SEQ_Init.ReqAverageEn
- Усредненные значения помещаются в FIFO как единый результат
- Аппаратное усреднение рестартов
- 2, 4, 8, 16, 32, 64, 128, 256 выборок (SER_Init.RestartCount + 1)
- Включается через SEQ_Init.RestartAverageEn
- Усредненные значения помещаются в FIFO как единый результат
- Таймер рестартов:
- Период в тиках ADC_ClockMHz/2 (драйвер автоматически делит на 2)
- Используется для периодического запуска секвенсора
- При RestartTimer=0 рестарт происходит немедленно
- Чтение FIFO:
- FIFO буфер на 32 элемента автоматически читается в прерывании
- Данные распределяются по каналам согласно последовательности в Req[0..3]
- При переполнении FIFO (>32 элементов до прерывания) возможна потеря данных
------------------------ Цифровые компараторы (DC) --------------------------
@endverbatim @endverbatim
****************************************************************************** ******************************************************************************
@@ -122,6 +168,10 @@ void adc_init_first(void)
// Включаем аналоговый модуль // Включаем аналоговый модуль
ADC_AM_Cmd(ENABLE); ADC_AM_Cmd(ENABLE);
// Настройка пинов для ADC
hadc.ChannelEnable = &adc_ch_config;
adc_gpio_init(hadc.ChannelEnable);
hadc.Instance = ADC; hadc.Instance = ADC;
#endif #endif
@@ -140,15 +190,6 @@ void adc_init_first(void)
} }
#endif #endif
#if (USE_ADC_DC0==1)
#endif
#if (USE_ADC_DC1==1)
#endif
#if (USE_ADC_DC2==1)
#endif
#if (USE_ADC_DC3==1)
#endif
#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) #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)
uint32_t starttick = millis(); uint32_t starttick = millis();
while (!ADC_AM_ReadyStatus()) { while (!ADC_AM_ReadyStatus()) {
@@ -158,6 +199,41 @@ void adc_init_first(void)
#endif #endif
} }
/**
* @brief Записать калибровочные значения канала
* @param hadc указатель на хендл АЦП
* @param channel номер канала
* @param OFFSET Коэффициент корректировки смещения нуля АЦП в квантах [-255:255]
* @param GAIN Коэффициент корректировки усиления зн АЦП в квантах [-255:255]
* @retval значение ADC (0 если данные невалидны)
* @details Результат преобразования передается на схему коррекции, которая нивелирует
* ошибку усиления и смещения нуля и работа которой описывается формулой
* Dc = Dr * (4096+GAIN)/4096 + OFFSET
*/
OperationStatus ADC_Channel_Calibr(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel, int OFFSET, int GAIN)
{
if (!hadc || (int)channel >= ADC_CH_Total)
return ERROR;
ADC_CH_SetOffsetTrim(channel, OFFSET);
ADC_CH_SetGainTrim(channel, GAIN);
return OK;
}
/**
* @brief Получение текущего значения канала
* @param hadc указатель на хендл АЦП
* @param channel номер канала
* @retval значение ADC (0 если данные невалидны)
*/
uint16_t ADC_Channel_GetValue(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel)
{
if (!hadc || (int)channel >= ADC_CH_Total)
return 0;
return hadc->ChannelData[channel];
}
//-- ADC Sequencers API functions ---------------------------------------------- //-- ADC Sequencers API functions ----------------------------------------------
/** /**
@@ -302,20 +378,6 @@ OperationStatus ADC_SEQ_Stop(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Nu
return OK; return OK;
} }
/**
* @brief Получение текущего значения канала
* @param hadc указатель на хендл АЦП
* @param channel номер канала
* @retval значение ADC (0 если данные невалидны)
*/
uint16_t ADC_Get_ChannelValue(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel)
{
if (!hadc || (int)channel >= ADC_CH_Total)
return 0;
return hadc->ChannelData[channel];
}
/** /**
* @brief Программный запуск преобразования * @brief Программный запуск преобразования
*/ */
@@ -323,7 +385,7 @@ void ADC_SEQ_SoftwareStart(void)
{ {
ADC_SEQ_SwStartCmd(); ADC_SEQ_SwStartCmd();
} }
int itcnt;
/** /**
* @brief Обработчик прерываний секвенсора * @brief Обработчик прерываний секвенсора
* @param hadc указатель на хендл АЦП * @param hadc указатель на хендл АЦП
@@ -335,7 +397,7 @@ void adc_seq_irq_handler(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_Num)
if (!hadc || !hadc->Instance || !hadc->SEQ[SEQ_Num].Config) if (!hadc || !hadc->Instance || !hadc->SEQ[SEQ_Num].Config)
return; return;
// GPIO_SetBits(GPIOA, GPIO_Pin_7); // GPIO_SetBits(GPIOA, GPIO_Pin_7);
itcnt++;
ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num]; ADC_SEQ_HandleTypeDef *hseq = &hadc->SEQ[SEQ_Num];
ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config; ADC_SEQ_ExtInit_TypeDef *conf = hseq->Config;
@@ -482,3 +544,45 @@ static void __adc_seq_fifo_read(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ
//-- ADC Digital Comparators API functions ------------------------------------- //-- ADC Digital Comparators API functions -------------------------------------
//-- ADC GPIO functions --------------------------------------------------------
/**
* @brief Инициализация GPIO для ADC
*/
void adc_gpio_init(ADC_ChannelEnableTypeDef *ChEn)
{
#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)
// Получаем структуру
GPIO_Init_TypeDef *ch0_config = gpio_get_init(ADC_Ch0_GPIO_Port, ADC_Ch0_Pin);
GPIO_Init_TypeDef *ch1_config = gpio_get_init(ADC_Ch1_GPIO_Port, ADC_Ch1_Pin);
GPIO_Init_TypeDef *ch2_config = gpio_get_init(ADC_Ch2_GPIO_Port, ADC_Ch2_Pin);
GPIO_Init_TypeDef *ch3_config = gpio_get_init(ADC_Ch3_GPIO_Port, ADC_Ch3_Pin);
if(ChEn->Ch0)
{
GPIO_StructInit(ch0_config);
ch0_config->Pin = ADC_Ch0_Pin;
GPIO_Init(ADC_Ch0_GPIO_Port, ch0_config);
}
if(ChEn->Ch1)
{
GPIO_StructInit(ch1_config);
ch1_config->Pin = ADC_Ch1_Pin;
GPIO_Init(ADC_Ch1_GPIO_Port, ch1_config);
}
if(ChEn->Ch2)
{
GPIO_StructInit(ch2_config);
ch2_config->Pin = ADC_Ch2_Pin;
GPIO_Init(ADC_Ch2_GPIO_Port, ch2_config);
}
if(ChEn->Ch3)
{
GPIO_StructInit(ch3_config);
ch3_config->Pin = ADC_Ch3_Pin;
GPIO_Init(ADC_Ch3_GPIO_Port, ch3_config);
}
#endif
}

View File

@@ -17,6 +17,18 @@
#include "retarget_conf.h" #include "retarget_conf.h"
//-- Defines ------------------------------------------------------------------- //-- Defines -------------------------------------------------------------------
// Дефайны для пинов ADC
#define ADC_Ch0_Pin GPIO_Pin_0 /**< PB0 — ADC Channel 0 */
#define ADC_Ch0_GPIO_Port GPIOB /**< GPIO порт ADC Channel 0 */
#define ADC_Ch1_Pin GPIO_Pin_1 /**< PB1 — ADC Channel 1 */
#define ADC_Ch1_GPIO_Port GPIOB /**< GPIO порт ADC Channel 1 */
#define ADC_Ch2_Pin GPIO_Pin_2 /**< PB2 — ADC Channel 2 */
#define ADC_Ch2_GPIO_Port GPIOB /**< GPIO порт ADC Channel 2 */
#define ADC_Ch3_Pin GPIO_Pin_3 /**< PB3 — ADC Channel 3 */
#define ADC_Ch3_GPIO_Port GPIOB /**< GPIO порт ADC Channel 3 */
//-- Types --------------------------------------------------------------------- //-- Types ---------------------------------------------------------------------
@@ -32,6 +44,17 @@ typedef enum
ADC_Callback_Error, /*!< Ошибка */ ADC_Callback_Error, /*!< Ошибка */
}ADC_CallbackTypeDef; }ADC_CallbackTypeDef;
/**
* @brief Типы callback-функций ADC
*/
typedef struct
{
unsigned Ch0:1; /*!< АЦП Канал 0 */
unsigned Ch1:1; /*!< АЦП Канал 1 */
unsigned Ch2:1; /*!< АЦП Канал 2 */
unsigned Ch3:1; /*!< АЦП Канал 3 */
}ADC_ChannelEnableTypeDef;
/** /**
* @brief Расширенная конфигурация секвенсора ADC * @brief Расширенная конфигурация секвенсора ADC
*/ */
@@ -42,6 +65,7 @@ typedef struct
uint8_t ITCount; /*!< Количество запросов для генерации прерывания */ uint8_t ITCount; /*!< Количество запросов для генерации прерывания */
FunctionalState BufferCircular; /*!< Циклический буфер */ FunctionalState BufferCircular; /*!< Циклический буфер */
void (*SEQCpltCallback)(void); /*!< Вызывается при завершении секвенсора */ void (*SEQCpltCallback)(void); /*!< Вызывается при завершении секвенсора */
void (*BuffHalfCallback)(void); /*!< Вызывается при заполнении половины буфера */ void (*BuffHalfCallback)(void); /*!< Вызывается при заполнении половины буфера */
void (*BuffFullCallback)(void); /*!< Вызывается при заполнении буфера */ void (*BuffFullCallback)(void); /*!< Вызывается при заполнении буфера */
@@ -91,6 +115,7 @@ typedef struct
ADC_DC_ExtInit_TypeDef DC[ADC_DC_Total]; /*!< Хендл компараторов */ ADC_DC_ExtInit_TypeDef DC[ADC_DC_Total]; /*!< Хендл компараторов */
/* ===== Channels ===== */ /* ===== Channels ===== */
ADC_ChannelEnableTypeDef *ChannelEnable; /*!< Какие каналы АЦП инициализировать (GPIO Pin) */
uint16_t ChannelData[ADC_CH_Total]; /*!< Текущие значения каналов */ uint16_t ChannelData[ADC_CH_Total]; /*!< Текущие значения каналов */
}ADC_HandleTypeDef; }ADC_HandleTypeDef;
//-- External handles ---------------------------------------------------------- //-- External handles ----------------------------------------------------------
@@ -99,6 +124,14 @@ extern ADC_HandleTypeDef hadc;
//-- Exported functions prototypes --------------------------------------------- //-- Exported functions prototypes ---------------------------------------------
/* Первичная инициализация ADC */ /* Первичная инициализация ADC */
void adc_init_first(void); void adc_init_first(void);
void adc_gpio_init(ADC_ChannelEnableTypeDef *ChEn);
/* ADC API functions */
/* Записать калибровочные значения канала */
OperationStatus ADC_Channel_Calibr(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel, int OFFSET, int GAIN);
/* Получение текущего значения канала */
uint16_t ADC_Channel_GetValue(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel);
/* Sequencer Init functions*/ /* Sequencer Init functions*/
@@ -117,8 +150,6 @@ OperationStatus ADC_SEQ_Start(ADC_HandleTypeDef *hadc, ADC_SEQ_Num_TypeDef SEQ_N
/* Остановка секвенсора АЦП */ /* Остановка секвенсора АЦП */
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);
/* Получение текущего значения канала */
uint16_t ADC_Get_ChannelValue(ADC_HandleTypeDef *hadc, ADC_CH_Num_TypeDef channel);
/* Программный запуск преобразования секвенсора */ /* Программный запуск преобразования секвенсора */
void ADC_SEQ_SoftwareStart(void); void ADC_SEQ_SoftwareStart(void);

View File

@@ -29,7 +29,7 @@
1. Настройка периферии (periph_config.h): 1. Настройка периферии (periph_config.h):
(+) Определить массивы GPIO_Init_TypeDef для портов: (+) Определить массивы GPIO_Init_TypeDef для портов:
gpioa_config[32], gpiob_config[32] gpioa_config[32], gpiob_config[32]
(+) Настроить режим пинов: Input, Output, AltFunc и другие функции (+) Настроить режим пинов: Input, Output, AltFunc или не используется (аналог режим)
2. Инициализация GPIO: 2. Инициализация GPIO:
(+) gpio_init() — инициализация портов GPIOA и GPIOB (+) gpio_init() — инициализация портов GPIOA и GPIOB
@@ -47,8 +47,36 @@
(+) GPIO_Switch_Init(&sw, GPIOB, GPIO_PIN_0, SET) — инициализация кнопки (+) GPIO_Switch_Init(&sw, GPIOB, GPIO_PIN_0, SET) — инициализация кнопки
(+) GPIO_Read_Switch(&sw) — чтение состояния кнопки с фильтрацией (+) GPIO_Read_Switch(&sw) — чтение состояния кнопки с фильтрацией
5. Утилитарные функции: 5. Получение конфигурации пинов:
(+) gpio_get_init(GPIOA, GPIO_PIN_5) — получение конфигурации пина (+) gpio_get_init(порт, пин) - для периферии
==============================================================================
##### Особенности работы #####
==============================================================================
- Динамические режимы светодиодов:
- Моргание: простой on/off с заданным периодом
- Плавное затухание: квадратичное изменение яркости через ШИМ
- Требуют вызова GPIO_LED_Dynamic_Handle() в основном цикле
- Защита от дребезга:
- Фильтрация по времени (Sw_FilterDelay в миллисекундах)
- Неблокирующий алгоритм с отслеживанием состояния
- При изменении уровня запускается таймер, состояние обновляется после задержки
- ШИМ для плавного затухания:
- Программная генерация с 15 уровнями яркости (LED_PWM_TICKS)
- Полный цикл затухания-разтухания: 2 × LED_PWM_TICKS шагов
- Конфигурация пинов:
- Периферия может перезаписывать конфигурацию пинов (например, UART на AltFunc)
- gpio_get_init() позволяет периферии получить исходную конфигурацию
- После использования периферии можно восстановить исходные настройки
- Табличный подход:
- Каждый пин имеет свою строку в массиве конфигурации
- Позволяет централизованно управлять всеми пинами
- Упрощает отладку и модификацию конфигурации
@endverbatim @endverbatim
****************************************************************************** ******************************************************************************

View File

@@ -23,7 +23,6 @@
#define GPIO_PinMode_Input DISABLE, DISABLE, ENABLE #define GPIO_PinMode_Input DISABLE, DISABLE, ENABLE
#define GPIO_PinMode_Output ENABLE, DISABLE, ENABLE #define GPIO_PinMode_Output ENABLE, DISABLE, ENABLE
#define GPIO_PinMode_AltFunc DISABLE, ENABLE, ENABLE #define GPIO_PinMode_AltFunc DISABLE, ENABLE, ENABLE
//#define GPIO_PinMode_Analog DISABLE, DISABLE, DISABLE
#ifndef LED_PWM_TICKS #ifndef LED_PWM_TICKS
#define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ #define LED_PWM_TICKS 15 ///< Количество тиков в периоде ШИМ

View File

@@ -14,6 +14,9 @@
****************************************************************************** ******************************************************************************
* @attention * @attention
* *
* Этот драйвер должен быть инициализирован ПЕРВЫМ в программе, до любой другой периферии.
* Неправильная настройка тактирования может привести к неработоспособности всего МК.
*
* Использование этого драйвера предполагает наличие корректных настроек: * Использование этого драйвера предполагает наличие корректных настроек:
* - Определены константы SYSCLK_CORE_CLOCK_MHZ и SYSCLK_Oscil_Type в periph_config.h * - Определены константы SYSCLK_CORE_CLOCK_MHZ и SYSCLK_Oscil_Type в periph_config.h
* - Определен тип системного тика SYSCLK_TickType в periph_config.h * - Определен тип системного тика SYSCLK_TickType в periph_config.h
@@ -24,37 +27,44 @@
##### Как использовать этот драйвер ##### ##### Как использовать этот драйвер #####
============================================================================== ==============================================================================
1. Настройка периферии (periph_config.h): 1. Настройка в periph_config.h:
(+) Определить SYSCLK_CORE_CLOCK_MHZ - частота ядра в МГц (например, 100) (+) SYSCLK_CORE_CLOCK_MHZ - частота ядра в МГц (например, 100)
(+) Определить SYSCLK_Oscil_Type - тип осциллятора (RCU_Oscil_OSE или RCU_Oscil_OSI) (+) SYSCLK_Oscil_Type - источник тактирования (RCU_Oscil_OSE или RCU_Oscil_OSI)
(+) Определить SYSCLK_TickType - тип системного тика (SYSCLK_Tick_1us, SYSCLK_Tick_1ms и т.д.) (+) SYSCLK_TickType - период системного тика (от SYSCLK_Tick_1us до SYSCLK_Tick_100ms)
2. Инициализация тактирования: 2. Инициализация (в начале main()):
(+) sysclk_init() — обязательный вызов в начале программы (+) sysclk_init() - настраивает PLL, SysTick и счетчики времени
- Автоматически настраивает PLL для заданной частоты (+) В SysTick_Handler() вызвать sysclk_irq_handler()
- Настраивает SysTick для генерации системных тиков
- Обновляет SystemCoreClock
3. Работа со временем: 3. Работа со временем:
(+) millis() — получение текущего времени в миллисекундах (+) millis() - текущее время в миллисекундах (переполнение через 49 дней)
(+) micros() — получение текущего времени в микросекундах (+) micros() - текущее время в микросекундах (точность зависит от SYSCLK_TickType)
(+) sysclk_irq_handler() — обработчик прерываний SysTick (должен вызываться из SysTick_Handler)
4. Система коллбеков: 4. Периодические задачи:
(+) SYSCLK_Set_Callback() — добавление периодического коллбека (+) SYSCLK_Set_Callback(func, period_ms) - регистрация функции для периодического вызова
- Коллбеки автоматически вызываются в sysclk_irq_handler() с заданным периодом (+) Максимум 16 функций, период должен быть >= периода системного тика
- Максимальное количество коллбеков: SYSCLK_NUMB_OF_CUSTOM_CALLBACKS
5. Настройка тактирования Периферии: 5. Настройка тактирования периферии:
(+) АЦП: rcu_set_clock_adc(ClkSrc, ClkMHz, state) (+) rcu_set_clock_adc(source, freq_mhz, enable) - для АЦП
- ClkSrc: источник тактирования (RCU_PeriphClk_OSEClk, RCU_PeriphClk_PLLClk и т.д.) (+) Частота АЦП не должна превышать 12.5 МГц согласно datasheet
- ClkMHz: желаемая частота ADC в МГц
- state: включение/выключение тактирования
6. Особенности работы: ==============================================================================
(+) Системные тики работают на основе SysTick ##### Особенности работы #####
(+) Поддерживаются различные периоды тиков от 1 мкс до 100 мс ==============================================================================
(+) Переполнение счетчиков происходит через ~49 дней
- Выбор SYSCLK_TickType влияет на:
- Точность micros() (при 1ms тике micros() дает значения с шагом 1000)
- Нагрузку на ЦП (1us = 1М прерываний в секунду, 100ms = 10 прерываний в секунду)
- Минимальный период коллбеков (не может быть меньше SYSCLK_TickType)
- При настройке PLL:
- Драйвер автоматически подбирает делители для заданной частоты
- Если частота недостижима - вызовется Error_Handler()
- Всегда проверяйте supported frequencies в datasheet
- Коллбеки выполняются в контексте прерывания SysTick:
- Не должны выполняться долго
- Не должны вызывать блокирующие функции
@endverbatim @endverbatim
****************************************************************************** ******************************************************************************

View File

@@ -23,43 +23,49 @@
##### Как использовать этот драйвер ##### ##### Как использовать этот драйвер #####
============================================================================== ==============================================================================
1. Настройка периферии (periph_config.h): 1. Настройка в periph_config.h:
(+) Определить структуры TMR_ExtInit_TypeDef для нужных таймеров: (+) Определите структуры tmr0_config, tmr1_config и т.д.
tmr0_config, tmr1_config, tmr2_config, tmr3_config (+) Используйте макросы для задания периода:
(+) Настроить частоту/период в мкс или тиках, прескалер • PERIOD_US(us) - период в микросекундах
(+) Разрешить прерывания (IT) и при необходимости ADC SOC / DMA запросы • FREQ_HZ(hz) - частота в герцах
(+) Указать внешнее тактирование при необходимости • LOAD(ticks, presc) - период в тиках с псевдопрескалером
(+) Установить callback-функцию (можно NULL)
2. Инициализация таймеров: 2. Инициализация:
(+) tmr_init_first() — первичная настройка тактирования, сброс периферии и NVIC (+) tmr_init_first() - включает тактирование и сброс таймеров
(+) tmr_init(&htmr, &config) — инициализация конкретного таймера с конфигурацией (+) Для каждого таймера автоматически создается хендл (htmr0, htmr1...)
3. Callback-функции (опционально): 3. Работа с таймером:
(+) TMR_Set_Callback(&htmr, TMR_Callback_Update, Callback) (+) TMR_Start(&htmr, IT) / TMR_Stop(&htmr, IT) - запуск и остановка
(+) TMR_Set_Callback(&htmr, TMR_Callback_Update, func) - установка обработчика
(+) TMR_Get_Cnt(&htmr) - текущее значение (уже поделенное на прескалер)
(+) TMR_Get_Period(&htmr) - период (уже поделенный на прескалер)
4. Запуск и остановка таймера: 4. Задержки:
(+) TMR_Start(&htmr) — запуск таймера (+) TMR_Delay(&htmr, ticks) - блокирующая задержка в тиках таймера с псевдопрескалером
(+) TMR_Stop(&htmr) — остановка таймера (+) TMR_Delay_Start(&htmr, &var) + TMR_Delay_Done(&htmr, ticks, &var) - неблокирующая
задержка в тиках таймера с псевдопрескалером
5. Задержки: 5. Обработка прерываний:
- Blocking (блокирующая): (+) Callback-функция будет вызвана автоматически
(+) TMR_Delay(&htmr, ticks) — задержка в тиках таймера
- Non-blocking (неблокирующая):
(+) TMR_Delay_Start(&htmr, &var) — запоминает текущее значение таймера
(+) TMR_Delay_Done(&htmr, ticks, &var) — проверяет завершение задержки
6. Получение текущих значений: ==============================================================================
(+) TMR_Get_Cnt(&htmr) — получение текущего счетчика с учетом псевдопрескалера ##### Особенности работы #####
(+) TMR_Get_Period(&htmr) — получение периода таймера с учетом псевдопрескалера ==============================================================================
7. Обработка прерываний: - Псевдопрескалер:
(+) tmr_irq_handler(&htmr) — общий обработчик ISR - Это программная абстракция, реальный счетчик всегда считает полные тики
- В обработчиках автоматически вызываются соответствующие callback-функции - TMR_Get_Cnt() возвращает значение уже поделенное на (Prescaler+1)
и сбрасываются флаги - Позволяет увеличить максимальный период в (Prescaler+1) раз
- Пример: LOAD(1000, 99) даст реальный период в 100 раз больше
8. Псевдо-PLIB функции: - Особенности счетчиков:
(+) TMR_Init(TMRx, InitStruct) — инициализация таймера с расширенными параметрами - Максимальный период: 42.9 сек при 100 МГц
- Таймеры используют убывающий счет (от LOAD до 0). Функция TMR_Get_Cnt
возвращает инвертированный счетчик (LOAD-VALUE)
- Задержки:
- TMR_Delay проверяет, что задержка < LOAD, иначе вернет ERROR
- Неблокирующие задержки используют "сырые" тики (без учета прескалера)
@endverbatim @endverbatim
****************************************************************************** ******************************************************************************
@@ -226,6 +232,7 @@ OperationStatus TMR_Stop(TMR_HandleTypeDef *htmr, FunctionalState IT)
* @retval Текущие значение счетчика с псевдопрескалером * @retval Текущие значение счетчика с псевдопрескалером
* @details Если частота таймера 100 МГц, и псведопрескалер 100-1, * @details Если частота таймера 100 МГц, и псведопрескалер 100-1,
* то при реальном счетчике 100,000, вернется значение 1,000 * то при реальном счетчике 100,000, вернется значение 1,000
* Также переводит счетчик в возрастающий (LOAD-VALUE)
*/ */
uint32_t TMR_Get_Cnt(TMR_HandleTypeDef *htmr) uint32_t TMR_Get_Cnt(TMR_HandleTypeDef *htmr)
{ {
@@ -235,7 +242,7 @@ uint32_t TMR_Get_Cnt(TMR_HandleTypeDef *htmr)
} }
uint32_t presc = htmr->Config->Prescaler+1; uint32_t presc = htmr->Config->Prescaler+1;
uint32_t currtick = htmr->Instance->VALUE; uint32_t currtick = (htmr->Instance->LOAD - htmr->Instance->VALUE);
return currtick/presc; return currtick/presc;
} }

View File

@@ -20,7 +20,7 @@
//-- Defines ------------------------------------------------------------------- //-- Defines -------------------------------------------------------------------
// Дефайны для режима таймера Период в мкс, Частота, ПсевдоПрескалер, Период в тиках // Дефайны для режима таймера Период в мкс, Частота, ПсевдоПрескалер, Период в тиках
/** @brief Период в мкс */ /** @brief Период в мкс */
#define PERIOD_MKS(_per_) (_per_), 0, 0, 0 #define PERIOD_US(_per_) (_per_), 0, 0, 0
/** @brief Период в Гц */ /** @brief Период в Гц */
#define FREQ_HZ(_freq_) 0, (_freq_), 0, 0 #define FREQ_HZ(_freq_) 0, (_freq_), 0, 0
/** @brief Период в прескалере и тиках */ /** @brief Период в прескалере и тиках */

View File

@@ -24,49 +24,76 @@
##### Как использовать этот драйвер ##### ##### Как использовать этот драйвер #####
============================================================================== ==============================================================================
1. Настройка периферии (periph_config.h): 1. Настройка в periph_config.h:
(+) Определить структуры UART_ExtInit_TypeDef для нужных UART: (+) Определите uart0_config, uart1_config для нужных UART
uart0_config, uart1_config (+) Используйте макросы для направления:
(+) Настроить скорость, стоп-биты, четность, длину данных • UART_Direction_None - прием и передача отключены
(+) Настроить FIFO и направление (Tx, Rx или оба) • UART_Direction_RxTx - полный дуплекс
(+) Определить callback-функции (можно NULL) • UART_Direction_Tx - только передача
(+) Определить пины TX/RX для UART0/UART1 • UART_Direction_Rx - только прием
(+) Включить/отключить очередь сообщений для отправки: USE_TX_QUEUE в uart.h
2. Инициализация UART: 2. Инициализация:
(+) uart_init_first() — первичная настройка GPIO, тактирования и NVIC (+) uart_init_first() - настройка GPIO, тактирования и прерываний
(+) uart_init(&huart, &config) инициализация конкретного UART с конфигурацией (+) uart_init(&huart, &config) - инициализация конкретного UART
3. Callback-функции: 3. Callback-функции:
(+) UART_Set_Callback(&huart, UART_Callback_Rx, Callback) — вызов при приёме данных (+) UART_Set_Callback(&huart, UART_Callback_Rx, func) - при завершении приема
(+) UART_Set_Callback(&huart, UART_Callback_Tx, Callback) — вызов при завершении передачи (+) UART_Set_Callback(&huart, UART_Callback_Tx, func) - при завершении передачи
(+) UART_Set_Callback(&huart, UART_Callback_Idle, Callback) — вызов при событии Idle (+) UART_Set_Callback(&huart, UART_Callback_Idle, func) - при обнаружении IDLE
(+) UART_Set_Callback(&huart, UART_Callback_Error, Callback) — вызов при ошибках (+) UART_Set_Callback(&huart, UART_Callback_Error, func) - при ошибках
4. Запуск UART и FIFO: 4. Запуск UART:
(+) UART_Start(&huart, TxFifoLevel, RxFifoLevel) включает UART и настраивает FIFO (+) UART_Start(&huart, TxFifoLevel, RxFifoLevel) - включение UART и настройка FIFO
5. Передача и приём данных: 5. Передача и приём данных:
- Режим Polling (blocking): - Режим Polling:
(+) UART_Transmit(&huart, buf, size, timeout) — передача данных с ожиданием (+) UART_Transmit(&huart, buf, size, timeout) - блокирующая передача
(+) UART_Receive(&huart, buf, size, timeout) — приём данных с ожиданием (+) UART_Receive(&huart, buf, size, timeout) - блокирующий прием
- Режим Interrupt (non-blocking): - Режим Interrupt:
(+) UART_Transmit_IT(&huart, buf, size) — передача данных через прерывания (+) UART_Transmit_IT(&huart, buf, size) - неблокирующая передача
(+) UART_Receive_IT(&huart, buf, size) — приём данных через прерывания (+) UART_Receive_IT(&huart, buf, size) - неблокирующий прием
6. Обработка прерываний UART: 6. Обработка прерываний:
(+) uart_irq_handler(&huart) — общий обработчик ISR для RX/TX FIFO, ошибок и Idle (+) Прерывания обрабатывают TX FIFO, RX FIFO, ошибки и состояние IDLE
- В обработчиках автоматически вызываются соответствующие callback-функции
и сбрасываются флаги
- Поддерживается очередь передачи для предотвращения потери данных
7. GPIO для UART: 7. GPIO для UART:
(+) uart0_gpio_init()/uart0_gpio_deinit() — инициализация и деинициализация UART0 (+) Пины настраиваются автоматически при вызове uart_init_first()
(+) uart1_gpio_init()/uart1_gpio_deinit() — инициализация и деинициализация UART1 (+) При необходимости можно вызвать uart0_gpio_deinit() для восстановления
8. Режимы работы: ==============================================================================
(+) Polling (blocking) — функции блокируются до завершения передачи/приёма ##### Особенности работы #####
(+) Interrupt (non-blocking) — передача/приём через прерывания, управление через callback ==============================================================================
- Очередь передачи (USE_TX_QUEUE):
- Циклический буфер на 32 сообщения (TX_QUEUE_SIZE)
- Предотвращает потерю данных при частой отправке
- Включается автоматически при USE_TX_QUEUE=1 в uart.h
- Сообщения обрабатываются последовательно по завершении предыдущей передачи
- FIFO и прерывания:
- Аппаратный FIFO 16 байт для приема и передачи
- Уровни прерываний настраиваются через TxFifoLevel и RxFifoLevel
- Прерывание TX FIFO генерируется когда FIFO не полон
- Прерывание RX FIFO генерируется когда FIFO не пуст
- Состояние IDLE:
- Обнаруживается по таймауту приема (32 бит-времени)
- Генерирует прерывание RecieveTimeout
- Полезно для определения конца пакета переменной длины
- Обработка ошибок:
- Обрабатываются все типы ошибок UART: фрейм, паритет, переполнение, break
- При ошибке вызывается ErrCallback и сбрасываются флаги ошибок
- Ошибки не останавливают работу UART
- GPIO автоматическая настройка:
- Пины TX/RX настраиваются в AltFunc режим при инициализации
- Поддерживаются стандартные пины (PB10/PB11 для UART0, PB8/PB9 для UART1)
- Режимы работы:
- Polling: простой, но блокирующий, подходит для инициализации и отладки
- Interrupt: неблокирующий, требует прерываний и поддерживает callback-функций
- Queue: расширенный interrupt режим с буферизацией сообщений
@endverbatim @endverbatim
****************************************************************************** ******************************************************************************

View File

@@ -32,7 +32,7 @@
// Дефайны для пинов UART // Дефайны для пинов UART
#define UART0_Tx_Pin GPIO_Pin_10 /**< PB10 — UART0 Tx */ #define UART0_Tx_Pin GPIO_Pin_10 /**< PB10 — UART0 Tx */
#define UART0_Rx_Pin GPIO_Pin_1 /**< PB11 — UART0 Rx */ #define UART0_Rx_Pin GPIO_Pin_11 /**< PB11 — UART0 Rx */
#define UART0_GPIO_Port GPIOB /**< GPIO порт UART0 */ #define UART0_GPIO_Port GPIOB /**< GPIO порт UART0 */
#define UART1_Tx_Pin GPIO_Pin_8 /**< PB8 — UART1 Tx */ #define UART1_Tx_Pin GPIO_Pin_8 /**< PB8 — UART1 Tx */

View File

@@ -43,17 +43,17 @@ void Error_Handler(void);
/* UART */ /* UART */
#define USE_UART0 0 /*!< Использовать UART0 */ #define USE_UART0 0 /*!< Использовать UART0 */
#define USE_UART1 0 /*!< Использовать UART1 */ #define USE_UART1 1 /*!< Использовать UART1 */
/* Timers */ /* Timers */
#define USE_TMR0 0 /*!< Использовать Таймер 0 */ #define USE_TMR0 1 /*!< Использовать Таймер 0 */
#define USE_TMR1 0 /*!< Использовать Таймер 1 */ #define USE_TMR1 1 /*!< Использовать Таймер 1 */
#define USE_TMR2 0 /*!< Использовать Таймер 2 */ #define USE_TMR2 1 /*!< Использовать Таймер 2 */
#define USE_TMR3 0 /*!< Использовать Таймер 3 */ #define USE_TMR3 0 /*!< Использовать Таймер 3 */
/* ADC */ /* ADC */
#define USE_ADC_SEQ0 0 /*!< Использовать Секвенсор 0 */ #define USE_ADC_SEQ0 0 /*!< Использовать Секвенсор 0 */
#define USE_ADC_SEQ1 0 /*!< Использовать Секвенсор 1 */ #define USE_ADC_SEQ1 1 /*!< Использовать Секвенсор 1 */
#define USE_ADC_DC0 0 /*!< Использовать Компаратор 0 */ #define USE_ADC_DC0 0 /*!< Использовать Компаратор 0 */
#define USE_ADC_DC1 0 /*!< Использовать Компаратор 1 */ #define USE_ADC_DC1 0 /*!< Использовать Компаратор 1 */
#define USE_ADC_DC2 0 /*!< Использовать Компаратор 2 */ #define USE_ADC_DC2 0 /*!< Использовать Компаратор 2 */
@@ -75,7 +75,7 @@ void Error_Handler(void);
*/ */
static RCU_PLL_Ref_TypeDef SYSCLK_Oscil_Type = RCU_PLL_Ref_OSEClk; static RCU_PLL_Ref_TypeDef SYSCLK_Oscil_Type = RCU_PLL_Ref_OSEClk;
/** @brief Желаемая частота тактирования МК */ /** @brief Желаемая частота тактирования МК в МГц*/
#define SYSCLK_CORE_CLOCK_MHZ 100 #define SYSCLK_CORE_CLOCK_MHZ 100
/** @brief Частота тиков uwTick тактирования МК */ /** @brief Частота тиков uwTick тактирования МК */
@@ -89,7 +89,7 @@ static SYSCLK_TickHz_TypeDef SYSCLK_TickType = SYSCLK_Tick_1ms;
/** @brief Конфигурации пинов порта GPIOA */ /** @brief Конфигурации пинов порта GPIOA */
static GPIO_Init_TypeDef gpioa_config[] = { static GPIO_Init_TypeDef gpioa_config[] = {
// Пин, Режим, Выходной режим, Входной режим, Подтяжка, Нагрузка/Скорость // Pin, Mode, OutMode, InMode, PullMode, DriveMode
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
@@ -110,7 +110,7 @@ static GPIO_Init_TypeDef gpioa_config[] = {
/** @brief Конфигурации пинов порта GPIOB */ /** @brief Конфигурации пинов порта GPIOB */
static GPIO_Init_TypeDef gpiob_config[] = { static GPIO_Init_TypeDef gpiob_config[] = {
// Пин, Режим, Выходной режим, Входной режим, Подтяжка, Нагрузка/Скорость // Pin, Mode, OutMode, InMode, PullMode, DriveMode
{ GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_0, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_1, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
{ GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast }, { GPIO_Pin_2, GPIO_PinMode_Unused, GPIO_OutMode_PP, GPIO_InMode_Schmitt, GPIO_PullMode_Disable, GPIO_DriveMode_HighFast },
@@ -134,18 +134,18 @@ static GPIO_Init_TypeDef gpiob_config[] = {
//-- UART Конфигурации -------------------------------------------------------- //-- UART Конфигурации --------------------------------------------------------
#if USE_UART0==1 #if USE_UART0==1
static UART_ExtInit_TypeDef uart0_config = { static UART_ExtInit_TypeDef uart0_config = {
//Стоп биты, Четность, Длина посылки, Скорость, FIFO, Направление работы //StopBit, ParityBit, DataWidth, BaudRate, FIFO, Direction
UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx,
//Rx Коллбек Tx Коллбек Idle Коллбек Error Коллбек //RxCallback TxCallback IdleCallback ErrCallback
NULL, NULL, NULL, NULL NULL, NULL, NULL, NULL
}; };
#endif #endif
#if USE_UART1==1 #if USE_UART1==1
static UART_ExtInit_TypeDef uart1_config = { static UART_ExtInit_TypeDef uart1_config = {
//Стоп биты, Четность, Длина посылки, Скорость, FIFO, Направление работы //StopBit, ParityBit, DataWidth, BaudRate, FIFO, Direction
UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx, UART_StopBit_1, UART_ParityBit_Disable, UART_DataWidth_8, 115200, DISABLE, UART_Direction_RxTx,
//Rx Коллбек Tx Коллбек Idle Коллбек Error Коллбек //RxCallback TxCallback IdleCallback ErrCallback
NULL, NULL, NULL, NULL NULL, NULL, NULL, NULL
}; };
#endif #endif
@@ -153,134 +153,155 @@ static UART_ExtInit_TypeDef uart1_config = {
//-- TMR Конфигурации --------------------------------------------------------- //-- TMR Конфигурации ---------------------------------------------------------
/** @note Макросы для задания периода:
* - LOAD(Period, Prescaler) - период в тиках и прескалер*
* - FREQ_HZ(Hz) - период таймера в Герцах
* - PERIOD_US(us) - период в микросекундах
* * Т.к. аппаратного прескалера нет, используется программный.
* Получить тики будто бы они с прескалером можно функциями TMR_Get_Cnt, TMR_Get_Period
*/
#if USE_TMR0==1 #if USE_TMR0==1
static TMR_ExtInit_TypeDef tmr0_config = { static TMR_ExtInit_TypeDef tmr0_config = {
//Частота Clk МГц, Период обновления //SystemCoreClock, Period Update
SYSCLK_CORE_CLOCK_MHZ, LOAD(0xFFFFFFFF, SYSCLK_CORE_CLOCK_MHZ-1), SYSCLK_CORE_CLOCK_MHZ, LOAD(0xFFFFFFFF, SYSCLK_CORE_CLOCK_MHZ-1),
//Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование //IT ADCSOC DMAReq ExtInput
DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable
}; };
#endif #endif
#if USE_TMR1==1 #if USE_TMR1==1
static TMR_ExtInit_TypeDef tmr1_config = { static TMR_ExtInit_TypeDef tmr1_config = {
//Частота Clk МГц, Период обновления //SystemCoreClock, Period Update
SYSCLK_CORE_CLOCK_MHZ, FREQ_HZ(10), SYSCLK_CORE_CLOCK_MHZ, FREQ_HZ(10),
//Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование //IT ADCSOC DMAReq ExtInput
DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable
}; };
#endif #endif
#if USE_TMR2==1 #if USE_TMR2==1
static TMR_ExtInit_TypeDef tmr2_config = { static TMR_ExtInit_TypeDef tmr2_config = {
//Частота Clk МГц, Период обновления //SystemCoreClock, Period Update
SYSCLK_CORE_CLOCK_MHZ, PERIOD_MKS(1000000), SYSCLK_CORE_CLOCK_MHZ, PERIOD_US(1000000),
//Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование //IT ADCSOC DMAReq ExtInput
ENABLE, DISABLE, DISABLE, TMR_ExtInput_Disable DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable
}; };
#endif #endif
#if USE_TMR3==1 #if USE_TMR3==1
static TMR_Init_TypeDef tmr3_config = { static TMR_Init_TypeDef tmr3_config = {
//Частота Clk МГц, Период обновления //SystemCoreClock, Period Update
SYSCLK_CORE_CLOCK_MHZ, PERIOD_MKS(1000), SYSCLK_CORE_CLOCK_MHZ, PERIOD_US(1000),
//Прерывания Запуск конверсии АЦП Реквест DMA Внешнее тактирование //IT ADCSOC DMAReq ExtInput
DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable DISABLE, DISABLE, DISABLE, TMR_ExtInput_Disable
}; };
#endif #endif
//-- ADC SEQ Конфигурации ----------------------------------------------------- //-- ADC Конфигурации -----------------------------------------------------
/** @brief Источник тактирования АЦП */
static RCU_PeriphClk_TypeDef ADC_ClockSource = RCU_PeriphClk_PLLClk; static RCU_PeriphClk_TypeDef ADC_ClockSource = RCU_PeriphClk_PLLClk;
/** @brief Желаемая частота тактирования АЦП в МГц*/
static float ADC_ClockMHz = 12.5; static float ADC_ClockMHz = 12.5;
/** @brief Пины каких каналов инициализировать для АЦП */
static ADC_ChannelEnableTypeDef adc_ch_config = {
//Channel 0, Channel 1, Channel 2, Channel 3
ENABLE, ENABLE, ENABLE, ENABLE,
};
//-- ADC SEQ Конфигурации -----------------------------------------------------
#if USE_ADC_SEQ0==1 #if USE_ADC_SEQ0==1
static ADC_SEQ_ExtInit_TypeDef adc_seq0_config = { static ADC_SEQ_ExtInit_TypeDef adc_seq0_config = {
//Событие запуска секвенсора, Разрешение программного запуска //StartEvent, SWStartEn
ADC_SEQ_StartEvent_SwReq, ENABLE, ADC_SEQ_StartEvent_SwReq, ENABLE,
//Выбор каналов для запросов секвенсора //Req[0], Req[1], Req[2], Req[3]
ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3, ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3,
//Последний запрос, Усреднение запросов, Усреднение запросов //ReqMax, ReqAverage, ReqAverageEn
ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE, ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE,
//Кол-во рестартов секвенсора, Усреднение рестартов, Задержка между рестартами (в тиках ADC_ClockSource/2) //RestartCount, RestartAverageEn, RestartTimer (в тиках ADC_ClockMHz)
0, DISABLE, 0, 0, DISABLE, 0,
//Разрешение каналов цифровых компараторов //DCEn[0], DCEn[1], DCEn[2], DCEn[3]
DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE,
//Настройка DMA FIFO, Разрешение DMA //DMAFIFOLevel, DMAEn
ADC_SEQ_DMAFIFOLevel_1, DISABLE, ADC_SEQ_DMAFIFOLevel_1, DISABLE,
//Прерывания, Кол-во рестартов для прерывания Циклический буфер //IT, ITCount BufferCircular
ENABLE, 0, ENABLE, ENABLE, 0, ENABLE,
//SEQ Complete Коллбек, BuffHalf Коллбек, BuffFull Коллбек, Error коллбек //SEQCpltCallback, BuffHalfCallback, BuffFullCallback, ErrorCallback
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
}; };
#endif #endif
#if USE_ADC_SEQ1==1 #if USE_ADC_SEQ1==1
static ADC_SEQ_ExtInit_TypeDef adc_seq1_config = { static ADC_SEQ_ExtInit_TypeDef adc_seq1_config = {
//Событие запуска секвенсора, Разрешение программного запуска //StartEvent, SWStartEn
ADC_SEQ_StartEvent_SwReq, ENABLE, ADC_SEQ_StartEvent_SwReq, ENABLE,
//Выбор каналов для запросов секвенсора //Req[0], Req[1], Req[2], Req[3]
ADC_CH_Num_2, ADC_CH_Num_3, ADC_CH_Num_2, ADC_CH_Num_3, ADC_CH_Num_0, ADC_CH_Num_1, ADC_CH_Num_2, ADC_CH_Num_3,
//Последний запрос, Усреднение запросов, Усреднение запросов //ReqMax, ReqAverage, ReqAverageEn
ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE, ADC_SEQ_ReqNum_1, ADC_SEQ_Average_2, DISABLE,
//Кол-во рестартов секвенсора, Усреднение рестартов, Задержка между рестартами (в тиках ADC_ClockSource/2) //RestartCount, RestartAverageEn, RestartTimer (в тиках ADC_ClockMHz)
0, DISABLE, 0, 0, DISABLE, 0,
//Разрешение каналов цифровых компараторов //DCEn[0], DCEn[1], DCEn[2], DCEn[3]
DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE, DISABLE,
//Настройка DMA FIFO, Разрешение DMA //DMAFIFOLevel, DMAEn
ADC_SEQ_DMAFIFOLevel_1, DISABLE, ADC_SEQ_DMAFIFOLevel_1, DISABLE,
//Прерывания, Кол-во рестартов для прерывания Циклический буфер //IT, ITCount BufferCircular
ENABLE, 0, ENABLE, ENABLE, 0, ENABLE,
//SEQ Complete Коллбек, BuffHalf Коллбек, BuffFull Коллбек, Error коллбек //SEQCpltCallback, BuffHalfCallback, BuffFullCallback, ErrorCallback
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
}; };
#endif #endif
//-- ADC DC Конфигурации ------------------------------------------------------ //-- ADC DC Конфигурации ------------------------------------------------------
#if USE_ADC_DC0==1 #if USE_ADC_DC0==1
static ADC_DC_ExtInit_TypeDef adc_dc0_config = { static ADC_DC_ExtInit_TypeDef adc_dc0_config = {
//Включение выхода компаратора //DCOutput
DISABLE, DISABLE,
//Нижний порог, Верхний порог //ThresholdLow, ThresholdHigh
0, 0, 0, 0,
//Запуск измерения, Канал, Режим срабатывания, Условие срабатывания //Source, Channel, Mode, Condition
ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low,
//DC Triggered Коллбек, Error коллбек //IT
DISABLE,
//DC_TrigCallback, ErrorCallback
NULL, NULL NULL, NULL
}; };
#endif #endif
#if USE_ADC_DC1==1 #if USE_ADC_DC1==1
static ADC_DC_ExtInit_TypeDef adc_dc1_config = { static ADC_DC_ExtInit_TypeDef adc_dc1_config = {
//Включение выхода компаратора //DCOutput
DISABLE, DISABLE,
//Нижний порог, Верхний порог //ThresholdLow, ThresholdHigh
0, 0, 0, 0,
//Запуск измерения, Канал, Режим срабатывания, Условие срабатывания //Source, Channel, Mode, Condition
ADC_DC_Source_EOC, ADC_CH_Num_2, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low,
//DC Triggered Коллбек, Error коллбек //IT
DISABLE,
//DC_TrigCallback, ErrorCallback
NULL, NULL NULL, NULL
}; };
#endif #endif
#if USE_ADC_DC2==1 #if USE_ADC_DC2==1
static ADC_DC_ExtInit_TypeDef adc_dc2_config = { static ADC_DC_ExtInit_TypeDef adc_dc2_config = {
//Включение выхода компаратора //DCOutput
DISABLE, DISABLE,
//Нижний порог, Верхний порог //ThresholdLow, ThresholdHigh
0, 0, 0, 0,
//Запуск измерения, Канал, Режим срабатывания, Условие срабатывания //Source, Channel, Mode, Condition
ADC_DC_Source_EOC, ADC_CH_Num_3, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low,
//DC Triggered Коллбек, Error коллбек //IT
DISABLE,
//DC_TrigCallback, ErrorCallback
NULL, NULL NULL, NULL
}; };
#endif #endif
#if USE_ADC_DC3==1 #if USE_ADC_DC3==1
static ADC_DC_ExtInit_TypeDef adc_dc3_config = { static ADC_DC_ExtInit_TypeDef adc_dc3_config = {
//Включение выхода компаратора //DCOutput
DISABLE, DISABLE,
//Нижний порог, Верхний порог //ThresholdLow, ThresholdHigh
0, 0, 0, 0,
//Запуск измерения, Канал, Режим срабатывания, Условие срабатывания //Source, Channel, Mode, Condition
ADC_DC_Source_EOC, ADC_CH_Num_4, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low, ADC_DC_Source_EOC, ADC_CH_Num_1, ADC_DC_Mode_Multiple, ADC_DC_Condition_Low,
//DC Triggered Коллбек, Error коллбек //IT
DISABLE,
//DC_TrigCallback, ErrorCallback
NULL, NULL NULL, NULL
}; };
#endif #endif

View File

@@ -135,7 +135,7 @@
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
<Key>JL2CM3</Key> <Key>JL2CM3</Key>
<Name>-U -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0K1921VK035.FLM -FS00 -FL010000 -FP0($$Device:K1921VK035$Flash\K1921VK035.FLM)</Name> <Name>-U-O14 -O14 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight JTAG-DP") -D00(4BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO7 -FD20000000 -FC1000 -FN1 -FF0K1921VK035.FLM -FS00 -FL010000 -FP0($$Device:K1921VK035$Flash\K1921VK035.FLM)</Name>
</SetRegEntry> </SetRegEntry>
<SetRegEntry> <SetRegEntry>
<Number>0</Number> <Number>0</Number>
@@ -158,6 +158,41 @@
<Ww> <Ww>
<count>1</count> <count>1</count>
<WinNumber>1</WinNumber> <WinNumber>1</WinNumber>
<ItemText>huart1</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>hadc</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>1</WinNumber>
<ItemText>tickbuff</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>adc_seq1_config</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>ch3_config</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>starttick - htmr-&gt;Instance-&gt;VALUE,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>gpiob_config</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>seq0_buff</ItemText> <ItemText>seq0_buff</ItemText>
</Ww> </Ww>
</WatchWindow1> </WatchWindow1>
@@ -203,6 +238,16 @@
<pszMrulep></pszMrulep> <pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp> <pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp> <pMultCmdsp></pMultCmdsp>
<SystemViewers>
<Entry>
<Name>System Viewer\ADC</Name>
<WinId>35905</WinId>
</Entry>
<Entry>
<Name>System Viewer\GPIOB</Name>
<WinId>35904</WinId>
</Entry>
</SystemViewers>
</TargetOption> </TargetOption>
</Target> </Target>

View File

@@ -314,7 +314,7 @@
</ArmAdsMisc> </ArmAdsMisc>
<Cads> <Cads>
<interw>1</interw> <interw>1</interw>
<Optim>1</Optim> <Optim>2</Optim>
<oTime>0</oTime> <oTime>0</oTime>
<SplitLS>0</SplitLS> <SplitLS>0</SplitLS>
<OneElfS>1</OneElfS> <OneElfS>1</OneElfS>