#include "stm32c0xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"

xTaskHandle  HLO;
xTaskHandle  HLR;
xTaskHandle  Hmode;
xTaskHandle  HBTN1;

uint16_t leds1 = GPIO_PIN_1;
uint16_t leds2 = GPIO_PIN_2;
uint16_t btn = GPIO_PIN_12;

uint16_t toggleDelay = 1000; // Початкова затримка
uint8_t btnPressCount = 0;   // Лічильник натискань кнопки

// оголошення функцій завдань
void tled(void* p);
void gestion(void * p);
void sButton(void * p);
void switchMode(void * p);

int main(void)
{
  HAL_Init();

  SystemClock_Config();

  MX_GPIO_Init();

   // створюємо завдання    
   xTaskCreate(sButton, "Start Button", 128, &btn, 1, &HBTN1);
 
  osKernelStart();
  
  vTaskStartScheduler();

  while (1)
  {
    // Ваш основний код
  }
}

void sButton(void* p){
  uint16_t broche;
  broche = *((uint16_t*) p);  

  while(1) {
    if (HAL_GPIO_ReadPin(GPIOA, broche) == GPIO_PIN_SET) {  // Кнопка натиснута
      btnPressCount++; // Збільшуємо лічильник натискань
      if (btnPressCount == 1 ||btnPressCount > 1  ) { // Якщо натиснуто 1 раз
        if (toggleDelay > 100) { // Перевіряємо, чи не досягнули мінімальної затримки
          toggleDelay -= 100; // Зменшуємо затримку на 100 мс
          // Виводимо відповідний коментар
          printf("Швидкість мигання збільшена. Затримка: %d мс\n", toggleDelay);
        }
      }
      else{}
      
            xTaskCreate(tled, "tledO", 128, &leds1, 1, &HLO);
            HAL_Delay(1000);
            xTaskCreate(tled, "tledR", 128, &leds2, 1, &HLR);
            HAL_Delay(1000);
            xTaskCreate(gestion, "Mode", 128, NULL, 1, &Hmode); 

    }
    vTaskDelay(100); // Чекаємо 100 мс перед перевіркою знову
  }
}

void tled(void* p) {
  uint16_t broche;
  broche = *((uint16_t*) p);  
   
  while(1) {
    HAL_GPIO_TogglePin(GPIOA, broche);
    HAL_GPIO_TogglePin(GPIOB, broche);
    HAL_Delay(toggleDelay);
  }
}


void gestion(void * p) {
  uint8_t cheak = 1;
  while(1) {
    if(cheak){
    vTaskDelay(3000);
		vTaskSuspend(HLO);
		vTaskDelay(3000);
		vTaskResume(HLO);
    vTaskDelay(3000);
    cheak =! cheak;
    }
    else{
    vTaskDelay(3000);
		vTaskSuspend(HLR);
		vTaskDelay(3000);
		vTaskResume(HLR);
    vTaskDelay(3000);
    cheak =! cheak;
    }
		HAL_Delay(5000);
		}
  }



void MX_GPIO_Init(void) {
  /* Включення тактового сигналу для портів GPIO */
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* Налаштовуємо піни GPIOA */
  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* Налаштовуємо піни GPIOB */
  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2;
  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);

  // Кнопка користувача
  GPIO_InitStruct.Pin = GPIO_PIN_12;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void SystemClock_Config(void) {
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
    // Обробляємо помилку відповідно
  }

  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
    // Обробляємо помилку відповідно
  }
}


// Функція зменшення швидкості FreeRTOS
void vApplicationIdleHook(void) {
  // Функція зменшення швидкості FreeRTOS
}
Loading
st-nucleo-c031c6