Compare commits

...

7 Commits

5 changed files with 72 additions and 30 deletions

View File

@ -94,7 +94,7 @@ typedef struct
uint32_t Sw_Pin; ///< GPIO пин ножки кнопки
uint8_t Sw_ActiveLvl; ///< Активный уровень ножки (при котором кнопка нажата)
uint32_t Sw_PrevState; ///< Предыдущее состояние кнопки
uint32_t Sw_CurrentState; ///< Текущее состояние кнопки
uint32_t Sw_FilterDelay; ///< Фильтр от дребезга (в мс)
uint32_t tickprev;

View File

@ -185,6 +185,55 @@ typedef struct // struct with variables for encoder
@endcode
* @{
*/
/**
* @brief Преобразование частоты в количество тиков таймера.
* @param _freq_ Желаемая частота в Гц.
* @param _timfreqMHz_ Тактовая частота таймера в МГц.
* @return Количество тиков для достижения заданной частоты.
* @details Расчет: (1 000 000 * частотааймера) / желаемаяастота.
*/
#define TIM_FreqToTick(_freq_, _timfreqMHz_) (((1000000*(_timfreqMHz_))/(_freq_))-1)
/**
* @brief Преобразование миллисекунд в количество тиков таймера.
* @param _ms_ Время в миллисекундах.
* @param _timfreqMHz_ Тактовая частота таймера в МГц.
* @return Количество тиков для заданного времени.
* @details Расчет: (мс * 1000 * частотааймера).
*/
#define TIM_MillisToTick(_ms_, _timfreqMHz_) (((uint32_t)((_ms_) * 1000UL * (_timfreqMHz_)))-1)
/**
* @brief Преобразование микросекунд в количество тиков таймера.
* @param _us_ Время в микросекундах.
* @param _timfreqMHz_ Тактовая частота таймера в МГц.
* @return Количество тиков для заданного времени.
* @details Расчет: (мкс * частотааймера).
*/
#define TIM_MicrosToTick(_us_, _timfreqMHz_) (((uint32_t)((_us_) * (_timfreqMHz_)))-1)
/**
* @brief Установка автоперезагрузки (ARR) с принудительным обновлением теневого регистра.
* @param __HANDLE__ Указатель на хендл таймера.
* @param __AUTORELOAD__ Значение автоперезагрузки.
* @details Генерирует событие обновления для немедленного применения нового значения ARR.
* Решает проблему обновления теневых регистров только при переполнении.
*/
#define __HAL_TIM_SET_AUTORELOAD_FORCE(__HANDLE__, __AUTORELOAD__) \
do{ __HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__); \
HAL_TIM_GenerateEvent(__HANDLE__, TIM_EVENTSOURCE_UPDATE); } while(0);
/**
* @brief Установка предделителя (PSC) с принудительным обновлением теневого регистра.
* @param __HANDLE__ Указатель на хендл таймера.
* @param __PRESC__ Значение предделителя.
* @details Генерирует событие обновления для немедленного применения нового значения PSC.
* Решает проблему обновления теневых регистров только при переполнении.
*/
#define __HAL_TIM_SET_PRESCALER_FORCE(__HANDLE__, __PRESC__) \
do{ __HAL_TIM_SET_PRESCALER(__HANDLE__, __PRESC__); \
HAL_TIM_GenerateEvent(__HANDLE__, TIM_EVENTSOURCE_UPDATE); } while(0);
/* Initialize TIM with TIM_SettingsTypeDef structure */
HAL_StatusTypeDef TIM_Base_Init(TIM_SettingsTypeDef* stim);
/* Initialize TIMs clock and interrupt */

View File

@ -5,7 +5,7 @@ STM32_General - это набор библиотек для удобной ра
## Структура библиотеки
*Note: STM32_General требует наличия библиотеки (MyLibs)[https://git.arktika.cyou/Razvalyaev/STM32_ExtendedLibs] для работы***
*Note: STM32_General требует наличия библиотеки [MyLibs](https://git.arktika.cyou/Razvalyaev/STM32_ExtendedLibs) для работы*
```
ProjectRoot/
└── STM32_General # Работа с периферией STM32

View File

@ -1,4 +1,6 @@
#include "__general_flash.h"
#if 0
FLASH_EraseInitTypeDef EraseInitStruct;
extern HAL_StatusTypeDef res_hal;
unsigned CRC_Update;
@ -190,3 +192,4 @@ HAL_StatusTypeDef FLASH_Write_Word(uint32_t Address, uint32_t Data)
}
//----------------------------------------------------------
#endif

View File

@ -280,47 +280,37 @@ int GPIO_Read_Switch(GPIO_SwitchTypeDef *sw)
if(check_null_ptr_3(sw, sw->Sw_Port, sw->Sw_Pin))
return -1;
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
int current_level = (HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl);
if(sw->Sw_FilterDelay) // если включена защита от дребезга
{
sw->Sw_PrevState = 1;
if(sw->Sw_FilterDelay) // если включена защита от дребезга
// Если таймер не запущен и состояние изменилось - запускаем таймер
if(sw->tickprev == 0 && current_level != sw->Sw_CurrentState)
{
if(sw->tickprev == 0)
sw->tickprev = local_time();
sw->tickprev = local_time();
}
// Если таймер запущен
if(sw->tickprev != 0)
{
// Проверяем, прошел ли достаточный интервал для фильтрации
if((local_time() - sw->tickprev) >= sw->Sw_FilterDelay)
{
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
// Обновляем состояние только если оно все еще отличается
if(current_level != sw->Sw_CurrentState)
{
return 1;
sw->Sw_CurrentState = current_level;
}
else
{
sw->tickprev = 0;
return 0;
}
}
}
else // если нет защиты от дребезга
{
if(HAL_GPIO_ReadPin(sw->Sw_Port, sw->Sw_Pin) == sw->Sw_ActiveLvl)
{
return 1;
}
else
{
// Останавливаем таймер в любом случае
sw->tickprev = 0;
return 0;
}
}
}
else
else // если нет защиты от дребезга
{
sw->Sw_PrevState = 0;
sw->Sw_CurrentState = current_level;
}
return 0;
return sw->Sw_CurrentState;
}
//------------------------GPIO SW FUNCTIONS-------------------------
//-------------------------------------------------------------------