#3 Добавлен простейший интерфейс: одна кнопка и один диод. Пока интерфейс управляется через прерывание в SysTick

При нажатии на кнопку включается тест с переходом от положительного напряжения к отрицатльному.

Индикация светодиода:
- постоянно горит - ожидание команды
- моргание (250 мс) - прямое подключение диода
- моргание (25 мс) - обратое подключение диода
This commit is contained in:
2024-12-19 15:26:22 +03:00
parent 13825e068c
commit a5704ae4be
12 changed files with 371 additions and 71 deletions

View File

@@ -63,6 +63,12 @@ void MX_GPIO_Init(void)
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pin : PC14 */
GPIO_InitStruct.Pin = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
/*Configure GPIO pins : PB0 PB1 PB10 PB11 */
GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

View File

@@ -22,7 +22,7 @@
#include "stm32f1xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "tester_adc_func.h"
#include "tester_main.h"
/* USER CODE END Includes */
/* Private typedef -----------------------------------------------------------*/
@@ -188,7 +188,7 @@ void PendSV_Handler(void)
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
TESTER_InterfaceHandle(&TESTER);
/* USER CODE END SysTick_IRQn 0 */
HAL_IncTick();
/* USER CODE BEGIN SysTick_IRQn 1 */
@@ -237,7 +237,7 @@ void TIM2_IRQHandler(void)
void TIM3_IRQHandler(void)
{
/* USER CODE BEGIN TIM3_IRQn 0 */
HAL_NVIC_ClearPendingIRQ(TIM3_IRQn);
/* USER CODE END TIM3_IRQn 0 */
HAL_TIM_IRQHandler(&htim3);
/* USER CODE BEGIN TIM3_IRQn 1 */

View File

@@ -14,6 +14,44 @@
#define TESTER_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп
/**
* @addtogroup TESTER_INTERFACE_CONFIG Configs for interface of tester
* @ingroup TESTER_CONFIGS
* @brief Конфигурации для интерфейса тестера
@{
*/
/* Дефайны для светодиодов */
/* Состояния включенного и выключенного светодиода */
#define LED_ON 0 ///< Состояние включенного светодиода
#define LED_OFF 1 ///< Состояние выключенного светодиода
#define LED1_Port GPIOC ///< Порт светодиода (при перенастройке надо также перенастроить через cube)
#define LED1_Pin GPIO_PIN_13 ///< Пин светодиода (при перенастройке надо также перенастроить через cube)
/* Периоды моргания светодиода */
#define LED_POSITIVE_DIODE_PERIOD 250 ///< Моргание для индикации подключенного положительного напряжения
#define LED_NEGATIVE_DIODE_PERIOD 25 ///< Моргание для индикации подключенного отрицательного напряжения
#define LED_BLINK_AS_ON 5 ///< Моргание незаметное для глаза (светодиод просто включен)
/* Дефайны для кнопки */
/* Состояния нажатой и отжатой кнопки */
#define SW_ON 1 ///< Состояние нажатой кнопки
#define SW_OFF 0 ///< Состояние отжатой кнопки
/* Пин кнопки при перенастройке надо также перенастроить через cube) */
#define SWITCH_START_Port GPIOC ///< Порт кнокпи старта (при перенастройке надо также перенастроить через cube)
#define SWITCH_START_Pin GPIO_PIN_14 ///< Пин кнокпи старта (при перенастройке надо также перенастроить через cube)
/* Задержка для компенсации дребезга (в миллисекундах) */
#define SWITCH_ANTI_DREBEZG_DELAY 50 ///< Время которое выжидается для окончания дребезга
/** TESTER_INTERFACE_CONFIG
* @}
*/
/**
* @addtogroup TESTER_SW_TIMINGS_CONFIG Configs for switching timings
* @ingroup TESTER_CONFIGS
@@ -70,12 +108,14 @@
#define POWER_DISCONNECT 0 ///< Питание отключено в данном состоянии пина
/* Ключи для подключения положительного питания к диоду */
/* (при перенастройке надо также перенастроить через cube) */
#define SWITCH_DC_POSITIVE_Port GPIOB ///< Порт пина первого ключа для земли положительного источника питания
#define SWITCH_DC_POSITIVE_GND_Pin GPIO_PIN_10 ///< Пин первого ключа для земли положительного источника питания
#define SWITCH_DC_POSITIVE_VDD_Pin GPIO_PIN_11 ///< Пин второго ключа для напряжения положительного источника ппитания
/* Ключи для подключения отрицательного питания к диоду */
/* (при перенастройке надо также перенастроить через cube) */
#define SWITCH_DC_NEGATIVE_Port GPIOB ///< Порт пина первого ключа для земли отрицательного источника ппитания
#define SWITCH_DC_NEGATIVE_GND_Pin GPIO_PIN_0 ///< Пин первого ключа для земли отрицательного источника ппитания
#define SWITCH_DC_NEGATIVE_VDD_Pin GPIO_PIN_1 ///< Пин первого ключа для напряжения отрицательного источника ппитания

View File

@@ -5,10 +5,11 @@ TESTER_TestHandleTypeDef hTestDiode;
/**s
* @brief Инициализация хендла тестера диодов
*/
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest)
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds)
{
/* Настройка структуры АЦП */
htest->adc = &tester_adc;
htest->leds = leds;
TESTER_ADC_StructInit(htest->adc);
/* Настройка пинов для подключения отрицательного источника */
@@ -46,6 +47,7 @@ void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest)
{
/* Задержка, перед началом работы */
TESTER_Delay(&htest->SwTimings.ticks_before_test);
TESTER_LED_TestingDiode_Positive(&htest->leds->LED1);
/* Включение континиус АЦП */
HAL_ADC_Start(htest->adc->hadc);
@@ -72,6 +74,7 @@ void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest)
/* Выключение континиус АЦП */
HAL_ADC_Stop(htest->adc->hadc);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
}
/**
@@ -81,6 +84,7 @@ void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest)
{
/* Задержка, перед началом работы */
TESTER_Delay(&htest->SwTimings.ticks_before_test);
TESTER_LED_TestingDiode_Negative(&htest->leds->LED1);
/* Включение АЦП */
ADC_DMA_StartRead(htest->adc);
@@ -100,6 +104,7 @@ void TESTER_TestDiode_NegativePower(TESTER_TestHandleTypeDef *htest)
/* Обработка DMA */
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
}
@@ -110,12 +115,14 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
{
/* Задержка, перед началом работы */
TESTER_Delay(&htest->SwTimings.ticks_before_test);
TESTER_LED_TestingDiode_Positive(&htest->leds->LED1);
/* Подкючение питания к диоду */
TESTER_Connect_Power(&htest->DCPosSw);
/* Подкючение положительного питания к диоду */
msDelay(htest->SwTimings.msticks_for_positive_dc);
TESTER_LED_TestingDiode_Negative(&htest->leds->LED1);
/* Включение АЦП */
ADC_DMA_StartRead(htest->adc);
@@ -135,6 +142,7 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest)
/* Обработка DMA */
ADC_DMA_ReadForPeak(htest->adc, ADC_READ_TIMEOUT_MS);
TESTER_LED_TestingDiode_End(&htest->leds->LED1);
}
/**

View File

@@ -12,6 +12,7 @@
#define _TESTER_FUNC_H_
#include "tester_adc_func.h"
#include "tester_interface_func.h"
/**
@@ -60,13 +61,15 @@ typedef struct
uint32_t continuous_buff_size;
float DiodeVolt;
TESTER_LEDsTypeDef *leds;
}TESTER_TestHandleTypeDef;
extern TESTER_TestHandleTypeDef hTestDiode;
/* Инициализация хендла тестера диодов */
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest);
void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest, TESTER_LEDsTypeDef *leds);
/* Тест диодов: подключение прямого напряжения */
void TESTER_TestDiode_PositivePower(TESTER_TestHandleTypeDef *htest);

