From 5ad51f0d61bda9ec36c2020400c27645c27d2043 Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Thu, 5 Feb 2026 17:30:27 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=20LED=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D1=80=D0=B5=D0=B6=D0=B8=D0=BC=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=B6=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=BE?= =?UTF-8?q?=D0=B9=20=D1=8F=D1=80=D0=BA=D0=BE=D1=81=D1=82=D0=B8=20=D0=B4?= =?UTF-8?q?=D0=B8=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Inc/general_gpio.h | 8 ++++++-- Src/general_gpio.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/Inc/general_gpio.h b/Inc/general_gpio.h index 553af0f..0b9bc0a 100644 --- a/Inc/general_gpio.h +++ b/Inc/general_gpio.h @@ -63,8 +63,9 @@ typedef enum { LED_IS_OFF = 0, ///< Светодиод выключен LED_IS_ON = 1, ///< Светодиод включен - LED_IS_BLINKING = 2, ///< Моргание светодиодом - LED_IS_FADING = 3, ///< Плавное моргание светодиодом + LED_IS_DUTY = 2, ///< Светодиод включен на частичную яркость + LED_IS_BLINKING = 3, ///< Моргание светодиодом + LED_IS_FADING = 4, ///< Плавное моргание светодиодом }GPIO_LEDStateTypeDef; /** @@ -80,6 +81,7 @@ typedef struct uint8_t LED_ActiveLvl; ///< Активный уровень ножки (при котором светодиод горит) uint32_t LED_Period; ///< Период моргания светодиода + uint32_t LED_Duty; ///< Текущая яркость светодиода uint32_t tickprev; }GPIO_LEDTypeDef; @@ -192,6 +194,8 @@ HAL_StatusTypeDef GPIO_LED_On (GPIO_LEDTypeDef *led); HAL_StatusTypeDef GPIO_LED_Off (GPIO_LEDTypeDef *led); /* Выставить светодиод по переменной */ HAL_StatusTypeDef GPIO_LED_Set (GPIO_LEDTypeDef *led, uint8_t led_state); +/* Выставить яркость светодиод */ +HAL_StatusTypeDef GPIO_LED_Duty_Set(GPIO_LEDTypeDef *led, uint8_t led_duty); /* Активировать моргание светодиодом */ HAL_StatusTypeDef GPIO_LED_Blink_Start (GPIO_LEDTypeDef *led, uint32_t period); /* Активировать моргание светодиодом */ diff --git a/Src/general_gpio.c b/Src/general_gpio.c index a0a6a00..cb075b4 100644 --- a/Src/general_gpio.c +++ b/Src/general_gpio.c @@ -136,6 +136,23 @@ HAL_StatusTypeDef GPIO_LED_Set(GPIO_LEDTypeDef *led, uint8_t led_state) return GPIO_LED_Off(led); } } +/** + * @brief Выставить яркость светодиод + * @param led Указатель на структуру светодиода + * @param led_duty Яркость светодиода + * @return HAL Status + */ +HAL_StatusTypeDef GPIO_LED_Duty_Set(GPIO_LEDTypeDef *led, uint8_t led_duty) +{ + if(check_null_ptr_3(led, led->LED_Port, led->LED_Pin)) + return HAL_ERROR; + + led_duty = (led_duty*LED_PWM_TICKS)/100; + led->state = LED_IS_DUTY; + led->LED_Duty = led_duty; + + return HAL_OK; +} /** * @brief Активировать моргание светодиодом * @param led Указатель на структуру светодиода @@ -199,6 +216,21 @@ void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led) led->tickprev = tickcurrent; } } + /* Режим промежуточной яркости светодиода */ + else if(led->state == LED_IS_DUTY) + { + uint32_t tickcurrent = local_time(); + /* Формирование ШИМ для яркости */ + int duty_crt = (led->LED_Duty*led->LED_Duty/LED_PWM_TICKS); + if(tickcurrent%LED_PWM_TICKS < duty_crt) + { + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, led->LED_ActiveLvl); + } + else + { + HAL_GPIO_WritePin(led->LED_Port, led->LED_Pin, !led->LED_ActiveLvl); + } + } /* Режим плавного моргания светодиода */ else if(led->state == LED_IS_FADING) { @@ -229,6 +261,7 @@ void GPIO_LED_Dynamic_Handle(GPIO_LEDTypeDef *led) } led->tickprev = tickcurrent; } + led->LED_Duty = duty; /* Формирование ШИМ для изменения яркости */ int duty_crt = (duty*duty/LED_PWM_TICKS); if(tickcurrent%LED_PWM_TICKS < duty_crt)