diff --git a/diode_tester/Core/Src/gpio.c b/diode_tester/Core/Src/gpio.c index 22e2660..c32177f 100644 --- a/diode_tester/Core/Src/gpio.c +++ b/diode_tester/Core/Src/gpio.c @@ -48,10 +48,14 @@ void MX_GPIO_Init(void) __HAL_RCC_GPIOC_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET); + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_10|GPIO_PIN_11, GPIO_PIN_RESET); + /*Configure GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; @@ -59,6 +63,13 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; 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; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + } /* USER CODE BEGIN 2 */ diff --git a/diode_tester/Core/Tester_main/tester_config.h b/diode_tester/Core/Tester_main/tester_config.h index 9f5ff81..e97c5e0 100644 --- a/diode_tester/Core/Tester_main/tester_config.h +++ b/diode_tester/Core/Tester_main/tester_config.h @@ -11,8 +11,50 @@ #ifndef _TESTER_CONFIG_H_ #define _TESTER_CONFIG_H_ + #define TESTER_PULES_EXPETCED_WIDTH 4 ///< Предполагаемая длительность пика в отчетах ацп +/** + * @addtogroup TESTER_SW_TIMINGS_CONFIG Configs for switching timings + * @ingroup TESTER_CONFIGS + * @brief Конфигурации таймингов для ключей питания + @{ + */ + +/** + * @brief Задержка (миллисекундная) для положительного напряжения ПО УМОЛЧАНИЮ + * @details Пока только миллисекунды, т.к. меньше я пока не реализовал, да и как понимаю не требуется + */ +#define DEF_MS_TIME_FOR_POSITIVE 1000 + +/** + * @brief Задержка перед началом тестирования ПО УМОЛЧАНИЮ + * @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY + */ +#define DEF_TIME_BEFORE_TEST 500 +#define DEF_TIME_BEFORE_TEST_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_TEST по умолчанию + +/** + * @brief Задержка между включением АЦП и предполагаемым скачком напряжения ПО УМОЛЧАНИЮ + * @details Задержка нужна, чтобы точно поймать его в буфере АЦП. + * + * Задержка миллисекундная или тики for() @ref TIME_BEFORE_TEST_MS_DELAY + * @note Но если миллисекундная, то скорее всего скачок не попадет в буфер АЦП. + * Поэтому желательно только тики for() (@ref TIME_BEFORE_PEAK_MS_DELAY = 0) + */ +#define DEF_TIME_BEFORE_PEAK 5 +#define DEF_TIME_BEFORE_PEAK_MS_DELAY 0 ///< включение миллисекундной задержки для @ref TIME_BEFORE_PEAK(0 - задержка for(), 1 - миллисекундная) + +/** + * @brief Задержка перед окончанием тестирования (отключение питания) ПО УМОЛЧАНИЮ + * @details Задержка миллисекундная или тики for() @ref TIME_BEFORE_DISCONNECT_MS_DELAY + */ +#define DEF_TIME_BEFORE_DISCONNECT 50 +#define DEF_TIME_BEFORE_DISCONNECT_MS_DELAY 1 ///< включение миллисекундной задержки для @ref TIME_BEFORE_DISCONNECT (0 - задержка for(), 1 - миллисекундная) + +/** TESTER_SW_TIMINGS_CONFIG + * @} + */ /** * @addtogroup TESTER_POWER_SW_CONFIG Configs for switches for power @@ -20,28 +62,28 @@ * @brief Конфигурации для ключей питания @{ */ +//#define USE_HAL_GPIO_FUNCTIONS ///< Использовать для переключения пинов HAL функции +//#define ALL_SW_USE_SAME_PORT ///< Дефайн указывающий что все пины будут иметь один порт (для ускорения переключения) /* Состояния ключей для подключения и откючения питания */ #define POWER_CONNECT 1 ///< Питание подключено в данном состоянии пина #define POWER_DISCONNECT 0 ///< Питание отключено в данном состоянии пина /* Ключи для подключения положительного питания к диоду */ -#define SWITCH_DC_POSITIVE_1_Port GPIOC ///< Порт пина первого ключа для положительного питания -#define SWITCH_DC_POSITIVE_1_Pin GPIO_PIN_13 ///< Пин первого ключа для положительного питания -#define SWITCH_DC_POSITIVE_2_Port GPIOA ///< Порт пина второго ключа для положительного питания -#define SWITCH_DC_POSITIVE_2_Pin GPIO_PIN_11 ///< Пин второго ключа для положительного питания +#define SWITCH_DC_POSITIVE_Port GPIOB ///< Порт пина первого ключа для земли положительного источника питания +#define SWITCH_DC_POSITIVE_GND_Pin GPIO_PIN_10 ///< Пин первого ключа для земли положительного источника питания +#define SWITCH_DC_POSITIVE_VDD_Pin GPIO_PIN_11 ///< Пин второго ключа для напряжения положительного источника ппитания /* Ключи для подключения отрицательного питания к диоду */ -#define SWITCH_DC_NEGATIVE_1_Port GPIOC ///< Порт пина первого ключа для отрицательного питания -#define SWITCH_DC_NEGATIVE_1_Pin GPIO_PIN_13 ///< Пин первого ключа для отрицательного питания -#define SWITCH_DC_NEGATIVE_2_Port GPIOA ///< Порт пина второго ключа для отрицательного питания -#define SWITCH_DC_NEGATIVE_2_Pin GPIO_PIN_11 ///< Пин первого ключа для отрицательного питания +#define SWITCH_DC_NEGATIVE_Port GPIOB ///< Порт пина первого ключа для земли отрицательного источника ппитания +#define SWITCH_DC_NEGATIVE_GND_Pin GPIO_PIN_0 ///< Пин первого ключа для земли отрицательного источника ппитания +#define SWITCH_DC_NEGATIVE_VDD_Pin GPIO_PIN_1 ///< Пин первого ключа для напряжения отрицательного источника ппитания /** TESTER_POWER_SW_CONFIG * @} */ - + /** * @addtogroup TESTER_ADC_CONFIG Configs for ADC * @ingroup TESTER_CONFIGS diff --git a/diode_tester/Core/Tester_main/tester_func.c b/diode_tester/Core/Tester_main/tester_func.c index e0c1caf..ec25a09 100644 --- a/diode_tester/Core/Tester_main/tester_func.c +++ b/diode_tester/Core/Tester_main/tester_func.c @@ -7,20 +7,35 @@ TESTER_TestHandleTypeDef hTestDiode; */ void TESTER_HandleInit(TESTER_TestHandleTypeDef *htest) { - htest->adc = &tester_adc; - + /* Настройка структуры АЦП */ + htest->adc = &tester_adc; TESTER_ADC_StructInit(htest->adc); - htest->DCNegSw.SW1_Port = SWITCH_DC_NEGATIVE_1_Port; - htest->DCNegSw.SW2_Port = SWITCH_DC_NEGATIVE_2_Port; - htest->DCNegSw.SW1_Pin = SWITCH_DC_NEGATIVE_1_Pin; - htest->DCNegSw.SW2_Pin = SWITCH_DC_NEGATIVE_2_Pin; + /* Настройка пинов для подключения отрицательного источника */ + htest->DCNegSw.SW_Port = SWITCH_DC_NEGATIVE_Port; + htest->DCNegSw.SwGND_Pin = SWITCH_DC_NEGATIVE_GND_Pin; + htest->DCNegSw.SwVDD_Pin = SWITCH_DC_NEGATIVE_VDD_Pin; + + /* Настройка пинов для подключения положительного источника */ + htest->DCPosSw.SW_Port = SWITCH_DC_POSITIVE_Port; + htest->DCPosSw.SwGND_Pin = SWITCH_DC_POSITIVE_GND_Pin; + htest->DCPosSw.SwVDD_Pin = SWITCH_DC_POSITIVE_VDD_Pin; - htest->DCPosSw.SW1_Port = SWITCH_DC_POSITIVE_1_Port; - htest->DCPosSw.SW2_Port = SWITCH_DC_POSITIVE_2_Port; - htest->DCPosSw.SW1_Pin = SWITCH_DC_POSITIVE_1_Pin; - htest->DCPosSw.SW2_Pin = SWITCH_DC_POSITIVE_2_Pin; + /* Настройка таймингов по умолчанию для тестирования */ + htest->SwTimings.msticks_for_positive_dc = DEF_MS_TIME_FOR_POSITIVE; + + htest->SwTimings.ticks_before_disconnect.ticks = DEF_TIME_BEFORE_DISCONNECT; + htest->SwTimings.ticks_before_disconnect.msdelay = DEF_TIME_BEFORE_DISCONNECT_MS_DELAY; + + htest->SwTimings.ticks_before_go_to_peak.ticks = DEF_TIME_BEFORE_PEAK; + htest->SwTimings.ticks_before_go_to_peak.msdelay = DEF_TIME_BEFORE_PEAK_MS_DELAY; + + htest->SwTimings.ticks_before_test.ticks = DEF_TIME_BEFORE_TEST; + htest->SwTimings.ticks_before_test.msdelay = DEF_TIME_BEFORE_TEST_MS_DELAY; + + + htest->continuous_buff_size = 20; } @@ -109,8 +124,7 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest) TESTER_Delay(&htest->SwTimings.ticks_before_go_to_peak); /* Отключение питания от диода */ - TESTER_Disconnect_Power(&htest->DCPosSw); - TESTER_Connect_Power(&htest->DCNegSw); + TESTER_Reconnect_Power(&htest->DCPosSw, &htest->DCNegSw); /* Подключение отрицательного питания на определенное время */ TESTER_Delay(&htest->SwTimings.ticks_before_disconnect); @@ -128,18 +142,62 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest) */ void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw) { - HAL_GPIO_WritePin(DCSw->SW1_Port, DCSw->SW1_Pin, POWER_CONNECT); - HAL_GPIO_WritePin(DCSw->SW2_Port, DCSw->SW2_Pin, POWER_CONNECT); +#ifdef USE_HAL_GPIO_FUNCTIONS // in tester_config.h + HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_CONNECT); +#else // USE_HAL_GPIO_FUNCTIONS + #if (POWER_CONNECT == 1) + DCSw->SW_Port->BSRR = DCSw->SwGND_Pin | DCSw->SwVDD_Pin; + #else //POWER_CONNECT == 1 + DCSw->SW_Port->BSRR = (DCSw->SwGND_Pin | DCSw->SwVDD_Pin) << 16; + #endif //POWER_CONNECT == 1 +#endif //USE_HAL_GPIO_FUNCTIONS } /** * @brief Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw) { - HAL_GPIO_WritePin(DCSw->SW1_Port, DCSw->SW1_Pin, POWER_DISCONNECT); - HAL_GPIO_WritePin(DCSw->SW2_Port, DCSw->SW2_Pin, POWER_DISCONNECT); +#ifdef USE_HAL_GPIO_FUNCTIONS + HAL_GPIO_WritePin(DCSw->SW_Port, DCSw->SwGND_Pin | DCSw->SwVDD_Pin, POWER_DISCONNECT); +#else // USE_HAL_GPIO_FUNCTIONS + #if (POWER_DISCONNECT == 0) + DCSw->SW_Port->BSRR = (DCSw->SwGND_Pin | DCSw->SwVDD_Pin) << 16; + #else //POWER_CONNECT == 1 + DCSw->SW_Port->BSRR = DCSw->SwGND_Pin | DCSw->SwVDD_Pin; + #endif //POWER_CONNECT == 1 +#endif //USE_HAL_GPIO_FUNCTIONS } +/** +* @brief Переключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef + */ +void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwitchTypeDef *DCNegSw) +{ +#ifdef USE_HAL_GPIO_FUNCTIONS + HAL_GPIO_WritePin(DCPosSw->SW_Port, DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin, POWER_DISCONNECT); + HAL_GPIO_WritePin(DCNegSw->SW_Port, DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin, POWER_CONNECT); +#else // USE_HAL_GPIO_FUNCTIONS + #ifdef ALL_SW_USE_SAME_PORT + #if (POWER_CONNECT == 1) && (POWER_DISCONNECT == 0) + DCPosSw->SW_Port->BSRR = ((DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) | ((DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin) << 16)); + #elif (POWER_CONNECT == 1) && (POWER_DISCONNECT == 0) + DCPosSw->SW_Port->BSRR = (((DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) << 16)| (DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin)); + #endif //POWER_CONNECT && POWER_DISCONNECT + #else //ALL_SW_USE_SAME_PORT + #if (POWER_DISCONNECT == 0) + DCPosSw->SW_Port->BSRR = (DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin) << 16; + #else //POWER_DISCONNECT == 1 + DCPosSw->SW_Port->BSRR = DCPosSw->SwGND_Pin | DCPosSw->SwVDD_Pin; + #endif //POWER_DISCONNECT + + #if (POWER_CONNECT == 1) + DCNegSw->SW_Port->BSRR = DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin; + #else //POWER_CONNECT == 0 + DCNegSw->SW_Port->BSRR = (DCNegSw->SwGND_Pin | DCNegSw->SwVDD_Pin) << 16; + #endif //POWER_CONNECT + #endif //ALL_SW_USE_SAME_PORT +#endif //USE_HAL_GPIO_FUNCTIONS +} /** * @brief Формирование задержки (в тиках или миллисекундная) */ diff --git a/diode_tester/Core/Tester_main/tester_func.h b/diode_tester/Core/Tester_main/tester_func.h index 1d00537..6d7e14b 100644 --- a/diode_tester/Core/Tester_main/tester_func.h +++ b/diode_tester/Core/Tester_main/tester_func.h @@ -19,11 +19,9 @@ */ typedef struct { - GPIO_TypeDef *SW1_Port; ///< Порт пина первого ключа для питания - uint32_t SW1_Pin; ///< Пин первого ключа для питания - - GPIO_TypeDef *SW2_Port; ///< Порт пина второго ключа для питания - uint32_t SW2_Pin; ///< Пин второго ключа для питания + GPIO_TypeDef *SW_Port; ///< Порт первого ключа для питания + uint32_t SwGND_Pin; ///< Пин первого ключа для питания + uint32_t SwVDD_Pin; ///< Пин второго ключа для питания }TESTER_PowerSwitchTypeDef; @@ -43,8 +41,8 @@ typedef struct { uint32_t msticks_for_positive_dc; ///< миллисекундная задержка для положительного напряжения @ref TESTER_TestDiode_PositivePower TESTER_TicksDelayTypeDef ticks_before_test; ///< задержка перед началом тестирования (мс или тики for()) - TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением питания (мс или тики for()) TESTER_TicksDelayTypeDef ticks_before_go_to_peak; ///< задержка между включением АЦП и предполагаемым скачком напряжения, чтобы точно поймать его в буфере АЦП (мс или тики for()) + TESTER_TicksDelayTypeDef ticks_before_disconnect; ///< задержка перед выключением питания (мс или тики for()) }TESTER_SwitchTimingsTypeDef; /** @@ -81,6 +79,8 @@ void TESTER_TestDiode_PosNegPower(TESTER_TestHandleTypeDef *htest); void TESTER_Connect_Power(TESTER_PowerSwitchTypeDef *DCSw); /* Отключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ void TESTER_Disconnect_Power(TESTER_PowerSwitchTypeDef *DCSw); +/* Переключить питание с помощью ключей (пинов) в TESTER_PowerSwitchTypeDef */ +void TESTER_Reconnect_Power(TESTER_PowerSwitchTypeDef *DCPosSw, TESTER_PowerSwitchTypeDef *DCNegSw); /* Формирование задержки перед подключением питания (в тиках или миллисекундная) */ void TESTER_Delay(TESTER_TicksDelayTypeDef *tickdelay); #endif //_TESTER_FUNC_H_ diff --git a/diode_tester/Core/Tester_main/tester_main.c b/diode_tester/Core/Tester_main/tester_main.c index bbfaa31..ee35793 100644 --- a/diode_tester/Core/Tester_main/tester_main.c +++ b/diode_tester/Core/Tester_main/tester_main.c @@ -10,9 +10,9 @@ TESTER_ProjectTypeDef TESTER; void TESTER_Init(TESTER_ProjectTypeDef *tester) { tester->delay = 250; - tester->delay_en = 1; + tester->delay_en = 0; - tester->func.disable_reset_call = 1; + tester->func.disable_reset_call = 0; tester->htest = &hTestDiode; TESTER_HandleInit(tester->htest); } diff --git a/diode_tester/diode_tester.ioc b/diode_tester/diode_tester.ioc index 0562454..cb8431c 100644 --- a/diode_tester/diode_tester.ioc +++ b/diode_tester/diode_tester.ioc @@ -39,16 +39,20 @@ Mcu.Name=STM32F103C(4-6)Tx Mcu.Package=LQFP48 Mcu.Pin0=PC13-TAMPER-RTC Mcu.Pin1=PD0-OSC_IN -Mcu.Pin10=VP_TIM3_VS_ClockSourceINT +Mcu.Pin10=PA13 +Mcu.Pin11=PA14 +Mcu.Pin12=VP_SYS_VS_Systick +Mcu.Pin13=VP_TIM2_VS_ClockSourceINT +Mcu.Pin14=VP_TIM3_VS_ClockSourceINT Mcu.Pin2=PD1-OSC_OUT Mcu.Pin3=PA0-WKUP -Mcu.Pin4=PA9 -Mcu.Pin5=PA10 -Mcu.Pin6=PA13 -Mcu.Pin7=PA14 -Mcu.Pin8=VP_SYS_VS_Systick -Mcu.Pin9=VP_TIM2_VS_ClockSourceINT -Mcu.PinsNb=11 +Mcu.Pin4=PB0 +Mcu.Pin5=PB1 +Mcu.Pin6=PB10 +Mcu.Pin7=PB11 +Mcu.Pin8=PA9 +Mcu.Pin9=PA10 +Mcu.PinsNb=15 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F103C6Tx @@ -78,6 +82,14 @@ PA14.Mode=Serial_Wire PA14.Signal=SYS_JTCK-SWCLK PA9.Mode=Asynchronous PA9.Signal=USART1_TX +PB0.Locked=true +PB0.Signal=GPIO_Output +PB1.Locked=true +PB1.Signal=GPIO_Output +PB10.Locked=true +PB10.Signal=GPIO_Output +PB11.Locked=true +PB11.Signal=GPIO_Output PC13-TAMPER-RTC.Locked=true PC13-TAMPER-RTC.Signal=GPIO_Output PD0-OSC_IN.Mode=HSE-External-Oscillator diff --git a/docs/SW Timings with HAL GPIO write.sal b/docs/SW Timings with HAL GPIO write.sal new file mode 100644 index 0000000..7449d8a Binary files /dev/null and b/docs/SW Timings with HAL GPIO write.sal differ diff --git a/docs/SW Timings without HAL GPIO write 2.sal b/docs/SW Timings without HAL GPIO write 2.sal new file mode 100644 index 0000000..265706f Binary files /dev/null and b/docs/SW Timings without HAL GPIO write 2.sal differ diff --git a/docs/SW Timings without HAL GPIO write and different ports.sal b/docs/SW Timings without HAL GPIO write and different ports.sal new file mode 100644 index 0000000..495cafd Binary files /dev/null and b/docs/SW Timings without HAL GPIO write and different ports.sal differ diff --git a/docs/SW Timings without HAL GPIO write.sal b/docs/SW Timings without HAL GPIO write.sal new file mode 100644 index 0000000..5e91231 Binary files /dev/null and b/docs/SW Timings without HAL GPIO write.sal differ