View File

@@ -0,0 +1,95 @@
#include "tester_interface_func.h"
/**
* @brief Инициализация структур интерфейса
*/
void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef *leds)
{
swstart->Sw_Port = SWITCH_START_Port;
swstart->Sw_Pin = SWITCH_START_Pin;
swstart->Sw_FilterDelay = SWITCH_ANTI_DREBEZG_DELAY;
leds->LED1.LED_Port = LED1_Port;
leds->LED1.LED_Pin = LED1_Pin;
leds->LED1.period = LED_BLINK_AS_ON;
}
/**
* @brief Включить индикацию прямого подключения диода
*/
void TESTER_LED_TestingDiode_Positive(TESTER_LEDTypeDef *led)
{
led->period = LED_POSITIVE_DIODE_PERIOD;
}
/**
* @brief Включить индикацию обратного подключения диода
*/
void TESTER_LED_TestingDiode_Negative(TESTER_LEDTypeDef *led)
{
led->period = LED_NEGATIVE_DIODE_PERIOD;
}
/**
* @brief Выключить индикацию активного теста диодов
*/
void TESTER_LED_TestingDiode_End(TESTER_LEDTypeDef *led)
{
led->period = LED_BLINK_AS_ON;
}
/**
* @brief Считать состоянии кнопки запуска
*/
uint8_t TESTER_ReadSwichStart(TESTER_SwitchStartTypeDef *swstart)
{
if(HAL_GPIO_ReadPin(swstart->Sw_Port, swstart->Sw_Pin) == SW_ON)
{
if(swstart->tickprev == 0)
swstart->tickprev = HAL_GetTick();
if((HAL_GetTick() - swstart->tickprev) > swstart->Sw_FilterDelay)
{
if(HAL_GPIO_ReadPin(swstart->Sw_Port, swstart->Sw_Pin) == SW_ON)
{
return 1;
}
else
{
swstart->tickprev = 0;
return 0;
}
}
}
return 0;
}
/**
* @brief Включить светодиод
*/
void TESTER_LED_On(TESTER_LEDTypeDef *led)
{
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_ON);
}
/**
* @brief Выключить светодиод
*/
void TESTER_LED_Off(TESTER_LEDTypeDef *led)
{
HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, LED_OFF);
}
/**
* @brief Моргание светодиодом
*/
void TESTER_LED_Blink(TESTER_LEDTypeDef *led)
{
uint32_t tickcurrent = HAL_GetTick();
if((tickcurrent - led->tickprev) > led->period)
{
HAL_GPIO_TogglePin(led->LED_Port, led->LED_Pin);
led->tickprev = tickcurrent;
}
}

