#include "stm32c0xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
// Дескриптор задачи (Task Handle) (указатель на структуру данных)
xTaskHandle HledSequence;
xTaskHandle HrgbLed;
uint16_t ledR = GPIO_PIN_5;
uint16_t ledG = GPIO_PIN_6;
uint16_t ledB = GPIO_PIN_7;
uint16_t ledOr = GPIO_PIN_1;
uint16_t ledGr = GPIO_PIN_4;
uint16_t ledBl = GPIO_PIN_0;
uint16_t ledRd = GPIO_PIN_11;
void ledSequence(void *p) {
while (1) {
// Включаем синий
HAL_GPIO_WritePin(GPIOA, ledBl, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Включаем оранжевый
HAL_GPIO_WritePin(GPIOA, ledOr, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Включаем зеленый
HAL_GPIO_WritePin(GPIOA, ledGr, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Включаем красный
HAL_GPIO_WritePin(GPIOA, ledRd, GPIO_PIN_SET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Выключаем красный
HAL_GPIO_WritePin(GPIOA, ledRd, GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Выключаем зеленый
HAL_GPIO_WritePin(GPIOA, ledGr, GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Оставляем только синий
HAL_GPIO_WritePin(GPIOA, ledOr, GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(1000));
// Выключаем все
HAL_GPIO_WritePin(GPIOA, ledBl, GPIO_PIN_RESET);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void rgbLedController(void *p) {
uint16_t currentColor = 0; // 0-6 различные цвета
while (1) {
switch (currentColor) {
case 0: // Красный
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_RESET);
break;
case 1: // Зеленый
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_RESET);
break;
case 2: // Синий
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_SET);
break;
case 3: // Желтый (красный + зеленый)
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_RESET);
break;
case 4: // Пурпурный (красный + синий)
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_SET);
break;
case 5: // Циан (зеленый + синий)
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_SET);
break;
case 6: // Белый (красный + зеленый + синий)
HAL_GPIO_WritePin(GPIOA, ledR, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledG, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, ledB, GPIO_PIN_SET);
break;
}
// Переключение цвета
currentColor = (currentColor + 1) % 7;
// Проверка и вывод текущего приоритета задачи
UBaseType_t priority = uxTaskPriorityGet(NULL); // NULL вернет приоритет текущей задачи
printf("Current Task Priority: %lu\n", priority);
// Задержка на 1000 мс
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
// создаем задачи
xTaskCreate(ledSequence, "LED Sequence", 128, NULL, 1, &HledSequence);
xTaskCreate(rgbLedController, "RGB LED Controller", 128, NULL, 1, &HrgbLed);
//запускаем ядро операционной системы FreeRTOS
osKernelStart();
// запускаем планировщик задач FreeRTOS
vTaskStartScheduler();
while (1)
{
// Votre code principal
}
}
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pins : PA0, PA1, PA4, PA11, PA5, PA6, PA7 */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_11 | ledR | ledG | ledB;
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);
/*Configure GPIO pin : PB1 */
GPIO_InitStruct.Pin = 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(GPIOB, &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)
{
// Gérer l'erreur de manière appropriée
}
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)
{
// Gérer l'erreur de manière appropriée
}
}
// Fonction de ralentissement de FreeRTOS
void vApplicationIdleHook(void)
{
// Fonction de ralentissement de FreeRTOS
}