#include "stm32c0xx_hal.h"
#include "FreeRTOS.h"
#include "task.h"
// Дескриптор задачи (Task Handle) (указатель на структуру данных)
xTaskHandle displayTaskHandle;
const uint16_t segmentNumberPatterns[10] = {
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_15 | GPIO_PIN_7, // 0
GPIO_PIN_8 | GPIO_PIN_12, // 1
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_6 | GPIO_PIN_10 | GPIO_PIN_15, // 2
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_6 | GPIO_PIN_12 | GPIO_PIN_10, // 3
GPIO_PIN_6 | GPIO_PIN_8 | GPIO_PIN_12 | GPIO_PIN_7, // 4
GPIO_PIN_9 | GPIO_PIN_6 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_7, // 5
GPIO_PIN_9 | GPIO_PIN_6 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_15 | GPIO_PIN_7, // 6
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_12, // 7
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_15 | GPIO_PIN_7 | GPIO_PIN_6, // 8
GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_7 | GPIO_PIN_6 // 9
};
const uint16_t ledPins[7] = {
GPIO_PIN_14, // LED 1
GPIO_PIN_13, // LED 2
GPIO_PIN_0, // LED 3
GPIO_PIN_1, // LED 4
GPIO_PIN_4, // LED 5
GPIO_PIN_11, // LED 6
GPIO_PIN_2 // LED 7
};
void DisplayTask(void *pvParameters) {
int number = 1;
while (1) {
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9 | GPIO_PIN_8 | GPIO_PIN_12 | GPIO_PIN_10 | GPIO_PIN_15 | GPIO_PIN_7 | GPIO_PIN_6, GPIO_PIN_RESET); // Clear all segments
HAL_GPIO_WritePin(GPIOA, segmentNumberPatterns[number], GPIO_PIN_SET); // Set the correct segments
for (int i = 0; i < 7; i++) {
HAL_GPIO_WritePin(GPIOA, ledPins[i], GPIO_PIN_RESET);
}
if (number <= 7) { // Ensure we only address LEDs we have
HAL_GPIO_WritePin(GPIOA, ledPins[number - 1], GPIO_PIN_SET);
}
number = number % 7 + 1;
// Delay for 1 second
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
xTaskCreate(DisplayTask, "DisplayTask", 128, NULL, 1, &displayTaskHandle);
// Start the FreeRTOS scheduler
osKernelStart();
vTaskStartScheduler();
while (1) {
}
}
void MX_GPIO_Init(void)
{
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// GPIO pins for the seven-segment display
GPIO_InitStruct.Pin = GPIO_PIN_6 | // G
GPIO_PIN_7 | // F
GPIO_PIN_9 | // A
GPIO_PIN_8 | // B
GPIO_PIN_15 | // E
GPIO_PIN_10 | // D
GPIO_PIN_12; // C
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);
// GPIO pins for the LEDs
GPIO_InitStruct.Pin = GPIO_PIN_14 | // LED 1
GPIO_PIN_13 | // LED 2
GPIO_PIN_0 | // LED 3
GPIO_PIN_1 | // LED 4
GPIO_PIN_4 | // LED 5
GPIO_PIN_11 | // LED 6
GPIO_PIN_2; // LED 7
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)
{
// 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
}