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)