View File

@@ -0,0 +1,65 @@
/**
**************************************************************************
* @file tester_func.h
* @brief Заголовочный файл для функций МЗКТ.
**************************************************************************
@details
*************************************************************************/
#ifndef _TESTER_INTERFACE_FUNC_H_
#define _TESTER_INTERFACE_FUNC_H_
#include "mylibs_include.h"
typedef struct
{
GPIO_TypeDef *LED_Port;
uint32_t LED_Pin;
uint32_t tickprev;
uint32_t period;
}TESTER_LEDTypeDef;
typedef struct
{
TESTER_LEDTypeDef LED1;
}TESTER_LEDsTypeDef;
typedef struct
{
GPIO_TypeDef *Sw_Port;
uint32_t Sw_Pin;
uint32_t Sw_PrevState;
uint32_t Sw_FilterDelay;
uint32_t tickprev;
}TESTER_SwitchStartTypeDef;
/* Инициализация структур интерфейса */
void TESTER_InterfaceInit(TESTER_SwitchStartTypeDef *swstart, TESTER_LEDsTypeDef *leds);
/* Включить индикацию прямого подключения диода */
void TESTER_LED_TestingDiode_Positive(TESTER_LEDTypeDef *led);
/* Включить индикацию обратного подключения диода */
void TESTER_LED_TestingDiode_Negative(TESTER_LEDTypeDef *led);
/* Выключить индикацию активного теста диодов */
void TESTER_LED_TestingDiode_End(TESTER_LEDTypeDef *led);
/* Считать состоянии кнопки запуска */
uint8_t TESTER_ReadSwichStart(TESTER_SwitchStartTypeDef *swstart);
/* Включить светодиод */
void TESTER_LED_On(TESTER_LEDTypeDef *led);
/* Выключить светодиод */
void TESTER_LED_Off(TESTER_LEDTypeDef *led);
/* Моргание светодиодом */
void TESTER_LED_Blink(TESTER_LEDTypeDef *led);
#endif //_TESTER_INTERFACE_FUNC_H_

View File

@@ -1,7 +1,7 @@
#include "tester_main.h"
TESTER_ProjectTypeDef TESTER;
TESTER_ProjectTypeDef TESTER = {0};
/**s
@@ -9,12 +9,17 @@ TESTER_ProjectTypeDef TESTER;
*/
void TESTER_Init(TESTER_ProjectTypeDef *tester)
{
TESTER_InterfaceInit(&tester->SwStart, &tester->leds);
tester->leds.LED1.period = 100;
tester->delay = 250;
tester->delay_en = 0;
tester->func.disable_reset_call = 0;
tester->htest = &hTestDiode;
TESTER_HandleInit(tester->htest);
TESTER_HandleInit(tester->htest, &tester->leds);
tester->f.flag_init_done = 1;
}
@@ -23,6 +28,7 @@ void TESTER_Init(TESTER_ProjectTypeDef *tester)
*/
void TESTER_pre_while(TESTER_ProjectTypeDef *tester)
{
tester->leds.LED1.period = LED_BLINK_AS_ON;
}
@@ -38,30 +44,52 @@ void TESTER_main_while(TESTER_ProjectTypeDef *tester)
/* ТЕСТ В ОБРАТНОМ ВКЛЮЧЕНИИ */
if(tester->func.test_diode_neg)
{
TESTER_TestDiode_NegativePower(tester->htest);
if(tester->func.disable_reset_call == 0)
tester->func.test_diode_neg = 0;
TESTER_TestDiode_NegativePower(tester->htest);
}
/* ТЕСТ В ПРЯМОМ ВКЛЮЧЕНИИ */
if(tester->func.test_diode_pos)
{
TESTER_TestDiode_PositivePower(tester->htest);
if(tester->func.disable_reset_call == 0)
tester->func.test_diode_pos = 0;
TESTER_TestDiode_PositivePower(tester->htest);
}
/* ТЕСТ ПЕРЕХОДА ИЗ ПРЯМОГО В ОБРАТНОЕ ВКЛЮЧЕНИЯ*/
if(tester->func.test_diode_posneg)
{
TESTER_TestDiode_PosNegPower(tester->htest);
if(tester->func.disable_reset_call == 0)
tester->func.test_diode_posneg = 0;
TESTER_TestDiode_PosNegPower(tester->htest);
}
}
/**
* @brief Функция работы интерфейса
*/
void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester)
{
if(tester->f.flag_init_done == 0)
return;
if(TESTER_ReadSwichStart(&tester->SwStart))
{
tester->func.test_diode_posneg = 1;
}
TESTER_LED_Blink(&tester->leds.LED1);
}
/**
* @brief Задеркжка главного цикла
*/

View File

@@ -26,14 +26,28 @@ typedef struct
unsigned disable_reset_call:1;
}function_calls;
/**
* @brief Структура для вызова различных функций
*/
typedef struct
{
unsigned flag_init_done:1;
}TESTER_FlagsTypeDef;
/**
* @brief Структура проекта тестер
*/
typedef struct
{
function_calls func; ///< вызов разных функций
function_calls func; ///< вызов разных функций
TESTER_TestHandleTypeDef *htest; ///< дескриптор тестера
TESTER_TestHandleTypeDef *htest; ///< дескриптор тестера
TESTER_SwitchStartTypeDef SwStart; ///< структура кнопки старта
TESTER_LEDsTypeDef leds; ///< структура светодиодов
TESTER_FlagsTypeDef f;
uint32_t delay; ///< задержка главного цикла
uint32_t delay_en:1; ///< включить задержку в главном цикле
@@ -42,12 +56,14 @@ extern TESTER_ProjectTypeDef TESTER;
/* Протестировать диод */
/* Инициализация всех модулей для работы тестера */
void TESTER_Init(TESTER_ProjectTypeDef *tester);
/* Подключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */
/* Функция подготовки тестера к while(1) */
void TESTER_pre_while(TESTER_ProjectTypeDef *tester);
/* Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */
/* Главная функция работы тестера */
void TESTER_main_while(TESTER_ProjectTypeDef *tester);
/* Функция работы интерфейса */
void TESTER_InterfaceHandle(TESTER_ProjectTypeDef *tester);
/*Задеркжка главного цикла */
void TESTER_main_delay(TESTER_ProjectTypeDef *tester);
#endif //_TESTER_MAIN_H_